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

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注解并且用户为空,那就重定向到登录页面。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序 蓝牙设备连接,控制开关灯

1.前言 微信小程序中连接蓝牙设备,信息写入流程 1、检测当前使用设备(如自己的手机)是否支持蓝牙/蓝牙开启状态 wx:openBluetoothAdapter({}) 2、如蓝牙已开启状态,检查蓝牙适配器的状态 wx.getBluetoothAdapterState({}) 3、添加…

【先进PID控制算法(ADRC,TD,ESO)加入永磁同步电机发电控制仿真模型研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Kafka第三课

Flume 由三部分 Source Channel Sink 可以通过配置拦截器和Channel选择器,来实现对数据的分流, 可以通过对channel的2个存储容量的的设置,来实现对流速的控制 Kafka 同样由三大部分组成 生产者 服务器 消费者 生产者负责发送数据给服务器 服务器存储数据 消费者通过从服务器取…

负载均衡搭建

LVS-DR部署 [客户端] node1 192.168.157.148 [lvs] node2 192.168.157.142 [web服务器] node3 192.168.157.145 node4 192.168.157.146(1)[lvs] yum install -y ipvsadm.x86_64 配置LVS负载均衡服务 (1)手动添加LVS转发1&#xff…

Vue3 使用json编辑器

安装 npm install json-editor-vue3 main中引入 main.js 中加入下面代码 import "jsoneditor";不然会有报错&#xff0c;如jsoneditor does not provide an export named ‘default’。 图片信息来源-github 代码示例 <template><json-editor-vue class…

一个DW的计算

一个DW的计算 1- 题目: 已知一个DW1.1 要求: 从DW中取出指定的位的值1.1.1 分析1.1.2 实现1.1.3 简化实现1.1.4 验证 2- 题目: 已知一个DW2.1 要求: 从DW中的指定的P和S,取出指定的位的值2.1.1 分析2.1.2 实现 1- 题目: 已知一个DW 有图中所示一行信息&#xff0c;表示一个DW(…

【实用黑科技】如何 把b站的缓存视频弄到本地——数据恢复软件WinHex 和 音视频转码程序FFmpeg

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;效率…

uniapp编写微信小程序遇到的坑总结

1、阻止事件冒泡 使用uniapp开发微信小程序的时候&#xff0c;发现使用click.stop来阻止事件冒泡没有作用&#xff0c;点击了之后发现仍然会触发父组件或者祖先组件的事件。 在网上查阅&#xff0c;发现使用tap.stop才能阻止事件冒泡。 2、二维码生成 在网上找了很多&…

问题:【IntelliJ IDEA】解决idea自动声明变量加finall修饰符问题

问题:【IntelliJ IDEA】解决idea自动声明变量加finall修饰符问题 场景复现 1 new String() 2 快捷方式生成变量 final修饰的 final String s new String();步骤一&#xff1a;确保settings配置信息 settings-----》Editor------》Code Style--------》java下的这两个选项不…

〔013〕Stable Diffusion 之 图片自动评分和不健康内容过滤器 篇

✨ 目录 &#x1f388; 下载咖啡美学评价插件&#x1f388; 咖啡美学评价使用&#x1f388; 不健康内容过滤器插件 &#x1f388; 下载咖啡美学评价插件 想让系统帮你的图片作品打分评价&#xff0c;可以下载咖啡美学自动评价插件插件地址&#xff1a;https://github.com/p1at…

stack和queue的模拟实现

stack和queue的模拟实现 容器适配器什么是适配器STL标准库中stack和queue的底层结构deque的简单介绍deque的缺陷 stack模拟实现queue模拟实现priority_queuepriority_queue的使用priority_queue的模拟实现 容器适配器 什么是适配器 适配器是一种设计模式(设计模式是一套被反复…

稀疏感知图像和体数据恢复的系统对象研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

爬虫逆向实战(十二)--某交易所登录

一、数据接口分析 主页地址&#xff1a;某交易所 1、抓包 通过抓包可以发现登录是通过表单提交的 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块&#xff0c;可以发现有两个加密参数password和execution 请求头是否加密&#xff1f; 无响应是…

中国乡村振兴战略下传统村落文化旅游设计日

中国乡村振兴战略下传统村落文化旅游设计日

unity Dropdown默认选择不选择任何选项

当我们使用Dropdown下拉框时&#xff0c;有时不需要有默认选项&#xff0c;把 value设置为-1就可以了&#xff0c; 但是用代码设置value-1是没有效果的&#xff0c;

AI 绘画Stable Diffusion 研究(九)sd图生图功能详解-老照片高清修复放大

大家好&#xff0c;我是风雨无阻。 通过前面几篇文章的介绍&#xff0c;相信各位小伙伴&#xff0c;对 Stable Diffusion 这款强大的AI 绘图系统有了全新的认知。我们见识到了借助 Stable Diffusion的文生图功能&#xff0c;利用简单的几个单词&#xff0c;就可以生成完美的图片…

运行软件mfc140u.dll丢失怎么办?mfc140u.dll的三个修复方法

最近我在使用一款软件时遇到了一个问题&#xff0c;提示缺少mfc140u.dll文件。。这个文件是我在使用某个应用程序时所需要的&#xff0c;但是由于某种原因&#xff0c;它变得无法正常使用了。经过一番搜索和了解&#xff0c;我了解到mfc140u.dll是Microsoft Visual Studio 2015…

【JVM】JVM中的分代回收

文章目录 分代收集算法什么是分代分代收集算法-工作机制MinorGC、 Mixed GC 、 FullGC的区别是什么 分代收集算法 什么是分代 在java8时&#xff0c;堆被分为了两份&#xff1a; 新生代和老年代【1&#xff1a;2】 其中&#xff1a; 对于新生代&#xff0c;内部又被分为了三…

拒绝摆烂!C语言练习打卡第三天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4…

Docker:Windows container和Linux container

点击"Switch to Windows containers"菜单时&#xff1a; 提示 然后 实际上是运行&#xff1a;com.docker.admin.exe start-service