登录与注册功能(简单版)(3)登录时使用Cookie增加记住我功能

目录

1、实现分析

2、步骤

1)新建login.jsp

2)修改LoginServlet:

3)启动访问:

3、安全性考虑

4、最佳实践思路

1)选择安全的认证机制

2)强化会话管理

3)安全地存储用户凭证

4)使用HTTPS

5)安全的Cookie管理

6)定期审查和更新

7)提醒用户


1、实现分析

需求:勾选“记住我” ,下次访问登陆页面自动填充用户名密码。

怎样自动填充用户名和密码?

记住我功能要实现的效果:用户把浏览器关闭过几天再来访问也能自动填充,所以需要将登陆信息存入一个可以长久保存、并且能够在浏览器关闭、重启后依然有效的地方:使用Cookie。

将用户名和密码写入Cookie中,并持久化存储Cookie,下次访问浏览器,发送请求时会自动携带Cookie。

在页面获取Cookie数据后,设置到用户名和密码框中。

什么时候写入Cookie?
登录成功且用户在登录页面勾选了记住我的复选框。

流程分析:

  • 前端需要在发送请求和数据的时候,多携带一个用户是否勾选记住我的数据。
  • LoginServlet获取到数据后,调用Service完成用户名和密码的验证。
  • 登录成功,并且用户在前端勾选了记住我,需要向Cookie中写入用户名和密码的数据,并设置Cookie的有效期。
  • 将数据响应给前端,这时后端返回给前端的Cookie数据就已经存储好了。
  • 在页面获取Cookie中的数据,并把数据设置到登录页面的用户名和密码框中。

2、步骤

1)新建login.jsp

在webapp中新建;使用JSP相较于HTML在此功能更有优势)

JSP(Java Server Pages):Java 服务端页面。是一种动态的网页技术,其中既可以定义 HTML、JS、CSS等静态内容,也可以定义 Java代码的动态内容,也就是 JSP = HTML + Java。

作用:简化开发,避免了在Servlet中直接输出HTML标签(频繁地用response.getWriter().write()方法输出)。

JSP页面最终会被Web服务器(Tomcat)转换为Servlet,然后由Java Web容器执行。

使用Servlet进行逻辑代码开发、使用JSP进行数据展示,已过时。

更多的是使用 HTML +  Ajax:

使用Servlet进行后端逻辑代码开发、使用HTML进行数据展示:HTML是静态页面,怎么进行动态数据展示呢?这就是 Ajax 的作用了。

为了可以在页面获取Cookie中的数据,使用JSP+EL表达式:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>登录</title>
</head><body><form action="login" method="post" id="form"><p>用户名:<input id="username" name="username" value="${cookie.username.value}" type="text"></p><p>密码:<input id="password" name="password" value="${cookie.password.value}" type="password"></p><p>记住我<input id="remember" name="remember" value="1" type="checkbox"></p><input type="submit" class="button" value="登录"></form>
</div>
</body>
</html>

EL表达式:

主要作用是获取数据。其实就是从域对象中获取数据,然后将数据展示在页面上。

${cookie.key.value}   

key:存储在Cookie中的键的名称

获取用户名的值: ${cookie.username.value}

获取密码的值:${cookie.password.value}

JavaWeb中有四大域对象:

page:当前页面有效
request:当前请求有效,包括请求转发forward
session:当前会话有效
application:当前应用有效

EL表达式获取数据会依次从这4个域(作用范围从小到大)中寻找,直到找到为止。

记住我复选框:在用户提交表单时,前端将checkbox的状态(选中或未选中,这里将选中的值设为1,用于之后的判断)作为请求的一部分发送到后端。

2)修改LoginServlet:

获取复选框的值并在登录成功后进行设置Cookie

