在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),只是完成了最基础的认证,离“模拟用户登录流程”还差关键两步:会话绑定与请求合法性校验。

常见疏漏包括:

  • 未设置HttpSessionsetMaxInactiveInterval(1800),导致长期空闲会话滞留服务器内存
  • 未调用session.setAttribute("sessionId", session.getId())配合前端存储,后续请求无法携带有效JSESSIONID Cookie
  • 忘记在登录成功响应头中添加Set-Cookie: JSESSIONID=xxx; HttpOnly; Secure; Path=/; SameSite=Strict,使前端JS无法读取、仅HTTPS传输、防跨站冒用
  • 未在表单中嵌入(Spring Security场景),或未验证X-CSRF-TOKEN Header,导致攻击者可诱导用户点击恶意链接完成非预期操作

测试登录流程时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基本数据类型及类型检测常用方法小结  如何在建站主机中优化服务器配置?  潮流网站制作头像软件下载,适合母子的网名有哪些?  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  进行网站优化必须要坚持的四大原则  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  lovemo网页版地址 lovemo官网手机登录  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  手机网站制作与建设方案,手机网站如何建设?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  深圳网站制作的公司有哪些,dido官方网站?  网站优化排名时,需要考虑哪些问题呢?  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  公司网站制作价格怎么算,公司办个官网需要多少钱?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  南京网站制作费用,南京远驱官方网站?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  如何在Windows环境下新建FTP站点并设置权限?  Laravel Fortify是什么,和Jetstream有什么关系  微信公众帐号开发教程之图文消息全攻略  java中使用zxing批量生成二维码立牌  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  使用豆包 AI 辅助进行简单网页 HTML 结构设计  中国移动官方网站首页入口 中国移动官网网页登录  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel集合Collection怎么用_Laravel集合常用函数详解  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Laravel storage目录权限问题_Laravel文件写入权限设置  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  IOS倒计时设置UIButton标题title的抖动问题  JavaScript模板引擎Template.js使用详解  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Laravel如何创建自定义Facades?(详细步骤)  Laravel如何自定义错误页面(404, 500)?(代码示例)  Laravel如何实现多对多模型关联?(Eloquent教程)  深圳网站制作平台,深圳市做网站好的公司有哪些?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  Android 常见的图片加载框架详细介绍  无锡营销型网站制作公司,无锡网选车牌流程?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  Android使用GridView实现日历的简单功能  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  网站制作企业,网站的banner和导航栏是指什么?