仿牛客论坛项目day4|开发社区登录模块

news2025/1/16 19:57:09

1、发送邮件

使用spring-boot-starter-mail这个包

2、开发注册功能

(1)访问注册页面

功能拆解:

点击顶部的注册按钮,打开注册页面

新增文件:controller->login

具体实现过程:

增加一个getregisterpage的方法,返回注册页面。

对注册模版进行修改。

修改首页模版里的首页和注册的链接。

(2)提交注册数据

功能拆解:

通过表单提交数据

服务端判断账号是否已存在,邮箱是否已注册

服务端发送激活邮箱

具体实现过程:

service->userservice里增加注册方法,完成上述功能。

(3)激活注册账号

具体实现过程:

在service->userservice里增加激活方法,返还激活结果。

controller->logincontroller里增加激活方法,根据service里的激活方法返回的结果进行判断,如果结果表示成功,就给模版添加success,如果失败,就给模版添加defeat

3、会话管理

分布式时使用session会有问题。解决方法:粘性session,同一个ip分给同一个服务器,但是负载不均衡;同步session,某个服务器上有session后同步给别的服务器,但是影响性能并且服务器产生耦合;共享session,让一个服务器专门存session,但是这台服务器挂了就完了;主流方法:将敏感数据存redis(非关系型)数据库,不敏感消息存cookie。

CookieSession 是两种在Web开发中常用的保存用户状态信息的技术。

  1. Cookie

    • 定义:Cookie是一种在远程浏览器端存储数据,并以此来跟踪和识别用户的机制。服务器通过HTTP响应头向客户端浏览器发送一些数据,浏览器会将这些数据存储起来,并在后续的HTTP请求中将这些数据作为HTTP请求头发送回服务器。
    • 存储位置:存储在用户的浏览器上。
    • 存储大小:每个Cookie的大小通常不超过4KB。
    • 存储时间:有时间限制,可以设定为持久化或者是会话级别的(当浏览器关闭时Cookie会被删除)。
    • 安全性:相对较低,因为保存在客户端,所以不应该用来存储敏感信息。
    • 用途:用于存储一些不太敏感的信息,例如用户的登录状态、购物车信息、用户偏好设置等。
  2. Session

    • 定义:Session是一种在服务器端保持状态信息的解决方案。当客户端首次请求服务器时,服务器会创建一个session,并将相关信息保存在服务器上,然后将session的标识符通过Cookie或URL重写的方式传递给客户端,客户端再次访问时会携带该标识符,服务器会查找已经创建的session并恢复用户的状态信息。
    • 存储位置:存储在服务器上。
    • 存储大小:由服务器的内存大小决定,一般来说比Cookie能存储的数据要多。
    • 存储时间:有时间限制,通常为30分钟。
    • 安全性:相对较高,因为保存在服务器端,客户端无法直接访问。
    • 用途:用于存储敏感信息,例如用户的登录信息、购物车信息等。

4、生成验证码

kapcha

5、开发登录、退出功能

功能拆解:

(1)访问登录页面

(2)登录

验证账号、密码、验证码

成功时,生成登录凭证,发送给客户端

失败时,跳转回登陆页面

(3)退出

将登陆凭证改为失效状态

跳转至网站首页

具体实现:

登录凭证(login ticket)通常与cookie和session一起使用来验证用户的登录状态。以下是一种常见的使用流程:

  1. 用户登录:当用户首次登录应用时,后端会验证用户的凭据(如用户名和密码)。如果验证通过,后端将创建一个登录凭证(login ticket),并将其保存在数据库中。

  2. 设置cookie:创建登录凭证后,后端将把登录凭证的值(通常是一个唯一的随机字符串)放入一个cookie中,并将该cookie发送到用户的浏览器。浏览器会将该cookie保存在本地。

  3. 后续请求:当用户向服务器发送后续请求(例如浏览页面、提交表单等)时,浏览器会自动将之前保存的cookie一同发送到服务器。服务器可以通过cookie中的登录凭证值来验证用户的登录状态。

  4. 验证登录凭证:当服务器收到一个包含登录凭证的请求时,它会将登录凭证与数据库中的记录进行匹配。如果登录凭证有效(未过期、未被注销、与数据库中的记录匹配),则服务器会视用户为已登录,并处理用户的请求。如果登录凭证无效,服务器可能会要求用户重新登录。

  5. 登出:当用户选择登出时,服务器将会使数据库中的登录凭证无效(例如设置其状态为1),并可能清除用户浏览器中的cookie。这样,即使用户再次发送之前的登录凭证,服务器也不会再认为用户是登录状态。