@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取参数String username = request.getParameter("username");String password = request.getParameter("password");//获取复选框数据String remember=request.getParameter("remember");//使用MyBatis查询数据表,如果用传来的参数能查到User对象,则成功登录//MyBatis的使用步骤String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.selectUser(username, password);sqlSession.close();//进行响应response.setContentType("text/html;charset=utf-8");PrintWriter writer=response.getWriter();if (user!=null){//登录成功//判断用户是否勾选记住我,字符串写前面是为了避免出现空指针异常if("1".equals(remember)){//勾选了记住我 :发送Cookie//1. 创建Cookie对象Cookie c_username=new Cookie("username",username);Cookie c_password=new Cookie("password",password);// 设置Cookie的有效期c_username.setMaxAge(60*60*24*7); //一周c_password.setMaxAge(60*60*24*7);//2. 发送response.addCookie(c_username);response.addCookie(c_password);}//将登陆成功后的user对象存储到sessionHttpSession session=request.getSession();session.setAttribute("user",user);request.setAttribute("username",username);request.getRequestDispatcher("/SuccessServlet").forward(request,response);}else {writer.write("登录失败");}}}

3)启动访问:

只有用户名和密码输入正确且勾选了remeber的复选框,在响应头中才可以看到Cookie数据:

​​​​​​​​​​​​​​登录成功并勾选了记住我后,后端返回给前端的Cookie数据就已经存储好了,接下来就需要在页面获取Cookie中的数据,并把数据设置到登录页面的用户名和密码框中。

关闭浏览器,重新访问登录页面:用户和密码已经被填充。

3、安全性考虑

虽然确实可以将用户名和密码(或任何其他数据)写入Cookie中,并通过设置Cookie的持久化属性使其在浏览器中保存一段时间,但是不推荐将敏感信息如用户名和密码存储在Cookie中。

原因:

  1. 安全性问题:Cookie是在客户端(即用户的浏览器)上存储的。这意味着任何能够访问用户计算机的人或恶意软件都可以读取这些Cookie。因此,将用户名和密码存储在Cookie中会使这些信息面临被窃取的风险。

  2. 明文存储:默认情况下,Cookie是以明文形式存储的。即使通过某种方式加密了用户名和密码,但如果加密密钥也存储在客户端或易于访问的地方,那么这些信息仍然可能面临被解密的风险。

  3. 会话劫持:如果攻击者能够获取到包含用户名和密码的Cookie,他们可以伪造请求,冒充合法用户访问应用,导致会话劫持。​​​​​​​

更好的做法

使用安全的认证机制,如OAuth、OpenID Connect或简单的用户名/密码认证结合安全的会话管理。在用户名/密码认证中,当用户成功登录后,服务器应该生成一个唯一的会话ID,并将其存储在Cookie中。这个会话ID应该与服务器上的会话数据相关联,而不是直接包含用户名和密码。其中可以包含用户的认证状态和其他必要信息。这样,即使敏感信息不在客户端存储,也可以通过会话ID识别已登录的用户。即使Cookie被窃取,攻击者也无法直接获取到用户的敏感信息。同时,使用HTTPS来加密浏览器和服务器之间的通信也是至关重要的,即使Cookie被窃取,攻击者也无法轻易解密其中的内容,从而确保Cookie在传输过程中的安全性。

总之,虽然技术上可以将用户名和密码写入Cookie并持久化存储,但出于安全考虑,应该采用更安全的会话管理方法来处理用户的认证状态。

4、最佳实践思路

安全地使用“记住我”功能的最佳实践涉及到多个方面,包括认证机制的选择、会话管理的安全性以及用户凭证的存储和处理。以下是一些关键的最佳实践:

1)选择安全的认证机制

  • OAuth/OpenID Connect:使用OAuth或OpenID Connect等第三方认证服务。这些服务提供了更高级别的安全性,并且通常已经解决了许多常见的安全问题。

  • 用户名/密码认证:如果使用传统的用户名/密码认证,确保密码策略足够强大,包括要求密码长度、复杂度,并定期提示用户更改密码。

