首页 > 代码库 > 拦截器 Interceptor

拦截器 Interceptor

步骤:

1、编写拦截器类实现HandlerInterceptor接口

2、将编写的拦截器类注册到springmvc框架中

3、配置拦截器拦截规则

 

1、

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class MyHandleInterceptor extends HandlerInterceptorAdapter{
    private long requestTime;
    @Autowired
    private PerformanceService ps;
    
    /**
     * 请求处理前拦截
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        // TODO Auto-generated method stub
        requestTime = System.currentTimeMillis();//记录当前系统时间戳
        return true;
    }
    
    /**
     * 请求处理后页面渲染前拦截
     */
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
    }
    
    /**
     * 请求处理后页面渲染后拦截
     */
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        PerformanceEntity performance = new PerformanceEntity();
        //获得session传入的对象
        PersonEntity person = (PersonEntity) request.getSession().getAttribute("person");
        CompanyEntity company = (CompanyEntity)request.getSession().getAttribute("company");
        ManagerEntity commonManager = (ManagerEntity)request.getSession().getAttribute("commonManager");
        ManagerEntity superManager = (ManagerEntity)request.getSession().getAttribute("superManager");
        //设置请求人
        if(person!=null){
            performance.setRequestname(person.getName()+"访问:"+request.getRequestURI());
        }
        if(company!=null){
            performance.setRequestname(company.getName()+"访问:"+request.getRequestURI());
        }
        if(commonManager!=null){
            performance.setRequestname(commonManager.getName()+"访问:"+request.getRequestURI());
        }
        if(superManager!=null){
            performance.setRequestname(superManager.getName()+"访问:"+request.getRequestURI());
        }
        long responseTime = System.currentTimeMillis();//记录当前系统时间戳
        long time = responseTime - requestTime;//获得响应时间
        performance.setTime(String.valueOf(time));
        //设置等级
        if (time<3000) {//优
            performance.setGrade("优");
        }
        if (time>=3000&&time<5000) {//良
            performance.setGrade("良");
        }
        if (time>=5000&&time<10000) {//中
            performance.setGrade("中");
        }
        if (time>10000) {//差
            performance.setGrade("差");
        }
        ps.addPerformance(performance);
    }
}

 

 

2、3、

spring mvc 的xml 文件中一定要有如下:

xmlns:mvc="http://www.springframework.org/schema/mvc"

http://www.springframework.org/schema/mvc  

http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

 

<!-- 配置自定义拦截器 -->
    <mvc:interceptors>

   <mvc: mapping path="/myviews.form"/> 拦截规则:拦截所有以myviews.form结尾的请求
        <bean class="com.lovo.interceptor.MyHandleInterceptor"/>
    </mvc:interceptors>

 

PreHandle方法: 请求被处理前调用,返回值表示是否需要将当前请求拦截下来,

  返回fasle 请求将被终止,请求不户到达controller ,true则放行

方法中的参数:

    HttpServletRequest: 存储了所有请求的内容

    HttpServletResponse: 存储了所有响应的内容

    Object: 表示被拦截的请求的目标对象,即对应的controller方法

    

 

 

PostHanle方法 : 请求被处理后调用

  参数ModelAndView 参数可以改变,

  modelAndView.addobject(“msg”,"传回的是被拦截器改变后的数据");

  modelAndVies.setViewName("hello.jsp");//修改视图跳转到的目的地

 

aftercompletion 方法 : 请求结束后调用

  在请求响应后即视图已经显示出现后调用,一般用于资源的销毁

 

 

 当一个项目有多个拦截器时的流程原理:

技术分享

 

其他实现方式:  实现WebRequestInterceptor  接口

  实现WebRequestInterceptor接口与实现HandlerInterceptor 接口 不同之处: 每个方法的参数不一样,且WebRequestInterceptor 接口的PreHandle 方法不

能终止请求。原理一样。注册写法一样。

 

使用场景:

  解决共性问题: 1、解决乱码问题: 在PreHanle 和 postHandle 中分别设置   request.setCharacterEncoding("utf-8")  response.setCharacterEncoding("utf-8")

         2、解决权限验证问题: 在preHandle 中对用户是否登录进行判断,用户保存在session 中时

            if(request。getSession().getAttribute("user")==null){

              request.getRequestDisPatcher("/login.jps").forword(request,response);

            }eles{

              return true;            

               }

 

拦截器和过滤器的区别:

  filter 依赖于servlet 容器 ,基于回调函数,过滤范围大,还可以过滤资源等

  Interceptor 依赖于框架容器,基于反射机制,之顾虑请求

 

拦截器 Interceptor