81.【SpringMVC】(九)

简介: 81.【SpringMVC】

(十五)、SpringMVC拦截器

1.拦截器概述

SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能(屏蔽骂人)。

过滤器与拦截器的区别:拦截器是AOP思想的具体应用。

过滤器

  • servlet规范中的一部分,任何java web工程都可以使用
  • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

  1. 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
  2. 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的

2.SpringMVC拦截器和Struts拦截器区别

  1. 从拦截级别上来说,SpringMVC是方法级别的拦截,而structs2是类级别的拦截
  2. 数据独立性: SpringMVC方法独立,独享request和respone
  3. 拦截机制: SpringMVC 用的是aop方式,Structs2 有自己的interoptor机制 所以structs2的配置文件要大于SpringMVC

3.自定义拦截器

想要自定义拦截器,必须实现 HandlerInterceptor 接口

4.搭配环境(web springmvc applicationcontext)

spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
">
<!--四个-->
<!-- 1.注解驱动   -->
    <mvc:annotation-driven/>
<!-- 2.静态资源过滤器   -->
    <mvc:default-servlet-handler/>
<!-- 3.扫描包   -->
    <context:component-scan base-package="com.jsxs.controller"/>
<!-- 4.视图解析器   -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

applicationcontext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <import resource="classpath:springmvc-controller.xml"/>
</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
<!--    1.配置前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationcontxt.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
<!--    2.配置过滤器-->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

5.进行测试搭配环境是否合格

package com.jsxs.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
    @RequestMapping("/a1")
    public String test(){
        System.out.println("拦截器被执行!!!");
        return "hello!!";
    }
}

6.开始编写拦截器类(继承HandlerInterceptor)

MyInterceptor.java

return true; 执行下一个拦截器,放行。 return false; 拦截不放行

package com.jsxs.config;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
//    return true; 执行下一个拦截器,放行
//    return false; 拦截不放行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("*******处理前*******");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("*******处理后*******");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("*******清理*******");
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

7.在springmvc中配置拦截器信息

/ 代表只过滤当前一个请求, /** 包括这个请求下面的所有请求

<!-- 5.拦截器配置   -->
    <mvc:interceptors>
        <mvc:interceptor>
<!--    / 代表只过滤当前一个请求,
        /** 包括这个请求下面的所有请求
        eg: /admin/** ====> admin下面的所有信息都会被请求
-->
            <mvc:mapping path="/**"/>
            <bean class="com.jsxs.config.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
">
<!--四个-->
<!-- 1.注解驱动   -->
    <mvc:annotation-driven/>
<!-- 2.静态资源过滤器   -->
    <mvc:default-servlet-handler/>
<!-- 3.扫描包   -->
    <context:component-scan base-package="com.jsxs.controller"/>
<!-- 4.视图解析器   -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
<!-- 5.拦截器配置   -->
    <mvc:interceptors>
        <mvc:interceptor>
<!--    / 代表只过滤当前一个请求,
        /** 包括这个请求下面的所有请求
        eg: /admin/** ====> admin下面的所有信息都会被请求
-->
            <mvc:mapping path="/**"/>
            <bean class="com.jsxs.config.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

8.进行操作

package com.jsxs.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
    @RequestMapping("/a1")
    public String test(){
        System.out.println("拦截器被执行!!!");
        return "hello!!";
    }
}

9.解析拦截器返回值true 和 false

(十六)、SpringMVC拦截器实操

我们的实验目的是:我们在index页面设置两个超链接。①一个是通过超链接直接连接到我们登入页面,②另外一个超链接是直接链接到我们的首页。(是通过连接到方法,然后方法进行转发的操作)。然后我们进行如下操作,假如说我们没有进行登入的话,点击超链接②,拦截器会进行拦截然后让他跳转到登入页面,假如说我们已经登入了一个账号,那么我们点击超链接②页面就会跳转到首页

1.创建业务视觉端

index.xml

布置两个超链接,这两个超链接我们分别跳转登入页面和首页

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <div style="text-align: center">
    <a href="${pageContext.request.contextPath}/User/ln">点击进入登入页面</a>
  </div>
  <div style="font-family: 楷体">
    <a href="${pageContext.request.contextPath}/User/main">点击进入首页</a>
  </div>
  </body>
</html>

main.jsp

展示首页信息

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登入页面</title>
</head>
<body>
<h1 style="text-align: center;color: burlywood">首页</h1>
</body>
</html>

login.jsp

登入信息,设置一个表单,表单提交的路径是首页路径。在WEB-INF下面的所有页面或则资源,只能通过controller,或则servlet进行访问

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登入页面</title>
</head>
<body>
<%--在WEB-INF下面的所有页面或则资源,只能通过controller,或则servlet进行访问--%>
<h1 style="text-align: center;color: red;font-family: 楷体">登入页面</h1>
<form action="${pageContext.request.contextPath}/User/sd" method="get">
    用户名 : <input type="text" name="username">
    密码 : <input type="text" name="password">
    <input type="submit" value="登入">
</form>
</body>
</html>

2.编写controller层的数据

登入页面路径是:/User/ln ; 首页路径是: /User/main ; 表单提交的路径是:/User/sd。在这里我们会进行表格的提交验证,并且利用session进行存值的操作;并且验证密码和账户是否正确,假如账户和密码正确那么我们就对其跳转到首页面,如果不正确我们让他继续转发到登入页面

package com.jsxs.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
@Controller
@RequestMapping("/User")
public class LoginController {
//    我们先返回页面
    @RequestMapping("/ln")
    public String login(){
        return "/login";
    }
    @RequestMapping("/sd")
    public String login1(String username, String password, HttpSession session){
//        把用户存到session中
        session.setAttribute("user",username);
        if ("admin".equals(username)&&"121788".equals(password)){
            return "main";
        }
        return "redirect:/User/ln";
    }
//    进入首页
    @RequestMapping("/main")
    public String main(){
        return "main";
    }
}
相关文章
|
8月前
|
Java Spring
|
8月前
|
前端开发 Java 数据处理
|
25天前
|
JSON 前端开发 Java
SpringMVC
SpringMVC
|
9月前
|
前端开发 Java Spring
你真的了解SpringMVC吗?(下)
你真的了解SpringMVC吗?(下)
42 0
|
9月前
|
前端开发 应用服务中间件
SpringMVC2
SpringMVC2
23 0
|
9月前
|
网络架构
SpringMVC3
SpringMVC3
20 0
SpringMVC3
|
9月前
|
前端开发 安全 Java
springMVC
springMVC
48 0
|
10月前
|
存储 前端开发 Java
什么是springMVC-01
什么是springMVC-01
41 0
|
JSON 前端开发 JavaScript
springmvc(一)
springmvc(一)
75 0
springmvc(一)
|
druid Java 关系型数据库
springmvc(二)
springmvc(二)
94 0
springmvc(二)