6、显示登录信息

功能拆解:

根据登陆与否,首页显示不同内容

具体实现:

使用拦截器。  拦截器在请求之前从cookie里获取ticket,根据ticket获取到user。在请求之后,将user给模版。在模版之后清除数据。

在Spring Boot中,你可以使用拦截器(Interceptor)来实现基于用户登录状态的内容显示。拦截器可以拦截和处理请求,再将请求传递到相应的控制器(Controller)。

下面是一个简单的例子,展示如何使用拦截器实现这个功能:

  1. 创建拦截器类:首先,你需要创建一个类并实现HandlerInterceptor接口。这个类里有三个方法:第一个是获取用户,第二个是将用户放入模版,第三个是清除用户
  2. 注册拦截器:在配置类中,实现WebMvcConfigurer接口并重写addInterceptors方法,注册拦截器。配置拦截器的作用范围。
  3. 在控制器中使用用户信息:在控制器方法中,你可以通过HttpServletRequest对象获取之前存入请求中的用户信息,并根据用户登录状态显示不同的内容。在community项目中,直接改index.html模版。

7、账号设置

功能拆解:

上传头像和修改密码(访问账号设置页面,上传头像,获取头像)

具体实现:

在login controller里添加上传和获取头像的方法:

  1. getSettingPage()方法:在"/setting"路径上,通过GET方法请求设置页面。

  2. uploadHeader()方法:在"/upload"路径上,通过POST方法上传头像图片。该方法接收一个MultipartFile参数,该参数表示用户上传的文件。该方法首先检查文件是否存在、是否有后缀。然后将文件保存到指定路径,并将头像的URL更新到数据库中。最后,该方法将重定向到首页。

    • 先检查上传的文件是否为空,为空则返回一个错误消息。
    • 提取文件的后缀名,并检查其有效性。
    • 生成一个随机的文件名,并确定文件的存储路径。
    • 使用transferTo()方法将上传的文件保存到指定路径。
    • 更新用户的头像URL,并保存到数据库中。
    • 重定向到首页。
  3. getHeader()方法:在"/header/{fileName}"路径上,通过GET方法请求头像图片。该方法接收一个@PathVariable参数fileName,表示请求的头像文件名。该方法会根据文件名找到服务器上的文件,然后将文件作为HTTP响应发送回客户端。

    • 提取文件的后缀名,并设置响应的ContentType。
    • 使用FileInputStreamHttpServletResponseOutputStream来将文件读入内存,并写入到HTTP响应中。
    • 如果发生IO异常,则在日志中记录错误消息。

问题:

头像的url和本地的upload路径有什么关系吗

回答:

头像的URL和本地的上传路径有直接的关系。URL通常是一个可以在Web浏览器中访问的地址,而上传路径是文件在服务器文件系统上的物理存储位置。当用户请求查看头像时,服务器会根据URL找到对应的本地文件路径,然后将文件发送给用户。

下面是你的代码中这两者关系的详细说明:

  1. 你的代码中,当用户上传新的头像图片时,uploadHeader()方法会将图片文件保存到uploadPath指定的本地目录中。这个uploadPath是文件在服务器上的物理存储路径。

  2. 接着,代码会生成一个可以在Web浏览器中访问的URL,然后将这个URL保存到数据库中,作为用户头像的Web访问地址。这个URL由domaincontextPath和文件名组成。

  3. 最后,当用户请求查看头像时(比如访问/user/header/xxx.png),getHeader()方法会根据fileName参数找到本地存储的文件(使用uploadPathfileName构造完整的本地路径),然后将文件发送给用户。

8、检查登录状态

功能拆解:

使未登录用户无法使用某些功能。使用拦截器,拦截所有请求,只处理带有该注解的方法。

