温故而知新-论坛项目篇【面试复习】

温故而知新-论坛项目篇【面试复习】

前言

2023-08-28 09:31:24

以下内容源自《【面试复习】》
仅供学习交流使用

版权

禁止其他平台发布时删除以下此话
本文首次发布于CSDN平台
作者是CSDN@日星月云
博客主页是https://blog.csdn.net/qq_51625007
禁止其他平台发布时删除以上此话

推荐

温故而知新-论坛项目篇【面试】

论坛项目中注册模块怎么实现的?

前端输入:用户名,密码,和邮箱通过表单提交数据(账号、密码、邮箱)

服务端处理register()

复制代码
调用service层
空值处理 验证账号 验证邮箱
注册用户
密码使用md5盐值加密
激活码UUID

// http://localhost:8080/community/activation/101/code
发送激活邮件

返回操作(注册)-结果(成功)页面|返回注册页面

用户点击激活邮件

服务端调用activation()

复制代码
调用service层
用户状态==1:重复激活
激活码相同:设置状态为1,激活成功
激活失败

跳转到操作(激活)-结果页面

论坛项目中登录模块怎么实现的?

用户进入登录页面,就会请求后端,获取验证码

复制代码
原来是把验证码存入session中
后面是存入cookie中,进而存入redis中
cookie(kaptchaOwner,UUID) (KaptchaKey_redisKey,验证码结果,60s)

用户填写信息:账号、密码、验证码

提交表单

后端就调用login方法

取出验证码的答案

复制代码
原来是session中取出
后来是Cookie-->kaptchaOwner-->(Redis)kaptcha

验证码正确:下一步 ;否则返回错误信息

验证:用户名,密码

复制代码
调用Service层
空值处理 验证账号 验证状态(用户的激活状态) 验证密码
如果都正确就生成登录凭证
原来的登录凭证是插入到一个数据库表中
后来是存入到redis中
通过Map返回错误信息,或者登录凭证

如果有登录凭证,就跳转到首页

如果没有,就返回错误信息

什么是ThreadLocal代替Session存储用户?

为什么要使用多线程本地存储,代替Session?

使用多线程本地存储代替Session的主要原因是解决在多线程环境下使用Session可能出现的线程安全问题。

Session是一个服务器端的存储机制,用于保存用户的会话信息。在多线程环境下,如果不进行额外的处理,每个线程都会共享同一个Session对象,这可能导致以下问题:

线程安全问题:多个线程同时访问和修改同一个Session对象时,可能会引发竞争条件和并发访问问题。这可能导致数据不一致、数据丢失或者系统崩溃。

性能问题:由于Session是服务器端存储,多个线程同时对Session进行读写操作时,可能会引起性能瓶颈。尤其在高并发场景下,频繁的Session读写操作可能成为系统的瓶颈。

为了解决这些问题,可以使用多线程本地存储来代替Session。多线程本地存储是指为每个线程维护一个独立的存储空间,使得每个线程都可以独立操作自己的存储空间,从而避免了线程安全问题和性能问题。

多线程本地存储可以使用ThreadLocal来实现。ThreadLocal是一个线程本地变量,每个线程都有自己独立的ThreadLocal变量副本,并且每个线程可以独立修改自己的副本,而不会影响其他线程的副本。这样就可以在多线程环境下,为每个线程维护独立的存储空间,避免线程安全问题和性能问题。

综上所述,使用多线程本地存储代替Session可以提供更好的线程安全性和性能,在多线程环境下更加可靠和高效。

论坛中显示登录信息功能怎么实现的?

编写一个拦截器:LoginTicketInterceptor

preHandle()

java 复制代码
//Controller执行之前,拿到登录用户
在Cookie中获取凭证
数据库查询登录凭证的状态
存入HostHolder(ThreadLocal) 多线程存储代替Session存储

postHandle()

java 复制代码
//Controller执行之后:把loginUser返回mav
从HostHolder中拿到用户
存入mav中

afterCompletion()

java 复制代码
清理HostHolder

配置WebMvcConfig:登录拦截器

java 复制代码
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
        registry.addInterceptor(loginTicketInterceptor)
                .excludePathPatterns("/**/*.css", "/**/*.js", "/**/*.png", 
                "/**/*.jpg", "/**/*.jpeg");
                
    }

论坛模块中检查登录状态怎么实现的?

编写一个注解:LoginRequired

java 复制代码
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginRequired {

}

给需要登录的功能添加注解:

账号设置功能

新增一个拦截器:LoginRequiredInterceptor

preHandle()

判断Handler(Controller)中的方法有没有LoginRequired的主键

如果有此注解但是HostHolder没有用户的话,跳转到登录页面

java 复制代码
    @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;
    }

配置WebMvcConfig:添加登录拦截

java 复制代码
    public void addInterceptors(InterceptorRegistry registry) {

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

2023-7-31 16:02:49

最后

我们都有光明的未来

祝大家考研上岸
祝大家工作顺利
祝大家得偿所愿
祝大家如愿以偿
点赞收藏关注哦

相关推荐
FreeBuf_8 小时前
朝鲜黑客组织“传染性面试“瞄准macOS:新型“DriverFixer“窃密工具浮出水面
macos·面试·职场和发展
妮妮喔妮8 小时前
大文件上传面试回答要点
面试·大文件上传
牛客企业服务8 小时前
AI面试实用性解析:不是“能不能用”,而是“怎么用好”
人工智能·面试·职场和发展
a努力。8 小时前
宇树Java面试被问:方法区、元空间的区别和演进
java·后端·面试·宇树科技
allan bull9 小时前
在节日中寻找平衡:圣诞的欢乐与传统节日的温情
人工智能·学习·算法·职场和发展·生活·求职招聘·节日
a程序小傲9 小时前
蚂蚁Java面试被问:注解的工作原理及如何自定义注解
java·开发语言·python·面试
杜子不疼.9 小时前
【LeetCode 852 & 162_二分查找】山脉数组的峰顶索引 & 寻找峰值元素
算法·leetcode·职场和发展
东东的脑洞9 小时前
【面试突击】MySQL 查询优化核心面试知识点
mysql·面试·职场和发展
1024肥宅10 小时前
JS复杂去重一定要先排序吗?深度解析与性能对比
前端·javascript·面试