12. 登录拦截器

由于论坛中的所有功能接口都需要在用户登录的情况下才能访问,所以要做统一的登录身份校验。

1. 在 interceptor 包下创建 LoginInterceptor

@Component // 交给 Spring 管理
public class LoginInterceptor implements HandlerInterceptor {
    // 从配置文件中读取配置内容
    @Value("${bit-forum.login.url}")
    private String defaultURL;

    /**
     * 预处理(请求的前置处理)回调方法
* @return true 继续请求流程
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; } }

12. 登录拦截器_第1张图片

2. 修改 application.yml 配置文件,添加跳转页面

# 项⽬⾃定义相关配置
bit-forum:
 login:
  url: sign-in.html # 未登录状况下强制跳转⻚⾯

12. 登录拦截器_第2张图片

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 类中就不再需要对用户的登录状态进行判断。

12. 登录拦截器_第3张图片

可以删除掉绿色框中的代码。

你可能感兴趣的:(项目,java,数据库,服务器)