本文的内容,均来自慕课网视频(springMVC拦截器)
拦截器的实现步骤 :
1、编写拦截器类,实现HandlerInterceptor接口。
2、将拦截器注册进springMVC框架。
3、配置拦截器的拦截规则。
拦截器使用场景 :
使用原则 : 处理所有请求的共性问题
1、解决乱码。
2、解决权限验证问题。
拦截器和过滤器的区别 :
过滤器Filter依赖于Servlet容器,基于回调函数,过滤范围大(可过滤资源(js、css、图片等))。
拦截器Interceptor依赖于框架容器,基于反射机制,只过滤请求。
此处我们简单介绍下拦截器的使用:
1、编写拦截器类
1 package com.hgs.interceptor; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 import org.springframework.web.servlet.HandlerInterceptor; 6 import org.springframework.web.servlet.ModelAndView; 7 public class MyInterceptor implements HandlerInterceptor { 8 9 /** 10 * 该方法不常用 11 */ 12 @Override 13 public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) 14 throws Exception { 15 16 } 17 18 /** 19 * 该方法可用于请求完成后记录日志等。 20 * ModelAndView arg3 : 通过该参数,可以修改目标对象返回的视图以及数据 21 */ 22 @Override 23 public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) 24 throws Exception { 25 // 修改目标对象返回的数据 26 arg3.addObject("msg", "这里传回的是被拦截器修改之后的消息!!"); 27 //修改目标对象返回的视图名称 28 arg3.setViewName("/hello.jsp"); 29 } 30 31 /** 32 * 对请求进行预处理 33 * 返回值 : 表示我们是否需要将当前请求拦截下来 34 * 如果返回false ,请求将被终止 35 * 如果返回true , 请求将会继续运行 36 * Object arg2 : 表示的是被拦截的请求的目标对象(controller) 37 */ 38 @Override 39 public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { 40 // 设置请求编码为:UTF-8 41 arg0.setCharacterEncoding("UTF-8"); 42 43 //对用户是否登录进行判断 44 if(arg0.getSession().getAttribute("user") == null) { 45 //如果用户没有登录,则终止请求,并发送到登录界面 46 arg0.getRequestDispatcher("/login.jsp").forward(arg0, arg1); 47 //终止请求 48 return false; 49 } 50 return true; 51 } 52 53 }
拦截器方法介绍 :
1、afterCompletion : 在请求结束之后执行,一般很少有。
2、postHandle : 在请求被目标对象处理后调用(可修改目标对象返回的视图和数据)。
3、preHandle : 在请求被目标对象处理前调用。
2、在springMVC的xml配置文件中,将拦截器配置进springMVC框架,并配置拦截规则。
<mvc:interceptors> <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 --> <!-- <bean class="com.hgs.interceptor.MyInterceptor"/> --> <mvc:interceptor> <mvc:mapping path="/api/user/*"/> <!-- 拦截范围(路径);例如:后台目录 --> <mvc:exclude-mapping path="/api/user/login"/> <!-- 不被拦截范围(路径);例如:后台登录页面 --> <bean class="com.hgs.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
总结 : 拦截器可处理web应用中的请求的一些通用性问题(编码、权限验证等)。
共性问题在拦截器中处理,可减少重复代码,便于维护。
最后附上一张图(多个拦截器同时工作是,方法调用顺序),拦截器方法调用顺序根据配置文件中配置的顺序确定先后: