SpringMVC-拦截器
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请求响应