拦截器 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 依赖于框架容器,基于反射机制,之顾虑请求

时间: 2024-09-30 10:57:38

拦截器 Interceptor的相关文章

Flume-NG源码阅读之SourceRunner,及选择器selector和拦截器interceptor的执行

在AbstractConfigurationProvider类中loadSources方法会将所有的source进行封装成SourceRunner放到了Map<String, SourceRunner> sourceRunnerMap之中.相关代码如下: 1 Map<String, String> selectorConfig = context.getSubProperties( 2 BasicConfigurationConstants.CONFIG_SOURCE_CHANNE

Kafka producer拦截器(interceptor)

Producer拦截器(interceptor)是个相当新的功能,它和consumer端interceptor是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑. 对于producer而言,interceptor使得用户在消息发送前以及producer回调逻辑前有机会对消息做一些定制化需求,比如修改消息等.同时,producer允许用户指定多个interceptor按序作用于同一条消息从而形成一个拦截链(interceptor chain).Intercetpor

详述 Spring MVC 框架中拦截器 Interceptor 的使用方法

1 前言 昨天新接了一个需要,"拦截 XXX,然后 OOO",好吧,说白了就是要用拦截器干点事(实现一个具体的功能).之前,也在网络上搜了很多关于Interceptor的文章,但感觉内容都大同小异,而且知识点零零散散,不太方便阅读.因此,正好借此机会,整理一篇关于拦截器的文章,在此分享给大家,以供大家参考阅读. 2 拦截器 2.1 概念 Java 里的拦截器是动态拦截 action 调用的对象.它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个

struts2拦截器interceptor的三种配置方法

struts2拦截器interceptor的三种配置方法方法1. 普通配置法 <struts>     <package name="struts2" extends="struts-default">         <interceptors>             <interceptor name="myInterceptor" class="edu.hust.interceptor.

Struts拦截器Interceptor

Struts2 拦截器 [Interceptor] 拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部.拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作. 每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面. 如何自定义一个拦截器? 自定义一个拦截器需要三步: 1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类. 2 在strutx.xml中

Flume 拦截器(interceptor)详解

flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截器都可以进行转换或者删除这些事件.每个拦截器只处理同一个source接收到的事件.可以自定义拦截器.2.flume内置的拦截器 2.1 时间戳拦截器flume中一个最经常使用的拦截器 ,该拦截器的作用是将时间戳插入到flume的事件报头中.如果不使用任何拦截器,flume接受到的只有message.

五 、 Kafka producer 拦截器(interceptor) 和 六 、Kafka Streaming案例

五 Kafka producer 拦截器(interceptor) 5.1 拦截器原理 Producer 拦截器(interceptor)是在 Kafka 0.10 版本被引入的,主要用于实现 clients 端的定 制化控制逻辑. 对于 producer 而言,interceptor 使得用户在消息发送前以及 producer 回调逻辑前有机会 对消息做一些定制化需求,比如修改消息等.同时,producer 允许用户指定多个 interceptor 按序作用于同一条消息从而形成一个拦截链(in

拦截器interceptor

拦截器interceptor 配置 <mvc:interceptors> <mvc:interceptor> <!--/**回处理/后面的所有请求--> <mvc:mapping path="/**"/> <bean class="cn.pinked.config.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> 拦截器

Struts2自定义拦截器Interceptor以及拦截器登录实例

1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor{ private static final long serialVersionUID = 1L; public void destroy() { } public void init() {} public String intercept(ActionInvocation arg0) throws

webwork拦截器interceptor 之 ActionInvocation

“将Web页面中的输入元素封装为一个(请求)数据对象”,这个对象就是ActionInvocation类型. 对于Xwork 而言,前端的Webwork 组件为其提供的是一个Map 类型的数据结构.而Action面向的却是Model对象所提供的数据结构.在何时.何处对这两种不同的数据结构进行转换? 写一个辅助类完成这样的工作,并在每次Action 调用之前由框架代码调用他完成转换工作. Xwork 通过Interceptor 实现了这一步骤,从而我们可以根据需要,灵活的配置所需的Intercept