关于拦截器的概念及定义不再过多的进行阐述, 我们只需要知道为什么要使用拦截器? 其便利性如何? 其次就是具体的使用步骤.
1 为什么要使用拦截器?
这里我们可以举个例子做个对比, 如果我们做了一个日记记录的系统, 其中主要的功能当然就是写日记, 修改日记以及查看日记, 但是这个系统要求必须是用户登录之后才可以进行查看日记的详情以及写日记和修改日记, 这时候我们就想到了用户登录后将用户信息存储在 session 中, 然后写日记 / 修改日记 / 查看日记详情的时候进行校验, 判断是不是登录状态, 如果未登录, 直接拒绝使用这三个功能, 如下面所示:
这样的解决方式是可以的, 毕竟目前的这个系统的功能就只有三个, 但是如果是一个庞大的系统, 我们每次都要去使用这个方法显然是比较繁琐的, 因此就诞生了拦截器这个概念, 因为拦截器是在 Servlet 执行之前执行的程序, 或者是 controller 代码执行之前执行的程序, 因此用拦截器来检测用户的登录状态再好不过了!!!
2 具体的使用步骤
第一步: 创建一个检测用户是否登录的拦截器, 实现 HandlerInterceptor 接口并重写 preHandle;
拦截器我放在了我项目工具类包里面:
代码如下:
public class LoginInterceptor implements HandlerInterceptor {
/**
* 拦截方法
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1. 获取 session
HttpSession session = request.getSession(false);
// 2. 读取 session 中的用户
Object user = session.getAttribute(AppFinal.USERINFO_SESSION_KEY);
// 3. 判断用户是否存在
if (user == null) {
// 4. 不存在, 拦截, 返回错误状态码 409(自定)
response.setStatus(409);
return false;
}
// 5. 存在
return true;
}
}
这段代码比较简单, 不做解释!
第二步: 配置拦截器和拦截规则
这里的类我都放在了配置文件包里面:
通过代码来进行解读:
/**
* 全局配置文件
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
// 配置拦截器和拦截规则
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/css/**")
.excludePathPatterns("/js/**")
.excludePathPatterns("/img/**")
.excludePathPatterns("/login.html");
}
}
- .addPathPatterns("/"): 代表拦截所有的请求;**
- .excludePathPatterns("/css/"): 代表排除对 css 文件夹下的所有文件的拦截;**
- 关于主要拦截什么, 可以这样理解, 因为要检测的是用户的登录状态, 因此登录界面肯定是不会拦截的, 因此 .excludePathPatterns(“/login.html”) 这里就排除了对登录界面的拦截, 拦截什么不拦截什么就自己的系统而定.
3 注意事项
- 一个项目中可以同时配置多个拦截器;
- 在配置拦截器及拦截规则的时候, 要给当前的类添加 @Configuration 注解.