拦截器

SpringMVC中的Interceptor拦截器是非常重要和相当有用的,它的主要作用是拦截指定
的用户请求,并进行相应的预处理与后处理。其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前”。当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。

拦截器:
1)拦截器是springmvc中的一种,需要实现HandlerInterceptor接口。
2)拦截器和过滤器类似,功能方向侧重点不同。过滤器是用来过滤器请求参数,设置编码字符集等工作。
拦截器是拦截用户的请求,做请求做判断处理的。
3)拦截器是全局的,可以对多个controller做拦截。
一个项目中可以有o个或多个拦截器,他们在一起拦截用户的请求。拦截器常用在:用户登录处理,权限检查,记录日志。
拦截器的使用步骤:
1.定义类实现HandlerInterceptor接口
2.在springmvc配置文件中,声明拦截器,让框架知道拦截器的存在。拦截器的执行时间:
1)在请求处理之前,也就是controller类中的方法执行之前先被拦截。2)在控制器方法执行之后也会执行拦截器。
3)在请求处理完成后也会执行拦截器。

拦截器:看做是多个controller中公用的功能,集中到拦截器统一处理。使用的aop的思想

一个拦截器的例子

1.新建maven web项目
2.加入依赖
3.创建Controller类
4.创建一个普通类,作为拦截器使用
1)实现HandlerInterceptor接口
2)实现接口中的三个方法
5.创建show.jsp
6.创建springmvc的配置文件
1)组件扫描器,扫描@controller注解
2)声明拦截器,并指定拦截的请求uri地址

spring mvc sql注入拦截 关于springmvc拦截器_拦截器


spring mvc sql注入拦截 关于springmvc拦截器_mvc_02

preHandle预处理方法

重要:是整个项目的入口,门户。
当preHandle返回true请求可以被处理。
preHandle返回falsel,请求到此方法就截止。
参数:HttpServletRequest request, 请求
HttpServletResponse response,应答
Object handler 被拦截的控制器对象
返回值boolean
true:请求是通过了拦截器的验证,可以执行处理器方法。
false:请求没有通过拦截器的验证,请求到达拦截器就截止了。
特点:
1.方法在控制器方法(MyController的doSome)之前先执行的
用户的请求首先到达此方法
2.在这个方法中可以获取请求的信息,验证请求是否符合要求。
可以验证用户是否登录,验证用户是否有权限访问某个连接地址(uri)。
如果验证失败,我们可以截断请求,请求不能被处理
如果验证成功,可以放行请求,此时控制器方法才能执行。

spring mvc sql注入拦截 关于springmvc拦截器_spring_03


spring mvc sql注入拦截 关于springmvc拦截器_spring_04

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("拦截器的MyIntercepter的preHandle");
    return true;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("拦截器的MyIntercepter的preHandle");
    request.getRequestDispatcher("/WEB-INF/jsp/tips.jsp").forward(request,response);
    return false;
}

spring mvc sql注入拦截 关于springmvc拦截器_mvc_05

spring mvc sql注入拦截 关于springmvc拦截器_拦截器_06

postHandle:后处理方法。参数:
object handler : 被拦截的处理器对象MycontrollerModelAndview mv:处理器方法的返回值
特点∶
1.在处理器方法之后执行的(Mycontroller.dosome() )
2.能够获取到处理器方法的返回值ModelAndview,可以修改ModelAndview中的数据和视图,可以影响到最后的执行结果。
·
3.主要是对原来的执行结果做二次修正,

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器的MyIntercepter的preHandle");
//        request.getRequestDispatcher("/WEB-INF/jsp/tips.jsp").forward(request,response);
        return true;
    }


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

        System.out.println("拦截器的MyIntercepter的postHandle");
        //对原来的doSome执行结果,需要调整
        if (modelAndView!=null){
            modelAndView.addObject("mydate",new Date());
            modelAndView.setViewName("other");
        }
    }

新建other.jsp

<%--
  Created by IntelliJ IDEA.
  User: Hou
  Date: 2021/8/25
  Time: 17:13
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  <h3>/WEB-INF/jsp/show.jsp从request作用域获取数据</h3>
  <h3>myname数据:${myname}</h3>
  <h3>myage数据:${myage}</h3>
  <h3>拦截器中增加的数据:${mydate}</h3>
</body>
</html>

spring mvc sql注入拦截 关于springmvc拦截器_spring_07