自定义注解:

元注解是用来标记和定义其他注解的注解,它们提供了注解应该如何被处理的元数据。

下面是几个常见的元注解及其用途:

  1. @Retention: 该元注解定义了注解的保留策略。它有三个可选值:RetentionPolicy.SOURCE(只在源代码中保留)、RetentionPolicy.CLASS(在.class文件中保留)和RetentionPolicy.RUNTIME(在运行时保留,可通过反射访问)。

  2. @Target: 该元注解指定了注解可以应用于哪些Java元素(类、方法、字段等)。

  3. @Documented: 该元注解表示当使用javadoc生成文档时,该注解应该被包含在其中。

  4. @Inherited: 该元注解表示如果一个类使用了被此元注解标记的注解,那么它的子类也会自动继承这个注解。

具体实现:

1、新增login required注解

2、对需要限制(设置头像)的两个方法打上注解

3、创建login required拦截器,里面重写preHandle方法:这个方法读取method,取method的loginrequired注解,如果是login required注解并且用户为空,那就重定向到登录页面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/896577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图片文字识别-管理敏感词

目录 什么是OCR Tess4j案例 图片文字识别-管理敏感词 什么是OCR OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其…

win10新镜像和Navicat连接orcle数据库nodejs安装,xshell

原版软件 (itellyou.cn) 使用navicat远程连接oracle数据库_True To The Core的博客-CSDN博客 Navicat Premium 12连接Oracle时提示oracle library is not loaded的问题解决_泥巴城的博客-CSDN博客 下载最新orcle客户端就可以正常连接了 nodejs安装和环境配置-Windows_nodejs…

C++ Builder 关于TRichEdit的字符颜色标记处理

//积累经验每一天,以后忘记好搜索 void __fastcall TForm2::btn3Click(TObject *Sender) { //初始化验证 mmo->SelStart0; mmo->SelLengthmmo->Text.Length(); mmo->SelAttributes->ColorclBlack; String CGhEd…

数字孪生助力智慧水务:科技创新赋能水资源保护

智慧水务中,数字孪生有着深远的作用,正引领着水资源管理和环境保护的创新变革。随着城市化和工业化的不断推进,水资源的可持续利用和管理愈发显得重要,而数字孪生技术为解决这一挑战提供了独特的解决方案。 数字孪生技术&#xf…

教育行业软文怎么写,媒介盒子无偿分享

随着产业升级和技术变革、信息的智能化、数字化发展,也为教育行业带来了新的增长点,在线教育课程类型丰富多元,新课程不断涌现。在激烈的市场竞争环境下,教育机构如何根据市场实行差异化战略并加强自身品牌建成为挑战。 如今&…

牛客小白月赛70E题题解

