一、创建登陆拦截器
-
每一个拦截器都需要实现的 HandlerInterceptor 接口,这个接口有三个方法
1、preHandle( Controller方法处理之前调用)
2、postHandle(Controller方法处理完之后,DispatcherServlet进行视图的渲染之前调用)
3、afterCompletion(视图的渲染之后调用) -
但三个方法并不需要全都实现,原因是接口通过default关键字修饰之后,可以给接口添加默认实现,对于实现这个接口的所有实现类,可以自己选择是否要覆盖接口,这是JDK8之后新增的语法点
-
该语法的实际应用,某项目线上已运行几年,项目一版一版迭代,某个模块需要新增功能,该模块代码结构如下:
1、 一个接口定义了一系列规范,该接口目前有20个实现类
2、完成当前功能需要需要接口规范,新增几个接口方法;但是并不是所有的实现类需要实现
3、如果解决?
方案一: 使用default关键词,修饰新增方法避免所有实现类都需要修改
方案二: 用一个抽象类实现接口,其他实现类继承抽象类 -
新建一个 intercepors 包,用来装拦截器。然后在拦截器下新建 LoginInterceptor,用来拦截验证登陆。
-
以登录拦截为例,该拦截需要在接口调用之前拦截请求,判断是否登陆,所以这里需要使用 preHandle 方法,在里面写验证逻辑,最后返回 true 或者 false,确定请求是否合法。
import com.example.tokenlogindemo.entity.User;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* @author Mi
* @version 1.0
* @description: TODO
* @date 2022/1/7 17:37
*/
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (user == null){
//返回false表示忽略当前请求,如果一个用户调用了需要登陆才能使用的接口,如果他没有登陆这里会直接忽略掉
//也可以利用response给用户返回一些提示信息,提示未登陆
return false;
}else {
return true; //如果session里有user,表示该用户已经登陆,放行,用户即可继续调用自己需要的接口
}
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
二、在WebConfigurer中添加拦截器
- 创建WebConfigurer 类
- 将 LoginInterceptor 注入到 WebConfigurer 中
- 在 WebConfigurer 中设置拦截放行,addPathPatterns 用来设置拦截路径,excludePathPatterns 用来设置放行路径。
import com.example.tokenlogindemo.interceptor.LoginInterceptor;
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;
/**
* @author Mi
* @version 1.0
* @description: TODO
* @date 2022/1/7 17:45
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
//将 LoginInterceptor 注入到 WebConfigurer 中
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//在 WebConfigurer 中的 addInterceptors 中添加拦截,放行
// addPathPatterns("/**") 表示拦截所有的请求,
// excludePathPatterns("/login", "/register") 表示对登录注册放行
registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/register");
}
}