项目相关
一、具体问题
- 请简要介绍一下你的项目?
- 用户模块包括哪些功能?
- 拦截器是如何实现的?
- 有哪些自定义注解?
- 如何获取注解呢?
- 用户的登陆状态是怎么在内存中保存的?
- 自定义登陆凭证如何设计的?
二、参考答案
1. 请简要介绍一下你的项目?
我做了一个校园交流平台项目,目的是方便同学线上以物换物、信息交流和比赛组队等。
主要设计的模块包括用户模块、帖子模块和系统模块。
具体来说,完成了注册/登陆、帖子发布/删除、系统通知、关键词搜索和权限管理等功能开发。
同时运用了一些中间件对系统进行优化。
2. 用户模块包括哪些功能?
用户模块包括:用户的注册与登陆、验证码、私信、评论、关注和取关功能。
- 这一个模块中使用了拦截器赋予用户多种角色,其中包括:游客和普通用户。
目的是保护需要登陆才能访问的资源。
- 除此之外,还使用到自定义登陆凭证来保存用户登陆状态。
3. 拦截器是如何实现的?
拦截器这部分的实现,最开始是通过拦截自定义注解的方式来实现的,具体的说:
-
首先,在想要拦截的方法前添加自己自定义注解。
-
然后,通过继承 HandlerInterceptor 拦截器类的方式来自定义一个拦截器,通过这个拦截器,在处理请求前,拦截带有自定义注解的方法。
-
最后,在拦截到对应方法后,通过检查用户登陆的状态来区别 游客 还是 普通用户。
- 若是游客,则通过 response 强制重定向到登陆页面。
在这部分,用户的登陆状态是保存在内存中的。
4. 有哪些自定义注解?
- @Target 注解:用于声明自定义注解可以作用的 位置,例如:类、方法、属性等。
- @Retention 注解:用于声明自定义注解生效的 时间,例如:编译时有效、还是运行时有效。
- @Document 注解:用于声明自定义注解在 生成文档 时,要不要把它也带上。
- @Inherited 注解:用于指定注解是否 继承,例如子类继承父类,子类是否继承父类的注解。
一般来说,自定义注解通常要使用 Target 和 Retention 注解来指定自定义注解 作用的位置和时间。
5. 如何获取注解呢?
可以使用 Method.getAnnotation() 方法,通过 反射 来获取到自定义注解对象。
6. 用户的登陆状态是怎么在内存中保存的?
用户的登录状态是通过自定义登陆凭证 来标识的,并通过Redis将这个凭证保存在内存中。
因为最开始考虑到如果将用户的 自定义登录凭证 保存在数据库中。
每次检查用户登录状态时,后端都要从数据久层中拿数据,速度比较慢。
所以考虑添加 Redis 中间件,来将用户的登陆凭证保存在内存中,来加快后端处理的速度。
7. 自定义登陆凭证如何设计的?
自定义的登录凭证设计为 Java 中的一个实体类,包括:
- 用户的 ID、凭证字符串和凭证的失效时间。
因为自定登录凭证在用户登录以后,会在服务端的内存中保留一段时间,所以字段中包含了凭证的失效时间。
这个内存中的失效时间取决于用户在登录时是否勾选 记住我 的按钮:
- 如果没有勾选,设置凭证的失效时间为:1 天。
- 如果勾选了,设置凭证的失效时间为:2 周。