仿牛客技术博客项目常见问题及解答(一)

本文介绍了项目中用户注册、唯一性检验、激活逻辑的实现,以及使用SpringBoot的原因。用户登录后,信息存储在数据库和Redis,并通过拦截器处理登录状态。MD5加密用于密码保护,但结合加盐处理增强安全性。此外,讨论了线程安全和Redis缓存提高性能的方法。

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

1.如何实现项目的注册问题

用户注册对于开发人员来说就是在数据库表中插入一条新的用户数据。在我们这个项目中就是在user表中插入一条新数据,我们可以按照注册功能实现的以下三个请求来进行开发

我们对每一个请求的开发都是由Dao——>sevice——controller层

我们在插入数据前,会对数据进行空值验证,对账号邮箱进行重复性验证,使用map来存储错误信息,如果controller层拿到的map为空就说明注册成果,进行后续的激活处理。在插入数据时,会对密码进行加盐处理后,在使用MD5算法进行加密,然后存储到数据库,最开始的数据Status设为0,表示无效,需要进行激活处理。

激活逻辑:

2.项目如何实现用户唯一性检验

在创建MySQL表时,使用unqiue关键字保证用户名username字段的唯一性。另外,在注册用户时进行重复性验证,如果已经用户已经存在,不能进行注册。

3.项目的部署

4.项目中为什么要选用SpringBoot

 

用SpringBoot来简化项目的开发,Springboot具备以下优势:

 

一、独立运行

Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。

二、简化依赖

spring-boot-starter-web启动器自动依赖其他组件,简少了maven的配置。

三、自动配置

Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。

四、无代码生成和XML配置

Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。

 

5.登录状态保存在哪

最开始考虑保存在数据库中

保存在用户凭证表,包括用户id,用户凭证,用户状态和过期时间,对于用户凭证表是0有效1无效。在登录时验证账号密码是否为空,或者密码是否错误等,如果没有错误就生成登录凭证,代码如下

 后面用redis进行优化,将用户的登录凭证存入redis,如下:

 

6.用户登陆上之后怎么显示登录页面

根据登录与否,主页显示的信息会有不同。显示登录信息这个功能是一个共有的功能,对每一个请求都需要处理,所以采用拦截器来实现,集中统一的,以一个低耦合度的方式来处理。拦截器能够拦截浏览器访问过来的请求,然后处理每个请求共有的业务。

用户在登录后会以ticketkey,以及实际的ticketvalue创建一个cookie存入浏览器,之后服务端根据用户凭证在用户凭证表中查询user信息封装在模板中然后返回给浏览器(后面用redis优化了,不是根据ticket在表中取,而是ticke是一个对象,它含有userId的成员属性!!,然后根据userIduser表中取user信息。redisticket序列化为字符串后存入。)。代码和流程如下图所示

这个过程是每一个用户登录都会存在的,所以我们需要拦截器来处理。同时对于服务端来说,同时可能会有大量的浏览器请求,所以这里还涉及到线程安全问题。

 

redis优化!!!!  将用户信息缓存到redis中,优先从缓存中取值:

 

拦截器:1.自定义拦截器 2.配置拦截器

首先验证用户

经过controller后,返回到拦截器,拦截器再将用户信息存入model

自定义拦截器需要实现HandlerInterceptor,然后重写preHandle(controller前执行),postHandle(controller后执行),以及afterCompletion(模板解析后执行)

配置拦截器:需要实现WebMvcConfigurer接口,然后重写addInterceptors方法,排除拦截静态页面。

采用ThreadLocal来保存用户信息,保证线程安全性

ThreadLocal源码:

从上面的代码可以看出,ThreadLocal  set赋值的时候首先会获取当前线程thread,并获取thread线程中的ThreadLocalMap属性。如果map属性不为空,则直接更新value值,如果map为空,则实例化threadLocalMap,并将value值初始化

ThreadLocalMap是ThreadLocal的内部静态类,而它的构成主要是用Entry来保存数据 ,而且还是继承的弱引用。在Entry内部使用ThreadLocal作为key,使用我们设置的value作为value

