spring中的拦截器

244 阅读3分钟

「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。

java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或者之后加入某些操作.

拦截器特点

1.请求到达经过拦截器,响应回来也经过拦截器 2.只能拦截控制器相关请求不能拦截JSP请求 3.拦截器可以中断用户请求轨迹

拦截器作用

将多个控制器中共有代码放入拦截器可以减少控制器代码冗余

拦截器的应用场景

1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page VIEW)等。 2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面; 3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录); 4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。 5、OpenSessionInView:如Hibernate,在进入处理器打开SESSION,在完成后关闭SESSION。

拦截器的使用

  1. 定义拦截器
@Component      //声明为springBoot的一个组件,但是并不能起作用,需要在springBoot的配置类中注入
public class TimeInterceptor implements HandlerInterceptor {
​
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("TimeInterceptor 进入 Controller 某个方法之前");
        System.out.println("Controller Name:"+((HandlerMethod)handler).getBean().getClass().getName());
        System.out.println("Controller Method Name:"+((HandlerMethod)handler).getMethod().getName());
        request.setAttribute("startTime", new Date().getTime());
        
        /**
         * boolean 值: 确定了拦截器其余两方法是否执行
         */
        return true;
    }
​
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("TimeInterceptor 运行 Controller 某个方法时,方法抛出异常将不进入此方法");
        long start = (long) request.getAttribute("startTime");
        System.out.println("TimeInterceptor 处理时长为:"+ (new Date().getTime() - start));
​
    }
​
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("TimeInterceptor 完成 Controller 某个方法");
        long start = (long) request.getAttribute("startTime");
        System.out.println("TimeInterceptor 处理时长为:"+ (new Date().getTime() - start));
​
    }
​
}
​

2.注入拦截器

    //spring boot 1.0 -2.0版本
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
​
    @Autowired
    private TimeInterceptor timeInterceptor;
​
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(timeInterceptor);
    }
}
​
//spring boot 2.0以上版本
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
​
    @Bean
    public MyWebMvcConfig getMyWebMvcConfig(){
        MyWebMvcConfig myWebMvcConfig = new MyWebMvcConfig() {
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                registry.addViewController("/").setViewName("alogin");
                registry.addViewController("/login").setViewName("alogin");
                registry.addViewController("/main.html").setViewName("dashboard");
            }
            //注册拦截器
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
                        .excludePathPatterns("/login","/","/user/login");
            }
        };
        return myWebMvcConfig;
    }
​

总结

主要内容讲解SpringBoot项目是如果配置拦截器,同时今天也是大年初一,在此给大家拜年了,祝福大家新年快乐,虎年大吉,事业有成,财源滚滚,万事如意。

\