当前位置: 首页 > news >正文

【SpringMVC】详解用户登录前后端交互流程:AJAX 异步通信与 Session 机制实战

文章目录

  • 用户登录
    • (一) 约定前后端交互接口
      • 1. 需求分析
      • 2.接口定义
    • (二) 服务端代码
      • 1.校验接口
      • 2.查询登录用户接口
    • (三) 前端页面代码
      • 1.登录页面 login.html
      • 2.首页代码
    • (四) 运行测试
    • (五) 理解前后端交互流程

用户登录

需求: 用户输入账号和密码,后端进行校验密码是否正确

  1. 如果不正确,前端进行用户告知
  2. 如果正确,跳转到首页.首页显示当前登录用户
  3. 后续再访问首页,可以获取到登录用户信息

(一) 约定前后端交互接口

1. 需求分析

对于后端开发人员而言,不涉及前端页面的展示,只需要提供两个功能

    1. 登录页面: 通过账号和密码,校验输入的账号密码是否正确,并告知前端
    1. 首页: 告知前端当前登录用户.如果当前已有用户登录,返回登录的账号,如果没有,返回空

2.接口定义

1. 校验接口

请求路径: /user/login
请求方式: POST
接口描述: 校验账号密码是否正确

请求参数:

参数名类型是否必须备注
userNameString校验的账号
passwordString校验的密码

响应数据:

Content-Type: text/html
响应内容:
true //账号密码验证成功
false//账号密码验证失败

2. 查询登录用户接口

请求路径: /user/getLoginUser
请求方式: GET
接口描述: 查询当前登录的用户

请求参数:

响应数据:

Content-Type: text/html
响应内容:
zhangsan
返回当前登录的用户

(二) 服务端代码

1.校验接口

在这里插入图片描述

2.查询登录用户接口

在这里插入图片描述

(三) 前端页面代码

1.登录页面 login.html

在这里插入图片描述

2.首页代码

首页代码比较简单,只显示当前登录用户即可

当前登录用户需要从后端获取,并显示到前端

在这里插入图片描述

(四) 运行测试

在这里插入图片描述
在这里插入图片描述

(五) 理解前后端交互流程

以下是登录过程的完整交互步骤:

(1) 用户在前端输入信息并点击登录

  • 前端页面:login.html 中的输入框收集用户名和密码。
  • 触发事件:点击按钮调用 login() 函数,通过 AJAX 发送请求。

(2) 前端通过 AJAX 发送请求

  • AJAX 请求:前端将用户名和密码封装成键值对,发送到后端接口 /user/login
data: {userName: $("#userName").val(), // 键名与后端参数名一致password: $("#password").val()
}
  • 请求方式:POST 方法,适合提交敏感数据(如密码)。

(3) 后端接收请求并校验

  • 参数绑定:Spring MVC 根据参数名 userNamepassword 自动绑定到方法的参数。
public Boolean login(String userName, String password, HttpSession session) {// 校验逻辑
}
  • 校验逻辑:
    1. 检查用户名和密码非空。
    2. 验证是否为预设值(kunkunikun2.5)。
    3. 若校验通过,将用户名存入 Session。

(4) 后端返回响应

  • 返回结果:true(成功)或 false(失败)。
  • Session 存储:成功时,后端通过 session.setAttribute("userName", userName) 存储登录状态。

(5) 前端处理响应

  • success 回调:根据后端返回的布尔值 result 执行不同逻辑:
if (result) {// 跳转到首页location.href = "index.html";
} else {// 提示密码错误alert("密码错误,请重新输入");
}

(6) 跳转至首页后获取登录信息

  • 首页请求:index.html 加载时,通过另一个 AJAX 请求 /user/getLoginUser 获取登录用户名。
$.ajax({type: "get",url: "/user/getLoginUser",success: function(userName) {$("#loginUser").text(userName);}
});
  • Session 读取:后端从 Session 中取出用户名并返回,前端更新页面显示。

2. AJAX 的功能

(1) 异步通信

  • 不刷新页面:AJAX 允许在不重新加载整个页面的情况下,与服务器交换数据并更新部分内容。
  • 用户体验:用户停留在当前页面,仅局部内容变化(如错误提示),适合登录这种需要即时反馈的场景。

(2) 请求与响应

  • 发送请求:通过 $.ajax() 配置请求方法(POST/GET)、URL、数据等。
  • 处理响应:success 回调函数处理成功响应,error 处理失败(如网络错误)。

(3) 数据格式

  • 发送数据:可以是键值对(如 userName: "kunkun")或 JSON。
  • 接收数据:后端返回的 true/false 会被自动解析为布尔值,也可返回 JSON 对象。

