拦截器的定义
拦截器是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强。
使用场景:解决请求的共性问题(如:乱码问题, 权限验证问题等)
过滤器所在位置:
spring-web-4.0.2.RELEASE.jar -> org.springframework.web.filter -> CharacterEncodingFilter.class
SpringMVC可以通过配置过滤器来解决乱码问题
拦截器的工作原理和过滤器非常相似。
在web.xml配置过滤器,就如同高速路上的收费站所有的车辆都要进过检查!
<!-- 编码过滤器 -->
<filter>
<!--名字可以自定义-->
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<!-- 初始值 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<!-- 过滤所以得请求 -->
<url-pattern>*</url-pattern>
</filter-mapping>
拦截器的实现
- 编写拦截器类实现HandlerInterceptor接口
- 将拦截器注册进 SpringMVC框架中
- 配置拦截器的拦截规则(比如拦截部分请求,可以使用正则表达式)
在第二步在springMVC的配置文件中
<!-- 注册拦截器 -->
<mvc:interceptors>
<!-- 拦截以viewAll.form结尾的请求 -->
<mvc:mapping path="/viewAll.form"/>
<bean class="com.shenji.teworks.web.TestInterceptor">
<bean id="sessionInterceptor" class="com.shenji.teworks.web.interceptor.SessionInterceptor">
<!-- teworks-service.xml中 -->
<property name="manager" ref="sessionManager" />
<property name="domainSrv" ref="domainService" />
</bean>
</mvc:interceptors>
拦截器的方法介绍
- preHandle 方法,在请求被处理之前进行调用
- postHandle 方法,在请求被处理之后进行调用
- afterCompletion 方法,在请求结束之后才进行调用
preHandle方法的返回值表示我们是否需要将当前的请求拦截下来。
如果返回false,请求将被终止
如果返回true,请求将会继续运行
其中参数handler表示的是被拦截的请求的目标对象
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
可以通过参数ModelAndView参数改变显示的视图,或者修改发往视图的方法。例如:modlelAndView.addObject(“msg”,”这是传回的被修改后的消息”);
modelAndView.setViewName(“/hello2.jsp”);修改跳转的页面。
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
可以作为结束后的资源销毁,关闭流等等
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
拦截器的其他实现方式
拦截器的类还可以通过实现 WebRequestInterceptor接口来编写向SpringMVC框架注册的写法不变
弊端:preHandle方法没有返回值,不能终止请求
注意多个拦截器的执行顺序
适用场景
适用原则:处理所有请求的共同问题
1. 解决乱码问题
2. 解决权限验证问题
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
request.setCharacterEncoding("utf-8");
System.out.println("执行到了preHandle方法");
//对用户是否登录进行判断
if(request.getSession().getAttribute("user") == null) {
//如果用户没有登录,就终止请求,并发送到登录页面
request.getRequestDispatcher("/login.jsp").forward(request, response);
return false;
}
}