250 字
1 分钟
基于Session状态的拦截未登陆用户
基于Session状态的拦截未登陆用户
如果你的SpringBoot的用户状态主要是由Session去管理的话,你会发现每个接口添加HttpSession的话也可以拦截未登陆用户,因为会给其返回一个500的错误,但是这样一不正式二很麻烦。我们可以使用拦截器去统一查看用户的session状态。
public class RestfulSessionCheckInterceptor implements HandlerInterceptor {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
if (session.getAttribute("logonUserInfo") == null) {
response.setContentType("application/json;charset=UTF-8");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
Map<String, Object> result = new HashMap<>();
result.put("success", false);
result.put("message", "您尚未登陆,拒绝访问。");
PrintWriter out = response.getWriter();
out.print(objectMapper.writeValueAsString(result));
out.flush();
return false;
}
return true;
}
}
然后在处理跨域的配置类中向注册器添加拦截器类即可:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new RestfulSessionCheckInterceptor())
.addPathPatterns("/api/**") // 拦截所有 /api 路径下的请求
.excludePathPatterns(
"/api/user/login", // 排除登录接口
"/api/user/register", // 排除注册接口
"/api/user/code",
"/api/public/**" // 排除所有公开接口
);
}
}