JavaWeb 项目实现(四) 验证旧密码

1.验证旧密码

步骤很简单,从Session中取到当前密码,和修改密码界面得到的旧密码对比,判断是否相等。

特别之处在于实现用到了Ajax,可以不刷新整个页面的情况下与Web服务器进行通信。

2.Ajax

Ajax(Asynchronous JavaScript and XML)是一种用于在Web应用程序中创建交互式用户界面和实现异步数据交换的技术。它使用JavaScript编写的代码,在不刷新整个页面的情况下与Web服务器进行通信,从而实现动态加载内容和更新页面。

用法: 

3.JSON

在使用Ajax的时候,我们看到了数据类型是json,所以来了解一下jason。

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它使用易于读写的文本格式来表示数据,通常用于在客户端和服务器之间传递数据。JSON格式基于JavaScript语言的一个子集,但它可以由很多不同的编程语言解析和生成。

JSON格式由键值对组成,其中键是字符串,值可以是字符串、数字、布尔值、数组、对象或null。例如,下面是一个简单的JSON对象:

```
{
  "name": "John",
  "age": 30,
  "city": "New York"
}
```

JSON格式具有很多优点,例如易于读写、易于解析、轻量级、可读性好等。

JSON已成为Web应用程序中传递数据的常用格式,例如在AJAX请求中传递数据,或者在RESTful API中返回数据。

4.代码实现

上面说到了在AJAX请求中传递数据,或者在RESTful API中返回数据。

所以我们的实现也是一样的,先是js代码:

