12. 登录拦截器

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值