3. 关键细节补充

(1) Session 的跨页面保持

  • Cookie 机制:当 Session 创建时,后端会自动生成一个 JSESSIONID 并存入 Cookie,浏览器后续请求会携带此 Cookie。
  • 身份识别:后端通过 JSESSIONID 找到对应的 Session,实现跨页面状态保持(如首页显示用户名)。

(2) 安全性注意事项

  • 密码传输:当前代码使用明文传输密码,实际项目中应使用 HTTPS 并加密(如哈希处理)。
  • Session 有效期:默认 Session 在用户关闭浏览器后失效,可手动设置超时时间。

(3) 后端逻辑优化

  • 错误提示细化:当前返回 true/false 只能提示密码错误,实际可返回 JSON 对象包含具体原因(如 {code: 400, message: "用户名不存在"})。
  • 参数校验增强:使用 Spring Validation 进行更专业的参数校验(如长度、格式)。

完整代码

LoginController

@RestController
@RequestMapping("/user")
public class LoginController {@RequestMapping("/login")public boolean login(String userName, String password, HttpSession session){if(!StringUtils.hasLength(userName)|| !StringUtils.hasLength(password)){return false;}if(!"chaoxin".equals(userName) ||!"12345".equals(password)){return false;}session.setAttribute("userName",userName);return true;}@RequestMapping("/getLoginUser")public String getLoginUser(HttpSession session){//从Session中获取用户登录信息String userName = (String) session.getAttribute("userName");//如果用户已经登录,则直接返回用户登录if(StringUtils.hasLength(userName)){return userName;}return "";}
}

index.html

<!doctype html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>用户登录首页</title>
</head><body>登录人: <span id="loginUser"></span><script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"></script>
<!--    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>--><script>$.ajax({type: "get",url: "/user/getLoginUser",success: function(result){$("#loginUser").text(result);}});</script>
</body></html>

login.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>登录页面</title>
</head><body><h1>用户登录</h1>用户名:<input name="userName" type="text" id="userName"><br>密码:<input name="password" type="password" id="password"><br><input type="button" value="登录" onclick="login()"><script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"></script>
<!--  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>--><script>function login() {$.ajax({type: "post",url: "/user/login",data: {"userName": $("#userName").val(),"password": $("#password").val()},success:function(result){if(result){location.href = "/index.html";}else{alert("账号密码有误");}}     });}</script>
</body>
</html>
http://www.dtcms.com/a/552870.html

相关文章:

  • Arbess零基础学习,使用Arbess+GitLab实现Vue.js项目构建并主机部署
  • Git 标准工作流程和 Git 使用(持续更新)
  • 阿里云 OceanBase 可观测最佳实践
  • vitest单元测试测试vue中了element项目安装与运行笔记
  • NineData社区版 V4.6.0 正式发布!SQL 窗口新增4个数据源,新增支持OceanBase等多条数据复制和对比链路
  • 仿RabbitMQ实现消息队列(一)--项目介绍
  • 建设网站的法律声明正规赚佣金的平台
  • BUG与测试用例
  • 【spring boot 使用apache poi 生成和处理word 文档】
  • 橙米网站建设做网站查询违章
  • AI用于自动化办公指南
  • 从“手动试错”到“自动化闭环”:实车OTA测试的效率革命
  • 智能电器:重构生活的科技力量
  • OpenAI拟借AI估值重构浪潮冲击1.1万亿美元IPO——基于市场情绪因子与估值量化模型的深度分析
  • redis事务与Lua脚本
  • 【技术选型】前端框架:Vue vs React - 组合式API与Hooks的哲学之争
  • 网站建设网网站建设全网营销客户资源
  • Python 数据可视化:用 Matplotlib 绘制多维度对比图表
  • 【axf文件解析与J-Link通讯实战(五)】PySide6图形界面与数据可视化集成
  • Android 权限管理:适配 Android 14 运行时权限申请(含后台定位)
  • 涡阳网站优化wordpress进入后台空白
  • 【实战案例】火语言 RPA 采集小说站已完结书名(自动翻页判断),保存到Excel 全流程(附完整脚本)
  • 基于微信小程序的背单词系统x1o5sz72(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 力扣hot100-------11、盛最多水的容器(java版)
  • Visual Basic 菜单编辑器
  • 本地部署轻量级持续集成工具 Drone CI 并实现外部访问
  • gitlab-ci中cicd+helm实现devops自动化部署到k8s
  • 网站欢迎页面怎么做江门建站公司模板
  • 评论回复网站怎么做郑州百度搜索优化
  • Rust开发之使用derive宏自动实现Trait(Clone、Debug)