var oldpassword = null;
var newpassword = null;
var rnewpassword = null;
var saveBtn = null;$(function(){oldpassword = $("#oldpassword");newpassword = $("#newpassword");rnewpassword = $("#rnewpassword");saveBtn = $("#save");oldpassword.next().html("*");newpassword.next().html("*");rnewpassword.next().html("*");oldpassword.on("blur",function(){$.ajax({type:"GET",url:path+"/jsp/user.do",data:{method:"pwdmodify",oldpassword:oldpassword.val()},	//Ajax传递的参数//path+/jsp/user.do?method=pwdmodify&oldpassword=oldpassword.val();dataType:"json",	//主流开发都是用JSON实现前后端交互success:function(data){if(data.result == "true"){//旧密码正确validateTip(oldpassword.next(),{"color":"green"},imgYes,true);}else if(data.result == "false"){//旧密码输入不正确validateTip(oldpassword.next(),{"color":"red"},imgNo + " 原密码输入不正确",false);}else if(data.result == "sessionerror"){//当前用户session过期,请重新登录validateTip(oldpassword.next(),{"color":"red"},imgNo + " 当前用户session过期,请重新登录",false);}else if(data.result == "error"){//旧密码输入为空validateTip(oldpassword.next(),{"color":"red"},imgNo + " 请输入旧密码",false);}},error:function(data){//请求出错validateTip(oldpassword.next(),{"color":"red"},imgNo + " 请求错误",false);}});}).on("focus",function(){validateTip(oldpassword.next(),{"color":"#666666"},"* 请输入原密码",false);});newpassword.on("focus",function(){validateTip(newpassword.next(),{"color":"#666666"},"* 密码长度必须是大于6小于20",false);}).on("blur",function(){if(newpassword.val() != null && newpassword.val().length > 6&& newpassword.val().length < 20 ){validateTip(newpassword.next(),{"color":"green"},imgYes,true);}else{validateTip(newpassword.next(),{"color":"red"},imgNo + " 密码输入不符合规范,请重新输入",false);}});rnewpassword.on("focus",function(){validateTip(rnewpassword.next(),{"color":"#666666"},"* 请输入与上面一致的密码",false);}).on("blur",function(){if(rnewpassword.val() != null && rnewpassword.val().length > 5&& rnewpassword.val().length < 20 && newpassword.val() == rnewpassword.val()){validateTip(rnewpassword.next(),{"color":"green"},imgYes,true);}else{validateTip(rnewpassword.next(),{"color":"red"},imgNo + " 两次密码输入不一致,请重新输入",false);}});saveBtn.on("click",function(){oldpassword.blur();newpassword.blur();rnewpassword.blur();if(oldpassword.attr("validateStatus") == "true"&&newpassword.attr("validateStatus") == "true"&&rnewpassword.attr("validateStatus") == "true"){if(confirm("确定要修改密码?")){$("#userForm").submit();}}});
}
);

再是servlet代码:

package com.code.servlet.user;import com.alibaba.fastjson.JSONArray;
import com.code.pojo.User;
import com.code.service.user.UserService;
import com.code.service.user.UserServiceImpl;
import com.code.util.Constants;
import com.mysql.cj.util.StringUtils;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;public class UserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method = req.getParameter("method");if (method.equals("savePwd")) {updatePwd(req, resp);}else if (method.equals("pwdmodify")) {modifyPwd(req, resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}private void updatePwd(HttpServletRequest req, HttpServletResponse resp){Object object = req.getSession().getAttribute(Constants.USER_SESSION);String newPwd = req.getParameter("newpassword");if(object!=null && !StringUtils.isNullOrEmpty(newPwd)){UserService userService = new UserServiceImpl();boolean res = userService.updatePwd(((User)object).getId(), newPwd);if(res){req.setAttribute(Constants.MESSAGE, "更新密码成功,请成功登录");req.removeAttribute(Constants.USER_SESSION);}else{req.setAttribute(Constants.MESSAGE, "更新密码失败");}}else {req.setAttribute(Constants.MESSAGE, "新密码异常");}try {req.getRequestDispatcher("pwdmodify.jsp").forward(req, resp);} catch (ServletException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}private void modifyPwd(HttpServletRequest req, HttpServletResponse resp){Object o = req.getSession().getAttribute(Constants.USER_SESSION);String oldPwd = req.getParameter("oldpassword");Map<String, String > resultMap = new HashMap<String, String>();if(o==null){resultMap.put("result", "sessionerror");} else if (StringUtils.isNullOrEmpty(oldPwd)) {resultMap.put("result", "error");} else  {String pwd = ((User)(o)).getUserPassword();if(oldPwd.equals(pwd)){resultMap.put("result", "true");}else{resultMap.put("result", "false");}}try {resp.setContentType("application/jason");PrintWriter writer = resp.getWriter();writer.write(JSONArray.toJSONString(resultMap));writer.flush();writer.close();} catch (IOException e) {e.printStackTrace();}}
}

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

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

相关文章

正则表达式在格式校验中的应用以及包装类的重要性

文章目录 正则表达式&#xff1a;做格式校验包装类&#xff1a;在基本数据类型与引用数据类型间的桥梁总结 在现代IT技术岗位的面试中&#xff0c;掌握正则表达式的应用以及理解包装类的重要性是非常有益的。这篇博客将围绕这两个主题展开&#xff0c;帮助读者更好地面对面试挑…

无涯教程-jQuery - Menu组件函数

小部件菜单功能可与JqueryUI中的小部件一起使用。一个简单的菜单显示项目列表。 Menu - 语法 $( "#menu" ).menu(); Menu - 示例 以下是显示菜单用法的简单示例- <!doctype html> <html lang"en"><head><meta charset"utf-…

Vue2 第十节 内置指令和自定义指令

1.之前学过的指令 2. 内置指令 3. 自定义指令 一.之前学过的指令 指令名用法v-bind单项绑定解析表达式&#xff0c;可以简写为:xxxv-model双向绑定v-for遍历数组/对象/字符串v-on 绑定监听事件&#xff0c;可以简写为v-if条件渲染&#xff08;动态控制节点是否存在&#xf…

基于ANACONDA安装用于Python编程的Spyder集成开发环境的方法步骤详解

基于ANACONDA安装用于Python编程的Spyder集成开发环境的方法步骤详解 Python作为一种当下流行的编程语言&#xff0c;其编辑器有很多种&#xff0c;本文介绍基于ANACONDA的安装Spyder编辑器的方法步骤。Spyder集成开发环境&#xff0c;和其他的Python开发环境相比&#xff0c;…

C++——类与对象(中)

目录 类的6个默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载const成员函数取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时…

TCP三次握手与四次断开

TCP三次握手机制 三次握手是指建立一个TCP连接时&#xff0c;需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。 1、客户端发送建立TCP连接的请求报文&#xff0c;其…

物理分代垃圾回收器

内存结构 内存分配 堆上分配 大多数情况在eden【年轻代中的一个区域】上分配&#xff0c;偶尔会直接在old【老年代】上分配&#xff0c;细节取决于GC的实现。栈上分配&#xff08;发生了指针逃逸&#xff0c;又叫指针逃逸分析——JVM优化&#xff09; 原子类型的局部变量。 G…

eclipse 最新版没有navigator视图如何解决

使用project exploere视图可以显示类似navigator视图 1.显示project exploere视图 window---->show view --->project exploere 2.project exploere视图转换为类似navigator视图 第一步&#xff1a;点击视图右上角三个点或者倒三角&#xff0c;点击fiters and custom…

3DEXPERIENCE用户角色 | Structural Mechanics Engineer 结构力学工程师

真实条件下实施复杂的线性和非线性分析 直观验证设计并更快地做出产品决策 Structural Mechanics Engineer 在基于云的 3DEXPERIENCE 平台上构建&#xff0c;您可对产品行为执行结构线性和非线性静态、低速和高速动态和热仿真。具备材料校准功能&#xff0c;有助于确保材料行为…

Python教程(6)——Python变量的基础类型。|整数类型|浮点数类型|字符串类型|布尔类型|

学习编程语言&#xff0c;不得不忽视变量这个概念。Python 中的变量是用于存储数据的名称&#xff0c;你可以将值赋给变量&#xff0c;并在程序的其他地方使用该变量来引用该值。变量在程序中起到存储和操作数据的作用。 如果学过C/C语言的同学&#xff0c;定义了变量后&#…

无涯教程-Lua - repeat...until 语句函数

与 for 和 while 循环(它们在循环顶部测试循环条件)不同&#xff0c;Lua编程中的 repeat ... until 循环语言在循环的底部检查其条件。 repeat ... until 循环与while循环相似&#xff0c;不同之处在于&#xff0c;保证do ... while循环至少执行一次。 repeat...until loop - …

单机,集群和分布式概念

单机的局限性&#xff1a; 1.受限于硬件资源&#xff0c;单机所能承受的用户并发量太少&#xff1b; 2.一个系统有多个模块&#xff0c;任意模块的修改都会导致整个项目代码重新编译、部署&#xff1b; 3.系统中&#xff0c;有些模块是CPU密集型&#xff0c;有些模块是I/O密…

通过案例实战详解elasticsearch自定义打分function_score的使用

前言 elasticsearch给我们提供了很强大的搜索功能&#xff0c;但是有时候仅仅只用相关度打分是不够的&#xff0c;所以elasticsearch给我们提供了自定义打分函数function_score&#xff0c;本文结合简单案例详解function_score的使用方法&#xff0c;关于function-score-query…

InnoDB引擎底层逻辑讲解——架构之内存架构

1.InnoDB引擎架构 下图为InnoDB架构图&#xff0c;左侧为内存结构&#xff0c;右侧为磁盘结构。 2.InnoDB内存架构讲解 2.1 Buffer Pool缓冲池 2.2 Change Buffer更改缓冲区 2.3 Adaptive Hash Index自适应hash索引 查看自适应hash索引是否开启&#xff1a; show variable…

6.s081(Fall 2022)Lab2: system calls

文章目录 前言其他篇章参考链接0. 前置准备1. System call tracing (moderate)简单分析Hint 1Hint 2Hint 3Hint 4Hint 5测试 2. Sysinfo (moderate) 前言 好像没啥前言 其他篇章 环境搭建 Lab1:Utilities 参考链接 官网链接 xv6手册链接&#xff0c;这个挺重要的&#xff…

Spring Data Elasticsearch - 在Spring应用中操作Elasticsearch数据库

Spring Data Elasticsearch 文章目录 Spring Data Elasticsearch1. 定义文档映射实体类2. Repository3. ElasticsearchRestTemplate3.1 查询相关特性3.1.1 过滤3.1.2 排序3.1.3 自定义分词器 3.2 高级查询 4. 索引管理4.1 创建索引4.2 检索索引4.3 修改映射4.4 删除索引 5. 异常…

GO学习之 多线程(goroutine)

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 文章目录 GO系列前言一、并发介绍1.1 进程和线程和协程1.2 并发和并行 二、goroutine介绍三…

AWS——02篇(AWS之服务存储EFS在Amazon EC2上的挂载——针对EC2进行托管文件存储)

AWS——02篇&#xff08;AWS之服务存储EFS在Amazon EC2上的挂载——针对EC2进行托管文件存储&#xff09; 1. 前言2. 关于Amazon EFS2.1 Amazon EFS全称2.2 什么是Amazon EFS2.3 优点和功能2.4 参考官网 3. 创建文件系统3.1 创建 EC2 实例3.2 创建文件系统 4. 在Linux实例上挂载…

服务器硬件、部署LNMP动态网站、部署wordpress、配置web与数据库服务分离、配置额外的web服务器

day01 day01项目实战目标单机安装基于LNMP结构的WordPress网站基本环境准备配置nginx配置数据库服务部署wordpressweb与数据库服务分离准备数据库服务器迁移数据库配置额外的web服务器 项目实战目标 主机名IP地址client01192.168.88.10/24web1192.168.88.11/24web2192.168.88…

『赠书活动 | 第十三期』《算力经济:从超级计算到云计算》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十三期』 本期书籍&#xff1a;《算力经济&#xff1a;从超级计算到云计算》 赠书规则&#xff1a;评论区&#xff1a;点赞&#xff5c;收…