拦截器的实现步骤 :

  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应用中的请求的一些通用性问题(编码、权限验证等)。

    共性问题在拦截器中处理,可减少重复代码,便于维护。 

最后附上一张图(多个拦截器同时工作是,方法调用顺序),拦截器方法调用顺序根据配置文件中配置的顺序确定先后:

springMVC 过滤器 获取参数 springmvc实现过滤器_springMVC 过滤器 获取参数