拦截器发生在控制器之前
经过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)