2)强化会话管理

  • 会话ID:使用不可预测的、足够长的会话ID,并且不要将用户ID或其他敏感信息直接编码在会话ID中。

  • 会话有效期:限制“记住我”功能的会话有效期,避免长期会话带来的潜在风险。定期要求用户重新登录,特别是在敏感操作之前。

  • 会话固定:实施会话固定策略,以防止会话劫持。当用户登录时,生成一个新的会话ID,并立即使之前的会话ID失效。

  • 会话注销:提供明确的会话注销机制,并确保在用户登出时,所有相关的会话数据都被正确清除。

3)安全地存储用户凭证

  • 加密存储:用户凭证(如密码)应始终以加密形式存储,并且使用强加密算法和安全的密钥管理策略。

  • 避免明文存储:绝不要以明文形式存储或传输用户凭证,包括在“记住我”功能的实现中。

4)使用HTTPS

  • 全程加密:确保整个应用都使用HTTPS,包括登录页面、认证过程和所有后续的用户交互。这可以防止中间人攻击和数据泄露。

5)安全的Cookie管理

  • HttpOnly和Secure标志:为存储会话信息的Cookie设置HttpOnly和Secure标志,防止跨站脚本攻击(XSS)和未加密的传输。

  • 避免在Cookie中存储敏感信息:不要在Cookie中直接存储用户的敏感信息,如密码或加密密钥。

6)定期审查和更新

  • 安全检查:定期检查是否有潜在的安全漏洞或风险。

  • 更新和补丁:及时应用安全更新和补丁,以修复已知的安全问题。

7)提醒用户

  • 不要在公共计算机或不受信任的网络环境中使用此功能。

  • 定期查看和修改他们的登录信息。

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

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

相关文章

Unity 粒子在UI中使用时需要注意的地方

最近项目中要在UI中挂载粒子特效,美术给过来的粒子直接放到UI中会有一些问题,查询一些资料后,总结了一下 一: 粒子的大小发生变化,与在预制件编辑中设计的大小不同 在预制件编辑模式下,大小正常 实际使用的时候特别大或者特别小 经过检查,发现预制件编辑模式下,默认画布的Rend…

上位机图像处理和嵌入式模块部署(qmacvisual点线测量)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 上面一篇文章&#xff0c;我们完成了直线的拟合操作。在实际场景中&#xff0c;拟合之后更多地是需要进行长度的测量。既然是测量&#xff0c;那么…

【JavaScript 漫游】【040】Blob 对象

文章简介 本篇文章为【JavaScript 漫游】专栏的第 040 篇文章&#xff0c;对浏览器模型中的 Blob 对象进行了总结。 概述 Blob 对象表示一个二进制文件的数据内容&#xff0c;比如一个图片文件的内容就可以通过 Blob 对象读写。它通常用来读写文件&#xff0c;它的名字是 Bi…

哪些企业适合构建企业新媒体矩阵?

⭐关注矩阵通服务号&#xff0c;探索企业新媒体矩阵搭建与营销策略 新媒体矩阵就是在某个平台或多个平台开设、联动多个账号&#xff0c;组建有关系的不同账号集群。 在数字化转型的浪潮下&#xff0c;矩阵已然成为企业实现品牌塑造、市场开拓与用户互动的重要阵地。 然而&…

2024Android-目前最稳定和高效的UI适配方案!你头秃都没想到还能这样吧!

但是这个方案有一个致命的缺陷&#xff0c;那就是需要精准命中才能适配&#xff0c;比如1920x1080的手机就一定要找到1920x1080的限定符&#xff0c;否则就只能用统一的默认的dimens文件了。而使用默认的尺寸的话&#xff0c;UI就很可能变形&#xff0c;简单说&#xff0c;就是…

记一次由于buff/cache导致服务器内存爆满的问题