文章目录 [ 小d的博弈](https://ac.nowcoder.com/acm/contest/53366/E)问题建模问题分析1.分析操作代码 小d的博弈 问题建模 给定一个n*m的矩形,有两个玩家,每次轮流选择某行或某列,然后以该行或该列将矩形分成两个,且取面积较小…

Spring Boot实践八--用户管理系统

1,技术介绍 技术选型功能说明springboot是一种基于 Spring 框架的快速开发应用程序的框架,它的主要作用是简化 Spring 应用程序的配置和开发,同时提供一系列开箱即用的功能和组件,如内置服务器、数据访问、安全、监控等&#xff…

一次性讲清OAuth2.0授权

文章目录 什么是OAuth2.0授权OAuth2.0工作原理OAuth2.0应用示例OAuth2.0授权模式授权码模式简化模式设备码模式 如何申请应用及密钥等信息 什么是OAuth2.0授权 OAuth2.0是一种用于授权的开放标准,它允许用户授权第三方应用访问其在另一个应用中存储的信息&#xff…

网络每日一练

吴泽彬 C Ip 网络层 Tcp udp 传输层, Http 应用层 收起 1 回复 发布于 2019-10-11 12:07 举报 fighting2016 Java A类地址中的私有地址和保留地址: ①10.0.0.0到10.255.255.255是私有地址(所谓的私有地址就是在互联网上不使用,而被…

ASEMI探索整流桥GBU814的独特优势和应用领域

编辑-Z 整流桥GBU814在众多电子元件中独树一帜,可在多种设备中发挥其重要作用。作为一款集高效性能和可靠稳定性于一身的整流桥,GBU814已在全球范围内赢得了广泛的好评。在这篇文章中,我们将详细介绍GBU814整流桥的优势和应用领域。 让我们首…

对比 VPN 与远程桌面软件,为什么远程桌面更优越

数字格局不断演变,我们的工作和连接方式也在不断变化。企业纷纷转向远程运营,有关推进向远程过渡的最佳技术的争论从未停止。争论的焦点通常是虚拟专用网络(VPN)和远程桌面软件。 长期以来,VPN 一直被用作访问公司网络…

pytorch 实现VGG

VGG全称是Visual Geometry Group,因为是由Oxford的Visual Geometry Group提出的。AlexNet问世之后,很多学者通过改进AlexNet的网络结构来提高自己的准确率,主要有两个方向:小卷积核和多尺度。而VGG的作者们则选择了另外一个方向&a…

OJ练习第150题——分割回文串

分割回文串 力扣链接&#xff1a;131. 分割回文串 题目 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 Java代码 class Solution {List<List…

锐捷无线产品运维(Web登录、 命令行登录)

目录 登录AP产品 Console登录&#xff08;只可以现场登录&#xff09; Web/Telnet/SSH登录&#xff08;可以现场、远程登录&#xff09; 配置AP的管理地址 通过Web界面远程登录 通过Telnet、SSH等命令行的方式登录 登录AC产品 Console登录&#xff08;只可以现场登录&a…

el-button实现按钮,鼠标移入显示,移出隐藏

2023.8.18今天我学习了 如何实现鼠标移入显示按钮&#xff0c;鼠标移出隐藏按钮。 效果如图&#xff1a; 鼠标移入时&#xff1a; 鼠标移出时&#xff1a; mouseover //鼠标移入事件 mouseleave //鼠标移出事件 原本我是想直接在el-button写入这两个方法&#xff0c;但是elem…

【EI会议征稿】第四届经济管理与大数据应用国际学术会议(ICEMBDA 2023)

第四届经济管理与大数据应用国际学术会议(ICEMBDA 2023&#xff09; The 4th International Conference on Economic Management and Big Data Application(ICEMBDA 2023) 第四届经济管理与大数据应用国际学术会议(ICEMBDA 2023)定于2023年10月27-29日在中国天津举行。本次会…

linux 安装pycococreator和pycocotools

目录 1.&#x1f438;安装pycococreatortools&#x1f438; &#x1f353;&#x1f353;安装方式1 &#x1f353;&#x1f353;安装方式2 2.&#x1f438;安装pycocotools&#x1f438; &#x1f353;&#x1f353;安装方式1 &#x1f353;&#x1f353;安装方式2 整理不…

大模型时代,图像描述生成(image caption)怎么走?

背景 Image caption是计算机视觉研究领域中的一个重要分支&#xff0c;其主要目标是根据输入的图像信息&#xff0c;生成相应的文字描述&#xff0c;从而完成对图像内容的准确描述。对于图像描述任务而言&#xff0c;最关键的是能够将图片中的信息以清晰准确的文字形式展现出来…

OPPO A57刷机资源(附简略教程)

https://www.123pan.com/s/hcAqVv-fpHWd.html提取码:buAp 图中画框的为必须下载的&#xff08;xiaomiflash和twrp必须解压后使用&#xff09; ​ 打开xiaomiflash点击driver点击install&#xff08;就是框住的按钮&#xff09;等待安装完成 ​用数据线将oppo a57与电脑连接&a…

VMware Workstation搭建Centos7虚拟机详细步骤

直接按照图文步骤进行操作即可。 目录 1、新建虚拟机 2、典型安装 3、稍后安装操作系统 4、版本选择CentOS 7 64位 5、设置虚拟机的名称和位置 6、设置磁盘大小 7、虚拟机向导任务完成 8、虚拟机设置 9、开启虚拟机 10、正式安装虚拟机第一步 11、选择安装时的语言 …