有时候我们需要对请求进行拦截,比如检查是否登录什么的,所以这里在拦截器里做,后面还要进行权限(就是有些请求需要校验权限的,有些不需要的)拦截,就通过AOP用自定义注解实现。执行顺序是(拦截器—AOP)当然这个在另一篇博文里写啦,拦截器是拦截所有的请求,也可以配置规则排除。
一、拦截器代码
1、主要是实现HandlerInterceptor即可
@Component
public class CoreInterceptor implements HandlerInterceptor{
}
2、然后实现方法:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
}
3、关键逻辑
log.info("进入登录判断拦截器,拦截的链接是:"+request.getRequestURI());
//这个是获取访问类型,若是不为null,就表明是异步,异步值一般都是:XMLHttpRequest
String requestType = request.getHeader("X-Requested-With");
//判断session中是否登录,没有登录就重定向到登录页面
HttpSession session =request.getSession();
//1、判断session中有没有user信息,若是有,则表明用户登录成功,直接转到首页,否则跳转到登录界面
User user = (User) session.getAttribute(Const.USER_KEY);
if(user==null) {
//XMLHttpRequest这个表示异步
if(requestType!=null) {
//如果是异步就返回一个json字符串,页面可以ajax来指定
response.getWriter().write(result);
return false;
}else {
//如果是同步,就直接重定向到登录界面,springboot直接写映射路径即可
response.sendRedirect("login");
}
return false;
}
return true;
二、注册拦截器
1、这个是为了把要排除拦截的内容写在配置文件里(application.yml),如下
intercept:
#登录拦截,放行的路径
excludelogin: ["/css/**","/images/**","/js/**"]
2、实现 WebMvcConfigurer
@Configuration
@ConfigurationProperties(prefix="intercept")
public class InterceptorConfig implements WebMvcConfigurer{
}
3、重写如下方法:
//这个是为了读取配置文件中的数组(要排除拦截的链接)
private ArrayList<String> excludelogin = new ArrayList<String>();
public ArrayList<String> getExcludelogin() {
return excludelogin;
}
public void setExcludelogin(ArrayList<String> excludelogin) {
this.excludelogin = excludelogin;
}
//注入拦截器对象
@Autowired
private CoreInterceptor coreInterceptor;
/**
* 功能描述:
* 配置静态资源,避免静态资源请求被拦截
*/
public void addInterceptors(InterceptorRegistry registry) {
//addPathPatterns 用于添加拦截规则
registry.addInterceptor(coreInterceptor)
//排除拦截的选项
.excludePathPatterns(excludelogin.toArray(new String[excludelogin.size()]));
}
因为springboot2.0若是添加了拦截器,默认会拦截所有请求,所以必须排除一些不拦截的请求。
结语
拦截器里一般都是做权限验证,是否登录的,好了,今晚的笔记搞定。