《JavaEE进阶》----7.<SpringMVC实践项目:【登录页面的验证】>

这篇文章详细的讲解了一个

简单的登录网页的前端代码和后端代码的构造 

使用了JavaScript中的ajax来进行前后端的交互

一、前端代码

登录页面代码

<!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://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>function login() {$.ajax({type:"post",url:"/login/check",data:{userName:$("#userName").val(),password:$("#password").val()},success:function(result){if(result==true){location.href = "index.html";}else{alert("用户名和密码错误!请重写输入")}}});}</script>
</body></html>

代码解析 

<body>中的 文档的主体部分,包含网页的可见内容。

<input type="button" value="登录" οnclick="login()"> 

<input> 元素用于在网页上创建各种类型的输入控件。

type="button"

指定这是一个按钮类型,不会提交表单,而是用于触发客户端的JavaScript函数或其他操作

οnclick="login()"

表示当用户点击登录按钮时,就会执行命名为login()的JavaScript函数

下面的用<script>包起来的代码

这段代码使用 jQuery 实现了一个简单的用户登录功能。它通过 AJAX 向服务器发送用户名和密码,检查登录凭证的有效性,并根据服务器返回的结果执行相应的操作。

1.首先引入jQuery库

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>

通过 CDN 引入 jQuery 3.6.4 库,以便在页面中使用 jQuery 提供的简便的 JavaScript 操作方法。

2.定义login()函数

login()是一个 JavaScript 函数,用于处理用户点击“登录”按钮时的操作。

3 $.ajax()方法

使用 jQuery 的 $.ajax 方法来进行 AJAX 请求,发送异步 HTTP 请求。

关键参数解释:

  • 指定请求类型为 Post,用于向服务器提交数据(用户名和密码)。
  • url:"/login/check",

    指定请求的 URL(服务器端的登录检查接口),即请求会发送到 /login/check
  • data:发送到服务器的数据对象,包含用户输入的用户名和密码:

    data: {userName: $("#userName").val(),password: $("#password").val()
    }
    
  • $("#userName").val():使用 jQuery 获取 ID 为 userName 的输入框的值(用户名)。
  • $("#password").val():使用 jQuery 获取 ID 为 password 的输入框的值(密码)。

success:function(result){
}
  • 请求成功后的回调函数,接收一个参数 result,代表服务器的返回结果。
  • 如果 resulttrue,表示登录成功,使用 location.href = "index.html"; 重定向到主页 index.html
  • 如果 resultfalse,表示登录失败,弹出提示框:alert("用户名和密码错误!请重写输入");

显示用户名页面的代码

<!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://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>$.ajax({type:"post",url:"/login/index",success:function(result){$("#loginUser").text(result);}});</script>
</body></html>

代码解析:

登录人: <span id="loginUser"></span>
1. <span> 标签
  • <span> 是一个行内元素,通常用于在网页中创建一个没有任何特定样式或格式的容器,用于文本或其他内联元素。
  • 在这段代码中,<span> 元素用于显示登录用户的名字。
2. id="loginUser"
  • id 是一个 HTML 属性,表示元素的唯一标识符。在这段代码中,id="loginUser" 用于唯一标识这个 <span> 元素。
  • 通过这个 ID,可以在 JavaScript 或 jQuery 中轻松定位和操作这个元素的内容。
        $.ajax({type:"post",url:"/login/index",success:function(result){$("#loginUser").text(result);}});

return是后端返回的结果。也就是用户名。

因此我们只需要将result的值赋值给loginUser这个参数

  • $("#loginUser"):使用 jQuery 选择器选择 ID 为 loginUser 的元素。
  • .text(result):将 result 的内容设置为该元素的文本内容。

二、前端页面

 

三、后端代码

3.1 完整代码

​
@RestController
@RequestMapping("/login")
public class LoginController {@RequestMapping("/check")public Boolean check(String userName , String password, HttpSession session){//校验账号和密码是否为空if(!StringUtils.hasLength(userName)||!StringUtils.hasLength(password)){return false;}//检验账号和密码是否正确//本来使用数据库,如今使用数据模拟if("张三".equals(userName)&&"123456".equals(password)){session.setAttribute("userName",userName);return true;}return false;}@RequestMapping("/index")public String index(HttpSession session){String userName = (String) session.getAttribute("userName");return userName;}}​

3.2 代码解析 

验证用户名和密码

在判断输入字符是否为空时,我们可以用到Spring给我们提供的方法:

!StringUtils.hasLength(userName)||!StringUtils.hasLength(password)

这里验证用户名和密码的时候进行数据模拟,而非使用数据库,等后续再改进。

