拦截器的实现步骤 :
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 }
拦截器方法介绍 :
afterCompletion : 在请求结束之后执行,一般很少有。
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应用中的请求的一些通用性问题(编码、权限验证等)。
共性问题在拦截器中处理,可减少重复代码,便于维护。
最后附上一张图(多个拦截器同时工作是,方法调用顺序),拦截器方法调用顺序根据配置文件中配置的顺序确定先后: