在Java中如何完成模拟用户登录流程_Java字符串比较实战解析
发布时间 - 2026-01-31 00:00:00 点击率:次Java中禁用equals()比对密码,应使用恒定时间算法(如逐字符异或)比对char[];密码需加盐哈希存储;会话须绑定并防CSRF;MockMvc测试需手动传递JSESSIONID;表单密码乱码需统一UTF-8编码。
Java中用equals()比较密码字符串是错的
直接用==或equals()比对用户输入的密码和存储的密码,看似能跑通,但存在严重安全与逻辑问题。Java字符串常量池机制会让相同字面值的String对象共享引用,一旦密码来自字面量或被intern过,==可能偶然返回true;而equals()虽能正确比语义,但它不防定时攻击——攻击者可通过响应时间差异推测密码长度或前缀。
真实登录流程中,密码字段应始终用char[]接收并立即擦除,比对必须使用恒定时间算法:
-
后端接参时用
HttpServletRequest.getParameter("password")拿到String后,立刻转为char[],再清空原始String引用(无法彻底清除,但减少驻留) - 比对逻辑不用
Arrays.equals(char[], char[])——它仍可能被JIT优化出短路行为;应手写循环,遍历全部字符并累积异或结果,最后判断是否为0 - 数据库查出的密码必须是加盐哈希(如
BCryptPasswordEncoder生成的$2a$10$...格式),绝不能存明文或简单Base64
模拟登录时如何避免Session伪造和CSRF漏洞
单纯校验账号密码通过就session.setAttribute("user", user),只是完成了最基础的认证,离“模拟用户登录流程”还差关键两步:会话绑定与请求合法性校验。
常见疏漏包括:
- 未设置
HttpSession的setMaxInactiveInterval(1800),导致长期空闲会话滞留服务器内存 - 未调用
session.setAttribute("sessionId", session.getId())配合前端存储,后续请求无法携带有效JSESSIONIDCookie - 忘记在登录成功响应头中添加
Set-Cookie: JSESSIONID=xxx; HttpOnly; Secure; Path=/; SameSite=Strict,使前端JS无法读取、仅HTTPS传输、防跨站冒用 - 未在表单中嵌入
(Spring Security场景),或未验证X-CSRF-TOKENHeader,导致攻击者可诱导用户点击恶意链接完成非预期操作
测试登录流程时MockMvc怎么传Cookie和Header
用MockMvc写集成测试模拟真实HTTP请求,光构造post("/login").param("username", "a").param("password", "b")远远不够——它不自动管理Session生命周期,也不会发回Cookie给下个请求。
正确做法是链式调用保留上下文:
ResultActions loginResult = mockMvc.perform(post("/login")
.param("username", "test")
.param("password", "pass123"))
.andExpect(status().is3xxRedirection())
.andExpect(header().string("Location", "/home"));
// 提取重定向后的JSESSIONID
String sessionId = loginResult.andReturn().getResponse().getCookie("JSESSIONID").getValue();
// 后续请求带上Cookie
mockMvc.perform(get("/profile")
.cookie(new Cookie("JSESSIONID", sessionId))
.header("X-Requested-With", "XMLHttpRequest"))
.andExpect(status().isOk());
注意:MockMvc默认不启用Cookie管理,必须显式提取并传递;若用@WebMvcTest且依赖SecurityMockMvcConfigurers.springSecurity(),还需额外配置csrf().disable()或提供合法token,否则403拦截。
前端传来的密码

不是编码问题,是HTTP协议层默认用ISO-8859-1解码表单数据,而UTF-8中文密码(比如含特殊符号或emoji)会被错误截断,导致new String(password.getBytes("ISO-8859-1"), "UTF-8")也救不回来。
根治方法只有两个:
- 在
web.xml或Spring Boot的application.properties里强制统一请求编码:server.tomcat.uri-encoding=UTF-8(Tomcat 8.5+)或spring.http.encoding.force=true - 前端用
encodeURIComponent()对密码字段单独编码,后端用URLDecoder.decode(password, "UTF-8")解码——但此法绕过容器默认解析,需手动从request.getQueryString()或request.getInputStream()读原始字节
真正上线环境几乎都选第一种;第二种只在调试加密传输或JSON体提交时出现,此时Content-Type已是application/json,不受表单编码影响。
# word
# java
# js
# 前端
# json
# cookie
# 编码
# app
# 字节
# session
# tomcat
# 后端
# spring
# spring boot
# csrf
# String
# 常量
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
JavaScript如何操作视频_媒体API怎么控制播放
详解Oracle修改字段类型方法总结
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
大连网站制作公司哪家好一点,大连买房网站哪个好?
昵图网官网入口 昵图网素材平台官方入口
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
香港服务器部署网站为何提示未备案?
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
Linux安全能力提升路径_长期防护思维说明【指导】
java ZXing生成二维码及条码实例分享
Android okhttputils现在进度显示实例代码
Laravel怎么调用外部API_Laravel Http Client客户端使用
Laravel如何与Pusher实现实时通信?(WebSocket示例)
用yum安装MySQLdb模块的步骤方法
UC浏览器如何设置启动页 UC浏览器启动页设置方法
高端云建站费用究竟需要多少预算?
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
nginx修改上传文件大小限制的方法
Android实现代码画虚线边框背景效果
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
七夕网站制作视频,七夕大促活动怎么报名?
html5的keygen标签为什么废弃_替代方案说明【解答】
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
如何用5美元大硬盘VPS安全高效搭建个人网站?
如何构建满足综合性能需求的优质建站方案?
EditPlus中的正则表达式 实战(4)
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
如何在IIS中新建站点并配置端口与物理路径?
香港服务器如何优化才能显著提升网站加载速度?
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
Linux网络带宽限制_tc配置实践解析【教程】
用v-html解决Vue.js渲染中html标签不被解析的问题
canvas 画布在主流浏览器中的尺寸限制详细介绍
香港网站服务器数量如何影响SEO优化效果?
JS弹性运动实现方法分析
非常酷的网站设计制作软件,酷培ai教育官方网站?
Angular 表单中正确绑定输入值以确保提交与验证正常工作
如何做网站制作流程,*游戏网站怎么搭建?
网站制作报价单模板图片,小松挖机官方网站报价?
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解

