SpringBoot 拦截器
项目中拦截器必不可少,SpringBoot框架也增加了拦截器的机制,SpringBoot的拦截器默认是处理所有请求的,因此我们创建的业务类或控制器类等无需实现某个接口或继承某个类,使用起来也比较方便,对所有请求都做对应的处理就好了,接下来介绍如何搭建一个简单的登录拦截器。
1.首先创建一个自定义的拦截器类【LoginInterceptor】,并实现【HandlerInterceptor】接口
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
}
}
这个接口中,我们需要用到【preHandle】方法,来自定义拦截逻辑,网站访问过程中,如当前若没有用户登录,则需要跳转到登录或注册页面,如京东商城,未登录状态无法添加购物车等,此时需要检测是否有用户登录,来判断后续操作,则在【preHandle】方法中添加如下代码:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//通过session对象获取当前登录用户
User user = (User) request.getSession().getAttribute("user");
//不存在登录信息重定向登录页面
if(user == null) {
response.sendRedirect("/web/login.html");
return false;
}
//存在登录信息则放行
return true;
}
此时,登录拦截器的拦截逻辑基本完成,但是需要拦截的请求还有很多,而且很多请求的部分资源,都是相同的请求,如页面的CSS样式设置,静态资源的请求路径等,因此,仍需要添加一个拦截器配置类【LoginInterceptorConfigurer】,并实现【WebMvcConfigurer】接口,为拦截器设置部分参数。代码如下:
/**
* 拦截器配置类
* @author Administrator
*/
//表示该类是一个配置参数的类,Spring框架在加载时会自动读取,加载这些配置
@Configuration
public class LoginInterceptorConfigurer implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry) {
//创建拦截器处理器,指向自己创建的拦截器类
HandlerInterceptor interceptor = new LoginInterceptor();
//创建一个集合,储存拦截的白名单
List<String> excludeList = new ArrayList<>();
//白名单:登录及注册请求
excludeList.add("/user/login");
excludeList.add("/user/reg");
//白名单:登录及注册页面
excludeList.add("/web/login.html");
excludeList.add("/web/register.html");
//白名单:样式及资源文件等
excludeList.add("/bootstrap3/**");
excludeList.add("/css/**");
excludeList.add("/images/**");
excludeList.add("/js/**");
//拦截器注册器的addInterceptor返回的对象可以添加拦截的黑名单和白名单
registry.addInterceptor(interceptor).addPathPatterns("/**").excludePathPatterns(excludeList);
}
}
此时登录拦截器已配置好拦截的黑名单以及白名单,拦截功能基本实现。
【PS】创建拦截器类和拦截器配置类时,建议分包创建,如拦截器类在【cn.xxx.interceptor】包下,【cn.xxx.config】包下。注意【@Configuration】注解也会参与注解扫描,注解类的位置。