每日一记 - 3.7

项目相关


一、具体问题
  1. 请简要介绍一下你的项目?
  2. 用户模块包括哪些功能?
  3. 拦截器是如何实现的?
  4. 有哪些自定义注解?
  5. 如何获取注解呢?
  6. 用户的登陆状态是怎么在内存中保存的?
  7. 自定义登陆凭证如何设计的?

二、参考答案

1. 请简要介绍一下你的项目?

我做了一个校园交流平台项目,目的是方便同学线上以物换物、信息交流和比赛组队等。

主要设计的模块包括用户模块帖子模块系统模块

具体来说,完成了注册/登陆帖子发布/删除系统通知关键词搜索权限管理等功能开发。

同时运用了一些中间件对系统进行优化。

2. 用户模块包括哪些功能?

用户模块包括:用户的注册与登陆、验证码、私信、评论、关注和取关功能。

  • 这一个模块中使用了拦截器赋予用户多种角色,其中包括:游客和普通用户。

目的是保护需要登陆才能访问的资源。

  • 除此之外,还使用到自定义登陆凭证来保存用户登陆状态。

3. 拦截器是如何实现的?

拦截器这部分的实现,最开始是通过拦截自定义注解的方式来实现的,具体的说:

  • 首先,在想要拦截的方法前添加自己自定义注解。

  • 然后,通过继承 HandlerInterceptor 拦截器类的方式来自定义一个拦截器,通过这个拦截器,在处理请求前,拦截带有自定义注解的方法。

  • 最后,在拦截到对应方法后,通过检查用户登陆的状态来区别 游客 还是 普通用户

    • 若是游客,则通过 response 强制重定向到登陆页面。

在这部分,用户的登陆状态是保存在内存中的

4. 有哪些自定义注解?

  1. @Target 注解:用于声明自定义注解可以作用的 位置,例如:类、方法、属性等。
  2. @Retention 注解:用于声明自定义注解生效的 时间,例如:编译时有效、还是运行时有效。
  3. @Document 注解:用于声明自定义注解在 生成文档 时,要不要把它也带上。
  4. @Inherited 注解:用于指定注解是否 继承,例如子类继承父类,子类是否继承父类的注解。

一般来说,自定义注解通常要使用 Target 和 Retention 注解来指定自定义注解 作用的位置和时间

5. 如何获取注解呢?

可以使用 Method.getAnnotation() 方法,通过 反射 来获取到自定义注解对象。

6. 用户的登陆状态是怎么在内存中保存的?

用户的登录状态是通过自定义登陆凭证 来标识的,并通过Redis将这个凭证保存在内存中。

因为最开始考虑到如果将用户的 自定义登录凭证 保存在数据库中。

每次检查用户登录状态时,后端都要从数据久层中拿数据,速度比较慢。

所以考虑添加 Redis 中间件,来将用户的登陆凭证保存在内存中,来加快后端处理的速度。

7. 自定义登陆凭证如何设计的?

自定义的登录凭证设计为 Java 中的一个实体类,包括:

  • 用户的 ID、凭证字符串和凭证的失效时间。

因为自定登录凭证在用户登录以后,会在服务端的内存中保留一段时间,所以字段中包含了凭证的失效时间。

这个内存中的失效时间取决于用户在登录时是否勾选 记住我 的按钮:

  • 如果没有勾选,设置凭证的失效时间为:1 天。
  • 如果勾选了,设置凭证的失效时间为:2 周。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值