通过当前线程对象的getMap()方法获取ThreadMap对象 然后将当前ThreadLocal对象作为key值存入map 这能保证线程内的资源共享而不同线程之间独立

 

7.md5原理知道吗?安全吗?可逆吗?

可以将MD5算法看作一台机器,计算机的任何内容(字符串,图片,视频等)被丢进去都将输出一个长度为128比特的MD5值。

输入消息相同,结果也会始终相同,不同的消息,结果则不同。MD5原理简述:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

MD5的安全性:普遍认为MD5是很安全,因为暴力破解的时间是一般人无法接受的。实际上如果把用户的密码MD5处理后再存储到数据库,其实是很不安全的。因为用户的密码是比较短的,而且很多用户的密码都使用生日,手机号码,身份证号码,电话号码等等。或者使用常用的一些吉利的数字,或者某个英文单词。如果我把常用的密码先MD5处理,把数据存储起来,然后再跟你的MD5结果匹配,这时我就有可能得到明文。因此在我们这个项目中,会将用户密码进行加盐处理(密码末尾加随机的字符串)然后再进行MD5加密存入数据库。 

 MD5是否可逆:不可逆,原因是MD5是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的。

### 类似于牛客网项目的前端技术栈 #### 技术选型 对于类似牛客网这样的在线编程教育平台,通常会选择套成熟稳定的前端技术栈来支持其复杂的功能需求。常见的技术组合包括: - **HTML/CSS/JavaScript**: 这些是最基础也是必不可少的部分,用于构建网页结构、样式以及交互逻辑[^2]。 - **Vue.js 或 React.js**: Vue 和 React 是目前非常流行的两种 JavaScript 框架,它们能够帮助开发者高效地管理界面状态并创建动态视图。考虑到用户体验和性能优化,在线编程平台往往倾向于选用这类框架之作为主要的 UI 库。 - **Webpack/Babel**: Webpack 负责打包资源文件,Babel 则可以将现代 ES6+ 的语法转换成兼容性更好的旧版本 JS 代码,确保不同浏览器环境下都能正常运行应用。 - **Axios/Vue Resource (如果选择了Vue)**: Axios 是个基于 Promise 的 HTTP 客户端库,可用于发起 AJAX 请求并与后端 API 进行通信;如果是采用 Vue 构建的应用,则也可以考虑使用专门为其定制的 `vue-resource` 插件。 - **ElementUI/Ant Design of Vue**: 对于企业级应用场景来说,选择合适的组件库非常重要。这两个都是基于 Vue 开发的企业级 UI 组件库,提供了丰富的预设组件,有助于加快开发进度并保持致的设计风格。 - **Vuex (针对Vue项目)**: Vuex 是专门为 Vue 设计的状态管理模式加插件,它可以帮助我们更好地管理和共享全局数据,特别是在大型单页应用程序(SPA) 中尤为有用。 - **ECharts/D3.js**: 如果涉及到图表展示的需求,那么 ECharts 或者 D3.js 就是非常好的选择。前者简单易用且功能强大,后者则更加灵活多变,适合处理复杂的可视化任务。 #### 工具链 为了提高开发效率和支持持续集成部署(CI/CD),还会引入系列辅助工具和服务: - **Git/GitHub/GitLab**: 版本控制系统及其托管服务平台,方便团队协作开发及代码管理。 - **ESLint/Prettier**: 编码规范检查器与自动格式化工具,保障代码质量的致性和可读性。 - **Jest/Karma/Mocha**: 单元测试框架,用来验证各个模块是否按预期工作。 - **Selenium/Appium**: 测试自动化工具集,适用于执行端到端(E2E) 测试案例。 - **Docker**: 容器编排解决方案,简化环境配置过程,便于快速搭建本地开发环境或生产环境中的键部署流程。 通过上述技术和工具的支持,可以使像牛客网这样规模较大的互联网产品具备良好的扩展性和稳定性,同时也提高了整体的研发效能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李孛欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值