        if("张三".equals(userName)&&"123456".equals(password)){session.setAttribute("userName",userName);return true;}

书写标准:把常量写在前面,变量写在后面。

进行完上述的代码,我们就需要获取用户信息,怎么获取呢?这时候就需要用到Session。

从Session里拿。

设置Session (得到用户信息)

如上完整代码,是校验用户名和密码的完整代码。我们还进行了Session的设置。

我们使用HttpSession session这个对象设置Session内容为用户名。

显示用户信息

    @RequestMapping("/index")public String index(HttpSession session){String userName = (String) session.getAttribute("userName");return userName;}

 我们在显示登录人页面中,使用HttpSession session这个对象获得了之前设置的

Session信息,也就是用户名。并且返回了userName。

(String) session.getAttribute("userName");

在这串代码中,如果Session为空,并不会报错。因为它自动帮我们创建了一个空的Session

验证结果

当输入用户名和密码错误时

 当输入用户名和密码正确时

登录成功 

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

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

相关文章

CSS解析:盒模型

在网页上实现元素布局涉及很多技术。在复杂网站上&#xff0c;可能会用到浮动元素、绝对定位元素以及其他各种大小的元素&#xff0c;甚至也会使用较新的CSS特性&#xff0c;比如Flexbox或者网格布局。 在此之前我们要打好基础&#xff0c;深刻理解浏览器是如何设置元素的大小…

【卷起来】VUE3.0教程-04-表单输入绑定

Hello&#xff0c;各位老铁&#xff0c;今天我们继续给大家讲解VUE3.0教程&#xff0c;本期我们讲述一下VUE中的表单输入绑定&#xff0c;在实际开发过程中&#xff0c;表单的输入是我们常见的功能&#xff0c;那么我们接下来看看&#xff0c;VUE是如何处理的。 各位看官&…

JVM面试(五)垃圾回收机制和算法

概述 了解Java虚拟机的垃圾回收机制&#xff08;Garbage Collection&#xff0c;简称GC&#xff09;&#xff0c;我们也要像其作者John McCarthy一样&#xff0c;思考一下三个问题&#xff1a; 哪些内存需要回收&#xff1f;什么时候回收&#xff1f;如何回收&#xff1f; 虽…

51单片机-DS1302(RTC时钟显示,代码内改变,内设的24年9月5日,上午11:12:00)

一、DS1302时序及命令字 两个操作&#xff1a;写操作和读操作 写操作&#xff1a; &#xff08;由我们单片机一个控制引脚控制DS1302的IO口写入&#xff09;首先就是通过时序图把我们的命令字写入&#xff0c;命令字是控制我们对应要写入的年月日&#xff0c;时分秒等配置的关…

vue3安装sass时报错:Embedded Dart Sass couldn‘t find the embedded compiler executable

vue3安装sass&#xff1a; npm install sass --save-dev 引用 <template><div class"c1"><h1>hello</h1></div> </template> <style lang"scss">.c1{background-color:red;h1{color:yellow;}} </style>报…

2.门锁_STM32_舵机设备实现

概述 需求来源&#xff1a; 门锁的开启和关闭&#xff0c;就是电机来控制。这里不进行实际门锁机械结构的设计&#xff0c;选择用舵机或者电机转动一定的角度&#xff0c;就代表门锁开启。 舵机开发整体思路&#xff1a; 使用STM32裸机开发舵机&#xff0c;使得舵机可以实现…

spring boot 项目 prometheus 自定义指标收集区分应用环境集群实例ip,使用 grafana 查询--方法耗时分位数指标

spring boot 项目 prometheus 自定义指标收集 auth author JellyfishMIX - github / blog.jellyfishmix.comLICENSE LICENSE-2.0 说明 网上有很多 promehteus 和 grafana 配置&#xff0c;本文不再重复&#xff0c;只介绍自定义部分。目前只介绍了分位数指标的收集和查询&a…

公认最好的跑步耳机,精选五款热门骨传导运动耳机分享

跑步时候总想来点音乐伴随&#xff0c;但是带着有线耳机太局限&#xff0c;带无线耳机又总担心掉落&#xff0c;左右为难&#xff0c;想要挑选一款运动时带着舒服的耳机真的有点难。最近发现骨传导耳机作为一种创新的音频设备&#xff0c;与传统耳机不同&#xff0c;通过将声音…

如何建立有效的沟通和协作机制来开展DFMEA工作?

在当今复杂多变的工业环境中&#xff0c;DFMEA&#xff08;设计失效模式与影响分析&#xff0c;Design Failure Mode and Effects Analysis&#xff09;作为质量管理体系中的一项关键工具&#xff0c;对于预防产品设计和开发过程中潜在的失效模式具有不可估量的价值。有效的DFM…

超声波眼镜清洗机买哪款?2024超声波眼镜清洗机推荐

超声波清洗机正逐渐成为广受欢迎的清洁解决方案&#xff0c;它以高效、深入且细腻的清洁效果&#xff0c;以及操作上的简易性&#xff0c;赢得了消费者的广泛喜爱。不过&#xff0c;市面上琳琅满目的品牌、多样化的型号及波动的价格区间&#xff0c;确实给消费者挑选时带来了不…

uniapp和vue3中使用vConsole在H5中开启移动端调试

uniapp和vue3中使用vConsole在H5中开启移动端调试 1. 安装vconsole npm install vconsole --save2. 在main.js中全局引入 重新启动项目即可

【js逆向专题】8.webpack打包

本教程仅供学习交流使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;请各学员自觉遵守相关法律法规。小节目标: 熟悉 webpack打包原理熟悉 webpack打包方式了解 webpack多模块打包 一. webpack打包 概念: webpack 是…

传递给 LEFT 或 SUBSTRING 函数的长度参数无效

我的Sql语句&#xff1a;select left(long,charindex(‘’,Long)-1) from Site 会报错&#xff0c; 错误信息是&#xff1a;传递给 LEFT 或 SUBSTRING 函数的长度参数无效。 如果我把Sql语句这样写加了一个where条件&#xff0c;即&#xff1a; select left(long,charindex(‘…

金属三通管液压成形液压机比例阀放大器

金属三通管液压成形液压机比例阀配套BEUEC比例放大器适用于紫铜、青铜、不锈钢、铝合金、复合材料的三通管、四通管、T型管、Y型管、L型管的一次液压胀形成形&#xff0c;更适用于石油化工、热能、新能源、医疗、环保、卫浴、五金等行业的各种金属中空零件和复杂曲面的管件的生…

信也持续构建集群容器化改造之路

1. 前言 随着应用构建需求增加以及新构建场景引入&#xff0c;公司对构建系统的扩展性、稳定性要求日益提高。多语言构建&#xff08;如Golang、Java、Python、Node.js 等&#xff09;所依赖的环境&#xff0c;部署在同一台物理机上时&#xff0c;使构建机环境维护困难&#xf…

解决SecoClient接收返回码超时

解决SecoClient接收返回码超时_secoclient接收返回码错误win11-CSDN博客 新的SVDDrv.sys有需要的&#xff0c;https://download.csdn.net/download/shuoshuo_12345/89715503下载即可。

【maven】阿里云和apache仓库配置

阿里云公共仓库的配置看起来有多种类型的仓库: 配置指南 我的maven是idea 自带的:D:\Program Files\JetBrains\IntelliJ IDEA 2022.3.1\plugins\maven\lib\maven3\</

人工智能造福公众:未来一片光明

作者&#xff1a;来自 Elastic Peter Dutton 我们如何衡量人工智能对政府的影响&#xff1f;毫无疑问&#xff0c;人工智能将为运营流程和决策带来的好处已被广泛讨论 —— 从自动化工作流程到节省成本再到减少重复工作。 但对于以服务公众为目标的组织来说&#xff0c;人工智…

基于微信的热门景点推荐小程序的设计与实现(论文+源码)_kaic

摘 要 近些年来互联网迅速发展人们生活水平也稳步提升&#xff0c;人们也越来越热衷于旅游来提高生活品质。互联网的应用与发展也使得人们获取旅游信息的方法也更加丰富&#xff0c;以前的景点推荐系统现在已经不足以满足用户的要求了&#xff0c;也不能满足不同用户自身的个…

C语言 | Leetcode C语言题解之第390题消除游戏

题目&#xff1a; 题解&#xff1a; int lastRemaining(int n) {int a1 1;int k 0, cnt n, step 1;while (cnt > 1) {if (k % 2 0) { // 正向a1 a1 step;} else { // 反向a1 (cnt % 2 0) ? a1 : a1 step;}k;cnt cnt >> 1;step step << 1;}return …