aftercompletion:最后执行的方法参数
object handler:被拦截器的处理器对象Exception ex:程序中发生的异常
特点:
1.在请求处理完成后执行的。框架中规定是当你的视图处理完成后,对视图执行了forwand。就认为请求处理完成。2.一般做资源回收工作的,程序请求过程中创建了一些对象,在这里可以删除,把占用的内存回收。

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}

spring mvc sql注入拦截 关于springmvc拦截器_spring mvc sql注入拦截_08

spring mvc sql注入拦截 关于springmvc拦截器_spring mvc sql注入拦截_09

计算三个方法的总时间:

spring mvc sql注入拦截 关于springmvc拦截器_拦截器_10


spring mvc sql注入拦截 关于springmvc拦截器_拦截器_11


只有第一次比较长 650
后来越来越快

springmvc.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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--springmvc的配置文件 声明Controller和其他web相关的内容-->
    <!--配置文件扫描器-->
    <context:component-scan base-package="com.hjs.controller"/>

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--声明拦截器:拦截器可以有0或多个-->
    <mvc:interceptors>
        <!--声明第一个拦截器-->
        <mvc:interceptor>
            <!--指定拦截的请求uri地址
                path:就是uri地址,可以使用通配符 **
                   **:表示任意的字符,文件或者多级目录和目录中的文件
                   http://localhost:8080/myweb/user/listUser.do

                   http://localhost:8080/myweb/student/listUser.do
            -->
            <mvc:mapping path="/**"/>
                <!--声明拦截器对象-->
            <bean class="com.hjs.handler.MyIntercepter"/>

        </mvc:interceptor>
    </mvc:interceptors>


    <mvc:annotation-driven />

    <!--注解驱动 ajax 静态资源-->
    <!--
    1.响应ajax请求,返回json
    2.解决静态资源访问问题
    -->


    <mvc:default-servlet-handler />
</beans>

spring mvc sql注入拦截 关于springmvc拦截器_spring_04

拦截器启动顺序

spring mvc sql注入拦截 关于springmvc拦截器_mvc_13


先声明的先执行,后声明的后执行

声明拦截器:
拦截器可以有0或多个在框架中保存多个拦截器是ArrayList ,
按照声明的先后顺序放入到ArrayList

spring mvc sql注入拦截 关于springmvc拦截器_spring_14


spring mvc sql注入拦截 关于springmvc拦截器_拦截器_15

spring mvc sql注入拦截 关于springmvc拦截器_spring mvc sql注入拦截_16

spring mvc sql注入拦截 关于springmvc拦截器_mvc_17

拦截器和过滤器的区别

拦截器和过滤器的区别
1.过滤器是servlet中的对象,拦截器是框架中的对象
2.过滤器实现rilter接口的对象,拦截器是实现HandlerInterceptor
3.过滤器是用来设置request,response的参数,属性的,侧重对数据过滤的。拦截器是用来验证请求的,能截断请求。
4.过滤器是在拦截器之前先执行的。
5.社滤器是tomcat服务器创建的对象
笞器是springmvc容器中创建的对象6.过滤器是一个执行时间点。
笞截器有三个执行时间点
7.过滤器可以处理isp, js, html等等
拦截器是侧重拦截对controller的对象。如果你的请求不能被DispatcherServlet接收,这个请求不会执行拦截器内容8.拦截器拦截普通类方法执行,过滤器过滤servlet请求响应

登录例子

实现步骤:1.新建maven
2.修改web.xml注册中央调度器
3.新建index.jsp发起请求
4.创建MyController处理请求
5.创建结果show.jsp
6.创建一个login.jsp ,模拟登录(把用户的信息放入到session ) ;创建一个jsp , logout.jsp,模拟退出系统(从session中删除数据)
7.创建拦截器,从session中获取用户的登录数据,验证能否访问系统
8.创建一个验证的jsp ,如果验证失败,给出提示
9.创建springmvc配置文件
声明组件扫描器
声明拦截器

login.jsp

spring mvc sql注入拦截 关于springmvc拦截器_拦截器_18


logout.jsp

spring mvc sql注入拦截 关于springmvc拦截器_mvc_19


MyIntercepter.java

访问不匹配时

spring mvc sql注入拦截 关于springmvc拦截器_spring_20

访问匹配时,return true;

spring mvc sql注入拦截 关于springmvc拦截器_spring mvc sql注入拦截_21


tips.jsp

spring mvc sql注入拦截 关于springmvc拦截器_spring mvc sql注入拦截_22