由于论坛中的所有功能接口都需要在用户登录的情况下才能访问,所以要做统一的登录身份校验。
1. 在 interceptor 包下创建 LoginInterceptor
@Component // 交给 Spring 管理
public class LoginInterceptor implements HandlerInterceptor {
// 从配置文件中读取配置内容
@Value("${bit-forum.login.url}")
private String defaultURL;
/**
* 预处理(请求的前置处理)回调方法</br>
* @return true 继续请求流程 </br> false 中止请求流程
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 获取 session
HttpSession session = request.getSession(false);
// 判断 session 和 session 中保存的用户信息是否有效
if (session != null && session.getAttribute(AppConfig.SESSION_USER_KEY) != null) {
// 校验通过
return true;
}
// 校验不通过时要处理的逻辑
// 1. 返回一个错误的HTTP状态码
// response.setStatus(403);
// 2. 跳转到某一个页面
// 对 URL 前缀做校验(确保目标 URL 从根目录出发)
if(!defaultURL.startsWith("/")){
defaultURL = "/" + defaultURL;
}
response.sendRedirect(defaultURL);
// 校验不通过
return false;
}
}
2. 修改 application.yml 配置文件,添加跳转页面
# 项⽬⾃定义相关配置
bit-forum:
login:
url: sign-in.html # 未登录状况下强制跳转⻚⾯
3. 在 interceptor 包下创建 AppInterceptorConfigurer 类
@Configuration // 交给 spring 管理
public class AppInterceptorConfigurer implements WebMvcConfigurer {
@Resource
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加登录拦截器
registry.addInterceptor(loginInterceptor) // 添加⽤⼾登录拦截器
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/sign-in.html") // 排除登录HTML
.excludePathPatterns("/sign-up.html") // 排除注册HTML
.excludePathPatterns("/user/login") // 排除登录api接⼝
.excludePathPatterns("/user/register") // 排除注册api接⼝
.excludePathPatterns("/user/logout") // 排除退出api接⼝
.excludePathPatterns("/swagger*/**") // 排除登录swagger下所有
.excludePathPatterns("/v3*/**") // 排除登录v3下所有,与swag
.excludePathPatterns("/dist/**") // 排除所有静态⽂件
.excludePathPatterns("/image/**")
.excludePathPatterns("/**.ico")
.excludePathPatterns("/js/**");
}
}
4. 测试
在运行启动类后,一旦访问到 http://127.0.0.1:58080/index.html
就会跳转到登录界面 http://127.0.0.1:58080/sign-in.html
那么此时,在 UserController 类中就不再需要对用户的登录状态进行判断。
可以删除掉绿色框中的代码。