SpringBoot中利用拦截器检查登录状态(升级)

1.前言

  • 我的上一篇博客写了使用拦截器来去检查登录的状态然后给用户显示不同的界面,但是这样还是有问题,虽然用户看不见哪些信息,但是如果我们知道访问路径,照样可以访问到我们没登录时看不到的界面,那么这样就有大问题了,因为,很有可能会有人能通过这些界面影响我们的数据库,这样的话就带来了安全隐患。文字可能不太清楚,上图就明白了。
  • 如下图所示,是我们没登录时看到的界面
    在这里插入图片描述
  • 但是我们可以通过更改路径访问到我们的个人中心
  • 如下图
    在这里插入图片描述
  • 这就很诡异了,明明我们就没有这个按钮,怎么还能访问到?因此我们要想办法解决这个问题

2.使用拦截器

  • 在方法前标注自定义注解
  • 拦截所有的请求,只处理带有该注解的方法

2.1.自定义注解

  • 常用的元注解
    • @Target,声明自定义的注解可以写在哪个位置,可以作用在哪些类型上(类,方法,属性…)
    • @Retention,声明注解保留的时间,是编译时有效还是运行时有效
    • @Document,声明我们在生成文档时,要不要也把注解带上去
    • @Inherited,用于继承的,子类继承父类,要不要把注解也继承过来
  • 如何读取注解?通过反射
    • Method.getDeclaredAnnotations(),获取这个方法上所有的注解
    • Method.getAnnotation(class, annotationClass),获取某个类型的注解

3.编写注解类

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//拦截方法
@Target(ElementType.METHOD)
//在程序运行时有效
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginRequired {

}

4.拦截未登录时的请求

在这里插入图片描述

5.编写拦截器类

@Component
public class LoginRequiredInterceptor implements HandlerInterceptor {

    @Autowired
    private HostHolder hostHolder;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 先判断拦截的对象是不是方法
        if(handler instanceof HandlerMethod){
            // 转型
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            LoginRequired loginRequired = method.getAnnotation(LoginRequired.class);
            //拦截到了,并且未登录,直接重定向至登录页面
            if(loginRequired != null && hostHolder.getUser() == null){
                response.sendRedirect(request.getContextPath() + "/login");
                return false;
            }
        }
        return true;
    }
}

6.配置config类,不拦截静态资源

 registry.addInterceptor(loginRequiredInterceptor)
                .excludePathPatterns("/**/*.css", "/**/*.js", "/**/*.png", "/**/*.jpg", "/**/*.jpeg");

7.运行结果

  • 我们再访问之前的路径,未登录时就会直接跳转到登录页面了,就不能让他访问到了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值