SpringMVC 拦截器

常见应用场景

       日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。

       权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;

       性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录)

        通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。

        OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。 OpenSessionInView本质也是AOP(面向切面编程),也就是说符合横切关注点的所有功能都可以放入拦截器实现。

Spring拦截器和 过滤器 区别

        XML配置文件对比

                过滤器


<filter>  
  <filter-name>XXXFilter</filter-name>  
  <filter-class>  
     com.web.util.XXXFilter  
  </filter-class>  
</filter>  
  
<filter-mapping>  
  <filter-name>XXXFilter</filter-name>  
  <url-pattern>*.action</url-pattern>  
</filter-mapping> 

                拦截器 

<!-- 拦截器 	-->      
<mvc:interceptors>      
    <!-- 多个拦截器,顺序执行 -->      
    <mvc:interceptor>      
       <mvc:mapping path="/entryOrJsonController/*" />      
       <bean class="com.wy.interceptor.CommonInterceptor"></bean>      
    </mvc:interceptor>      
</mvc:interceptors>  

多个拦截器的拦截顺序

        

代码案例 

        创建Interceptor,实现:HandlerInterceptor接口

package com.springmvc.interceptor;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Author : Eeerosss
 * @create 2022/9/2 11:22
 */
public class MyInterceptor  implements HandlerInterceptor {
    Logger logger =Logger.getLogger(MyInterceptor.class);
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        logger.info("控制器处理之前执行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        logger.info("控制器处理完毕,视图执行之前执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        logger.info("程序执行完毕,释放资源后执行");
    }
}

         特殊的拦截器

package com.springmvc.interceptor;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Author : Eeerosss
 * @create 2022/9/2 11:22
 */
public class MyInterceptor2 implements HandlerInterceptor {
    Logger logger =Logger.getLogger(MyInterceptor2.class);
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        logger.info("只拦截User模块,控制器处理之前执行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        logger.info("只拦截User模块,控制器处理完毕,视图执行之前执行");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        logger.info("只拦截User模块,程序执行完毕,释放资源后执行");
    }
}

        配置文件

<!--拦截器配置文件-->
    <mvc:interceptors>
        <!--默认不写mapping,拦截所有-->
        <bean class="com.springmvc.interceptor.MyInterceptor"></bean>
        <mvc:interceptor>
            <mvc:mapping path="/user/*action"/>
            <bean class="com.springmvc.interceptor.MyInterceptor2"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

        执行一个在user目录下的控制器的控制台信息

        拦截顺序结果展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值