springboot2 拦截器是在那个阶段,能做什么?

90 阅读1分钟

拦截器发生在控制器之前

image.png

经过prehanle 方法拦截,返回true ,才进入控制器的方法 响应也是 一层一层返回来,才给回到界面。

如何创建拦截器


package org.thingsboard.server.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * 自定义拦截器
 */
public class MyInterceptor implements HandlerInterceptor {

    /*重写了prehanle 方法*/
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
        // 可以做一些操作 比如用户没有登录或者 请求不合法 就直接 返回 return false;
        return true;// 只有返回true才会继续向下执行,返回false取消当前请求
    }

}

注册拦截器,才会真正应用起来


package org.thingsboard.server.interceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thingsboard.server.config.BigScreenConfig;

import java.io.File;


@Configuration
public class MyWebMVCConfig implements WebMvcConfigurer {

    @Autowired
    private BigScreenConfig bigScreenConfig;

    /** 添加拦截器 **/
    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(new MyInterceptor());
    }


    /** 静态资源处理 **/
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //配置路径访问本服务器上传的图片
        registry.addResourceHandler("/static/file_upload/**").addResourceLocations("file:"+bigScreenConfig.getDefaultBaseDir()+File.separator);

    }
}

应用场景

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

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

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

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