SpringMVC拦截器

本文详细介绍了SpringMVC拦截器的使用,包括HandlerInterceptor接口的preHandle、postHandle和afterCompletion方法的实现及应用场景。在SpringMVC配置中注册拦截器并设置拦截规则,同时探讨了拦截器与过滤器的区别,如执行时机、功能定位等。在处理静态资源问题上,提出了解决方案。
摘要由CSDN通过智能技术生成

SpringMVC拦截器

拦截器的功能

拦截器作用于客户端对服务器发出请求后,对请求的拦截。或是在服务器响应请求后,对功能的一些增强。拦截器可以简单的看作是对控制器方法的抽取,解决掉一些请求中共性的问题。常用于后台权限验证等大多数控制器都需要实现同一需求的情况。

实现一个拦截器

1.实现HandlerInterceptor接口

接口中的三个方法
1).preHandle:

方法参数为:

request–当前的HTTP请求
response–当前的HTTP响应
handler–选择执行的处理程序,用于类型和/或实例评估

用于拦截处理程序的执行。又叫做预处理方法,是最常用的拦截器方法,可以在系统调用控制器方法前执行,返回值为布尔类型,返回真则表示可以继续请求的执行,返回假代表请求到此终止。返回假时Http状态码依然为200.

2).postHandle

方法参数为:

request–当前的HTTP请求
response–当前的HTTP响应
handler –处理程序(或HandlerMethod ),它开始异步执行,用于类型和/或实例检查
modelAndView –处理程序返回的ModelAndView (也可以为null )

在控制器处理请求后执行。用于对控制器方法的增强,可以用ModelAndView对象向结果中添加数据。

3).afterCompletion

方法参数:

request–当前的HTTP请求
response–当前的HTTP响应
handler –处理程序(或HandlerMethod ),它开始异步执行,用于类型和/或实例检查
ex –处理程序执行时抛出的任何异常(如果有); 这不包括通过异常解析器处理的异常

完成请求处理后(即渲染视图之后)的回调。 处理程序执行的任何结果都将被调用,从而可以进行适当的资源清理。且仅当此拦截器的preHandle方法成功完成并返回true才会调用该方法。

接口实现实例:
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("过滤器的preHandle()");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("过滤器的postHandle()");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("过滤器的afterCompletion()");
    }
}

2.在SpringMVC配置文件中注册该拦截器

<bean class="com.lhx.interceptor.MyInterceptor" id = "myInterceptor"/>    
<mvc:interceptors>       
    <mvc:interceptor >
        <!--            指定要拦截的uri地址-->            
        <mvc:mapping path="/**"/>
        <!--            指定谁来处理拦截-->         
        <ref bean="myInterceptor"/>      
    </mvc:interceptor>
</mvc:interceptors>

使用拦截器的一些注意点

多个拦截器时的使用

实际开发中我们会实现许多不同功能的拦截器,当一个请求对应多个拦截器时,经过实际测试,拦截器的优先级是由注册顺序决定的,谁先注册,谁先执行,多个拦截器用于一个请求时,拦截器不同方法执行顺序如下所示:
在这里插入图片描述

拦截静态资源相关问题

在前面的学习中,当中央调度器DispatcherServlet的路径被设为/ 时会有静态资源访问异常的问题,我们一般的处理方法是把所有的静态资源文件放在一个文件夹下,并且用<mvc:resources mapping="/static/**" location="/static/"/>标签去映射该路径。那么同样的,如果我们设置了拦截器,那他会拦截我们的静态资源访问需求吗?

情况A:访问a.html后preHandle方法中执行了请求转发/重定向(a.jsp):

执行结果:
结果页面:a.jsp
在这里插入图片描述

可以看出,拦截器甚至拦截到静态资源的访问。且并未执行控制器中的方法。

情况B:访问a.html后preHandle方法返回值为假:

结果:并未访问到a.html页面。静态资源请求被拦截。

情况C:访问a.html后preHandle方法返回值为真:

结果:成功访问到a.html页面。

拦截静态资源解决方案
1.设置默认的资源处理器<mvc:default-servlet-handler/>
2.在配置拦截器时,设置不拦截的路径:
<mvc:interceptors>        
    <mvc:interceptor >
        <!--            指定要拦截的uri地址-->       
        <mvc:mapping path="/**"/>
        <!--            指定不拦截的路径-->     
        <mvc:exclude-mapping path="/static/**"/>         
        <ref bean="myInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

拦截器与过滤器

拦截器与过滤器的区别

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值