SpringMVC拦截器
2016-11-07 14:49
232 查看
SpringMVC拦截器
拦截器是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强。使用场景:解决请求的共性问题(如:乱码问题、权限验证问题等)。
例如,乱码问题,在form表单中有中文时,可能会出现乱码,可以在
web.xml中配置一个Filter:
<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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
拦截器的工作原理和过滤器非常相似。
拦截器的实现:
1.编写拦截器类是实现HandlerInterceptor接口
2.将拦截器注册进SpringMVC框架中
<!--注册拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/viewAll"/> <bean class="com.springmvc.interceptor.Test1Interceptor"></bean> </mvc:interceptor> </mvc:interceptors>
3.配置拦截器的拦截规则
拦截器方法
1.
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception
返回值:是否需要将当前的请求拦截下来,如果返回
false,请求会被终止。如果返回
true,请求会被继续。
Object arg2表示的是被拦截的请求的目标对象。
2.
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
可以通过ModelAndView参数来改变显示的视图,或修改发往视图的方法。
3.
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
请求结束响应之后,最后调用的方法。
多个拦截器应用
在SpringMVC的配置文件,配置如下的两个拦截器:
<!--注册拦截器 --> <mvc:interceptors> <bean class="com.springmvc.interceptor.Test1Interceptor"></bean> <bean class="com.springmvc.interceptor.Test2Interceptor"></bean> </mvc:interceptors>
运行后,控制台输出的顺序如下:
执行了preHandle1方法... 执行了preHandle2方法... 进入了控制器的viewAll()方法... name=小胖 pwd=123 执行了postHandle2方法... 执行了postHandle1方法... 执行了afterCompletion2方法... 执行了afterCompletion1方法...
执行过程如下:
拦截器的其它实现方式
也可以实现
WebRequestInterceptor接口,向SpringMVC框架注册的写法是不变的。弊端是:
preHandler方法没有返回值,不能终止请求。
public class Test3Interceptor implements WebRequestInterceptor{ @Override public void afterCompletion(WebRequest arg0, Exception arg1) throws Exception { } @Override public void postHandle(WebRequest arg0, ModelMap arg1) throws Exception { } @Override public void preHandle(WebRequest arg0) throws Exception { } }
拦截器的使用场景
1.解决乱码问题
@Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("执行了preHandle1方法..."); arg0.setCharacterEncoding("utf-8"); return true; }
2.解决权限验证问题
@Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("执行了preHandle1方法..."); arg0.setCharacterEncoding("utf-8"); //对用户是否登录进行判断 if (arg0.getSession().getAttribute("user") == null) { //如果用户没有登录,就终止请求,并发送到登录页面 arg0.getRequestDispatcher("/login.jsp").forward(arg0, arg1); return false; } return true; }
拦截器和过滤器的区别:
过滤器
Filter依赖于Servlet容器,基于回调函数,过滤范围大
拦截器
Interceptor依赖于框架容器,基于反射机制,只过滤请求。
参考
Spring MVC拦截器相关文章推荐
- springmvc拦截器
- SpringMVC基础-9-拦截器
- SpringMVC使用拦截器
- 基于SpringMVC的登录拦截器
- springmvc拦截器
- SpringMVC拦截器-路径语法-略坑
- springmvc拦截器
- SpringMVC使用拦截器
- servlet filter和springMVC拦截器的区别
- SpringMVC 拦截器
- springMVC拦截器执行过程和使用
- springMVC拦截器应用
- SpringMVC -- 梗概--源码--贰--拦截器:Interceptor
- SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系
- springMVC 拦截器 HandlerInterceptor 用法
- springMvc拦截器,全局异常配置,cookie保存用户登录信息
- [j2ee][springMVC]springMVC中的拦截器及其应用
- Java过滤器与SpringMVC拦截器之间的关系与区别
- SpringMVC 拦截器
- JavaEE开发之SpringMVC中的自定义拦截器及异常处理