目录 前言 复现 登录服务器查看占用内存进程排行 先了解一下什么是buff/cache&#xff1f; 尝试释放buffer/cache /proc/sys/vm/drop_caches dirty_ratio dirty_background_ratio dirty_writeback_centisecs dirty_expire_centisecs drop_caches page-cluster swap…

ideaSSM 人才引进管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 人才引进管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

分布式链上随机数和keyless account

1. 引言 相关论文见&#xff1a; Aptos团队2024年论文 Distributed Randomness using Weighted VRFs 相关代码实现见&#xff1a; https://github.com/aptos-labs/aptos-core&#xff08;Rust&#xff09; 在链中生成和集成共享随机数&#xff0c;以扩展应用和强化安全。该…

G - Find a way

题目分析 1.双重bfs,遍历两个起点求最短路再计算总和即可 2.唯一的坑点在于对于一个KFC&#xff0c;两人中可能有一个到不了&#xff0c;所以还要对到不了的点距离做处理 #include <bits/stdc.h> using namespace std; using ll long long; const int N 220;struct pos…

交通事故档案管理系统|基于JSP技术+ Mysql+Java+Tomcat的交通事故档案管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

docker 修改日志存储路径

docker 日志默认存放在 /var/lib/docker/ 下 docker info修改步骤&#xff1a; 1、停止docker服务 systemctl stop docker 2、新建配置文件 vi /etc/docker/daemon.json添加如下内容 {"data-root": "/data/docker" }3、然后把之前的数据全部复制到新目…

十、C#基数排序算法

简介 基数排序是一种非比较性排序算法&#xff0c;它通过将待排序的数据拆分成多个数字位进行排序。 实现原理 首先找出待排序数组中的最大值&#xff0c;并确定排序的位数。 从最低位&#xff08;个位&#xff09;开始&#xff0c;按照个位数的大小进行桶排序&#xff0c;将…

将OpenCV与gdb驱动的IDE结合使用

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV4.9.0开源计算机视觉库在 Linux 中安装 下一篇&#xff1a;将OpenCV与gcc和CMake结合使用 ​ 能力 这个漂亮的打印机可以显示元素类型、、标志is_continuous和is_subm…

【Java常用API】简单爬虫练习题

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

0基础学习VR全景平台篇第146篇:为什么需要3D元宇宙编辑器?

一.什么是3D元宇宙编辑器&#xff1f; 3D元宇宙编辑器是全新3DVR交互渲染创作工具&#xff0c;集3D建模、虚拟展厅、AI数字人等能力&#xff0c;渲染和虚拟现实技术于一身的生产力工具。 具有跨平台和随时随地编辑等特点&#xff0c;可广泛应用于展会、展厅、博物馆、可视化园…

uniapp_微信小程序客服

一、调用api 二、代码 <button open-type"contact">客服</button> 三、小程序后台添加客服人员就行

Ubuntu学习笔记之Shell与APT下载工具

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Ubuntu Shell操作 简单的说Shell 就是敲命令。国内把 Linux 下通过命令行输入命令叫…

CSS隐藏video标签中各种控件

1.edio标签加上controls会出现视频控件&#xff0c;如播放按钮、进度条、全屏、观看的当前时间、剩余时间、音量按钮、音量的控制条等等 <video type"video/mp4" src"" autoplay"" style"width: 400px; height: 300px;" id"e…

idea 2023 spring initializr 没有JDK1.8选项的解决方法

在升级最新版本的IDEA后,新建项目里面的 spring initializr的选项里面已经没有了JDK1.8的选项了,原因是spring官方的initializr https://start.spring.io/ 现在主推3.x版本这个最低要求是JDK17, 解决方法: 将IDEA默认的 Initializr的URL https://start.spring.io/换成第三方…

3/21 work

自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面。&#xff08;不要使用课堂上的图片和代码&#xff0c;自己发挥&#xff0c;有利于后面项目的完成&#xff09; 要求&#xff1a; 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件相关设置&#xff0c;通…