社区系统项目复盘-2

本文介绍了Spring MVC中如何使用ThreadLocal和拦截器实现用户登录状态的管理。ThreadLocal用于线程隔离的数据存储,替代session。拦截器则用于在请求处理前后插入额外的逻辑,如检查登录状态,并在必要时展示或清除用户信息。文章还提到了自定义注解的方式增强拦截器的功能,以及注册、登录和账号设置等用户管理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

登录模块

重要知识点:

  1. ThreadLocal,Hostholder采用Threadlocal持有用户信息,用于代替session对象
    • ThreadLocal采用线程隔离的方式存放数据,可以避免多线程之间出现数据访问冲突。
    • ThreadLocal提供set方法,能够以当前线程为key存放数据。
    • ThreadLocal提供get方法,能够以当前线程为key获取数据。
    • ThreadLocal提供remove方法,能够以当前线程为key删除数据。
  2. 拦截器
  • 拦截器示例

    • 定义拦截器,实现HandlerInterceptor

      在controller/interceptor路径下定义拦截器,使用@Compont注解,implements HandlerInterceptor,里面有三个方法可以重写

      • preHandle() // 在Controller之前执行,若返回false,则终止执行后续的请求。
      • postHandle() // 在Controller之后执行,模版之前执行。
      • afterCompletion() // 在模版引擎TemplteEngine之后执行。
    • 配置拦截器,为他指定拦截、排除的路径

      WebMvcConfig implements WebMvcConfigurer,实现WebMvcConfigurer接口

      首先使用@Autowired注解注入拦截器,然后重写addInterceptors()方法

      https://res.craft.do/user/full/fd148a50-4a5b-9a85-bec3-e1645571e2c7/doc/E5A630C2-3AE5-4D32-8251-762AF7B232E0/8DD543E3-6659-4C30-B98C-2D044469E02E_2/xjLap3R3bhLaxe8Gk47bPUys5PkekLHoKL5hRyoMN90z/Image.png

  • 拦截器应用(显示登录信息)

    https://res.craft.do/user/full/fd148a50-4a5b-9a85-bec3-e1645571e2c7/doc/E5A630C2-3AE5-4D32-8251-762AF7B232E0/C65470A1-69EC-4BCC-9395-0F23ED132715_2/275aMHWJnw8VGiEeR6ecJzCWKH2hTDo63NOHwiFYk8Mz/Image.png

    • 在请求开始时查询登录用户
    • 在本次请求中持有用户数据
    • 在模板视图上显示用户数据
    • 在请求结束时清理用户数据
    • 提示:拦截器在controller执行前执行preHolder,根据登录凭证(这里的登录凭证是从cookie中获得的,该cookie不能由@CookieValue获得,只能从request请求中获得指定cookie(封装为一个工具类),)获得用户信息,然后存到hostHolder中(这里的用户信息,是通过ThreadLocal来持有的,代替了session,hostHolder也封装为了一个工具类),在controller执行后,模版之前执行postHandle,将用户信息存到modelandview中,用来写出到模板,在模板执行后执行afterCompletion,清空hostHolder中的用户信息,节省内存空间。
  • 拦截器应用(检查登录状态)

    • 使用拦截器的另一种方法

      • 首先定义自定义注解。
      @Target(ElementType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface  LoginRequired {
      }
      
      • 在需要拦截的方法前标注自定义注解
      • 拦截所有请求,只处理带有该注解的方法
      @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){
                  // 获取拦截到的Method对象
                  HandlerMethod handlerMethod = (HandlerMethod) handler;
                  Method method = handlerMethod.getMethod();
                  // 获取Method的注解
                  LoginRequired longinRequired = method.getAnnotation(LoginRequired.class);
                  // 如果有loginRequired注解但是没有登录,说明当前方法需要登录,但是没有登录,那么拒绝后续请求,强制重定向到登录页面
                  if(longinRequired != null && hostHolder.getUser() == null){
                      response.sendRedirect(request.getContextPath()+"/login");
                      return false;
                  }
              }
              return true;
          }
      }
      
    • 自定义注解

      • 常用的元注解:@Targrt、@Retention、@Document、@Inherited
        • @Targrt:自定义注解可以作用在哪里、
        • @Retention:自定义注解什么时候有效、编译时?运行时?
        • @Document:生成文档时要不要把注解也带上去、
        • @Inherited:用于继承
      • 如何读取注解:利用反射Method
        • Method.getDeclaredAnnotations()
        • Method.getAnnotation(Class annotationClass)

注册

  • 访问注册页面、提交注册数据、发送邮件激活、激活注册账号
    在这里插入图片描述

登录

  • 访问登录页面,生成验证码,提交登录数据,显示登录信息,退出功能
    在这里插入图片描述

账号设置

  • 访问账号设置页面,修改头像,修改密码,检查登录状态
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值