社区系统项目复盘-2
创始人
2024-03-01 23:08:09

文章目录

      • 登录模块
      • 注册
      • 登录
      • 账号设置

登录模块

重要知识点:

  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 {@Autowiredprivate HostHolder hostHolder;@Overridepublic 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)

注册

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

登录

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

账号设置

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

相关内容

热门资讯

三年级我长大了200字作文(... 三年级我长大了200字作文 篇一当我进入三年级的时候,我感到自己真的长大了许多。在这一年里,我有了许...
去恐龙园游玩作文三年级(推荐... 去恐龙园游玩作文三年级 篇一我去恐龙园游玩了,真是太好玩了!恐龙园里有很多大恐龙,它们形状各异,栩栩...
写字比赛三年级作文600字(... 写字比赛三年级作文600字 篇一我喜欢写字比赛今天,学校里举办了一场写字比赛,我非常兴奋。我一直对写...
中华传统节日三年级下册作文3... 中华传统节日三年级下册作文300字 篇一春节的快乐春节是中华民族最重要、最隆重的传统节日之一。每年的...
我的好朋友作文三年级300字... 我的好朋友作文三年级300字左右 篇一我有一个好朋友,他叫小明。小明是一个非常聪明和善良的人。小明在...