Flyinsky's Codes
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/**"         // 排除所有公开接口
                );
    }
}