登录时“自动填充”和“验证码”的实现

news2024/11/17 2:14:41

自动填充和验证码的实现

  • 需求
  • 1. 基础登录功能
    • 1.1 持久层
      • pojo实体类:
      • 代理接口:
    • 1.2 业务层
    • 1.3 表现层
      • login.jsp(登陆界面):
      • LoginServlet:
      • selectAllServlet:
      • brand.jsp(登陆成功):
      • 效果
  • 2. 自动填充的实现(回显)
    • 2.1 表现层
      • login.jsp:
      • loginServlet:
      • login.jsp(回显):
      • 效果
  • 3. 基础注册功能
    • 3.1 持久层
    • 3.2 业务层
    • 3.3 表现层
      • register.jsp:
      • registerServlet:
      • login.jsp:
      • 效果

需求

在这里插入图片描述

1. 基础登录功能

在这里插入图片描述

  • 在表现层,从Servelt的request对象获取用户名密码;
  • 将用户名密码传入servlet中创建service层的对象的方法,查询User并判断是否为null;
  • 不为null则使用respond重定向跳转到列表页面的jsp,输出当前的用户名(动态)和表格信息;
    为null则登录失败并给出提示,这里将提示语使用request转发到jsp;

1.1 持久层

pojo实体类:

在这里插入图片描述

代理接口:

注意多条件时使用 @Param 注解参数的方式查询,参数要对应SQL中的占位符!
在这里插入图片描述

1.2 业务层

登录方法是查询,SQL不涉及事务,不需要sqlSession.commit();
在这里插入图片描述

1.3 表现层

login.jsp(登陆界面):

如果登录失败,会回到注册页面并显示提示语;
在这里插入图片描述

LoginServlet:

  • 通过request对象获取用户名密码;
  • 调用service类的对象的login方法传入参数查询数据库;
  • 判断返回值user,不为null则登录成功,并将user对象存入Session,重定向selectAllServlet,跳转到brand.jsp,在brand.jsp中使用了Session中的user对象的username属性;
  • 为null则不成功,将数据login_msg 存入request域 转发 并跳转回login.jsp

注意
从LoginServlet 重定向 到selectAllServlet是第二个请求,两个servlet,一次会话多次请求需要使用会话跟踪技术共享数据!
由于是敏感信息,这里用Session对象来存储user对象,然后在brand.jsp中使用EL表达式取出user对象的username属性;
在这里插入图片描述
在这里插入图片描述

selectAllServlet:

查询所有列表信息, 并跳转到 brand.jsp
在这里插入图片描述

brand.jsp(登陆成功):

显示由session获取的user对象的username和所有列表信息;
在这里插入图片描述

效果

访问 localhost:8080/brand-demo/login.jsp

用户名密码错误时:
在这里插入图片描述

正确时,跳转到 localhost:8080/brand-demo/selectAllServlet
在这里插入图片描述
“zhangsan”是user对象的属性,user对象是存在Session中的;因为重定向,两个Servlet通过会话跟踪技术进行数据共享!

2. 自动填充的实现(回显)

2.1 表现层

需求
在这里插入图片描述

如何自动填充用户名和密码 ?

  1. 用户成功登陆并选择“记住”后,将用户名和密码写入Cookie中,发送给用户浏览器并持久化存储!
  2. 页面获取request对象的Cookie数据后,回显到用户名密码框!

注意:第一次和第二次登录是两次请求数据,需要在两次请求之间共享数据,并且数据需要长期保存-----------Cookie

什么时候写Cookie?有以下条件:

  1. 用户名密码登录成功!
  2. 用户勾选“记住用户”的checkbox框;

login.jsp:

  1. 增加一个checkbox 复选框remember,设置value=1;
    value不写的话默认是on;

在这里插入图片描述

loginServlet:

  • 从request对象获取用户名密码;
  • 获取复选框的value;
  • 判断如果成功登录且用户勾选了“记住”复选框(value=1),则创建两个Cookie存用户名/密码,用setMaxAge()设置磁盘存储时间,并发送Cookie给浏览器存储;
    在这里插入图片描述
    在这里插入图片描述

login.jsp(回显):

  1. 回显Cookie中的用户名和密码,将表单项的value值设置为cookie的值即可!(使用EL表达式);
    在这里插入图片描述

效果

再次登录后用户名密码被回显;
在这里插入图片描述

3. 基础注册功能

在这里插入图片描述

  • 在持久层有两个方法,先查询用户名是否已经存在,已存在则不能再注册,如果不存在再add添加到数据库;
  • 在表现层,从request对象接收用户信息,创建service对象,调用方法传入参数进行查询和注册;
  • 如果注册成功,跳转到登录页面;失败则跳转注册页面,提示“用户名已存在”

3.1 持久层

需要用到后面两个方法,即单条件查询和添加;


public interface UserMapper {
    /**
     * 根据用户名和密码查询用户对象
     * @param username
     * @param password
     * @return
     */
    @Select("select * from tb_user where username = #{username} and password = #{password}")
    User select(@Param("username") String username,@Param("password")  String password);

    /**
     * 根据用户名查询用户对象
     * @param username
     * @return
     */
    @Select("select * from tb_user where username = #{username}")
    User selectByUsername(String username);

    /**
     * 添加用户
     * @param user
     */
    @Insert("insert into tb_user values(null,#{username},#{password})")
    void add(User user);
}

3.2 业务层

  1. 先判断用户名是否存在
  2. user为null即不存在则add添加用户信息;user不为null则存在,返回false;
    在这里插入图片描述

3.3 表现层

register.jsp:

form表单的cation是registerServlet;

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎注册</title>
    <link href="css/register.css" rel="stylesheet">
</head>
<body>

<div class="form-div">
    <div class="reg-content">
        <h1>欢迎注册</h1>
        <span>已有帐号?</span> <a href="login.html">登录</a>
    </div>
    <form id="reg-form" action="/brand-demo/registerServlet" method="post">

        <table>

            <tr>
                <td>用户名</td>
                <td class="inputs">
                    <input name="username" type="text" id="username">
                    <br>                        由request域转发的提示信息:“注册成功,请登录”
                    <span id="username_err" class="err_msg" >${register_msg}</span>
                </td>

            </tr>

            <tr>
                <td>密码</td>
                <td class="inputs">
                    <input name="password" type="password" id="password">
                    <br>
                    <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
                </td>
            </tr>


            <tr>
                <td>验证码</td>
                <td class="inputs">
                    <input name="checkCode" type="text" id="checkCode">
                    <img id="checkCodeImg" src="/brand-demo/checkCodeServlet">
                    <a href="#" id="changeImg" >看不清?</a>
                </td>
            </tr>

        </table>

        <div class="buttons">
            <input value="注 册" type="submit" id="reg_btn">
        </div>
        <br class="clear">
    </form>

</div>

<script>
    document.getElementById("changeImg").onclick = function () {
        document.getElementById("checkCodeImg").src = "/brand-demo/checkCodeServlet?"+new Date().getMilliseconds();
    }

</script>
</body>
</html>

registerServlet:

service的方法为true代表不存在然后添加用户信息,则跳转到登录页面;
为false则代表已存在,跳转回到注册页面并提示“用户已存在”;

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

login.jsp:

login_msgregister_msg 灵活使用,传哪个就显示哪个!
在这里插入图片描述

效果

当输入已存在时,跳转回登录页面并提示;
在这里插入图片描述

当输入不存在,则添加到数据库,并跳转到登录页面:

在这里插入图片描述
使用新账号登录,这里在基础登录功能中使用了重定向,重定向到selectAllServlet

在这里插入图片描述

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

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

相关文章

30.Isaac教程--Costmap规划器

Costmap规划器 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录Costmap规划器组件消息入门自定义图使用自定义地图改变规划器将 Costmap 添加到视线中将通道添加到配置Isaac SDK 中的标准导航规划器指示机器人在避开障碍物的同时采用最短…

赛意SMOM和金蝶云星空单据接口对接

赛意SMOM和金蝶云星空单据接口对接数据源系统:金蝶云星空金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上&#xff0c;提供了标准的管理模式&#xff1b;通过标准的业务架构&#xff1a;多会计准则、多币别、多地点、多组织、多税制应用框架等&#xff0c;有效支持企业的运营…

数据结构进阶 unordered系列的效率对比

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;对比map set和unordered系列map和set的效率 unordered系列的效率对比map/set与unordered_map/unordered_set的区别map/set与uno…

HTTP简史

今天一起来研究Http协议的一些事情&#xff0c;通过本文你将了解到以下内容&#xff1a;Http协议各版本的对比和优缺点Http2.0协议相关的SPDY协议、二进制分帧协议、多路复用、首部压缩、服务推送等基本原理HTTP3.0和QUIC协议乘风破浪前往知识的海洋吧&#xff0c;要开船了&…

Linux常用命令——telnet命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) telnet 登录远程主机和管理(测试ip端口是否连通) 补充说明 telnet命令用于登录远程主机&#xff0c;对远程主机进行管理。telnet因为采用明文传送报文&#xff0c;安全性不好&#xff0c;很多Linux服务器都不开…

【Java IO流】字符流详解

文章目录1. 前言2. 字符输入流3. 字符输出流4. 字符流底层原理解析4.1 字符输入流4.2 字符输出流1. 前言 在上一篇字符集详解中我们说到了产生乱码的原因&#xff0c;要么是读取数据时未读完整个汉字&#xff0c;要么是因为编码和解码的方式不统一&#xff0c;对于后者我们只需…

PromQL之函数

Prometheus 版本 2.41.0 平台统一监控的介绍和调研直观感受PromQL及其数据类型PromQL之选择器和运算符PromQL之函数 PromQL 聚合函数 PromQL 的聚合函数只能用于瞬时向量&#xff0c;支持的聚合函数有&#xff1a; sum 求和min 最小值max 最大值avg 平均值group 分组&#xf…

Nginx与LUA(5)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;Nginx诞生以来就获赞无数&#xff0c;反向代理、负载均衡、流量限制与流量扩展都是它的拿手好戏。基本上是互联网应用的主流入口&#xff0c;和计算、即时通讯、存…

python批量下载modis数据(可筛选日期、范围、数据类型)

找了一圈下modis数据的&#xff0c;有的不能空间筛选有的不能下初级产品&#xff08;也可能没找到&#xff09;&#xff0c;不甚满意&#xff0c;自己搞了个 0 前言 用到的主要依赖是selenium&#xff0c;下载网站是https://ladsweb.modaps.eosdis.nasa.gov&#xff0c;环境是…

ensp实现不同VLAN之间的通信

1.VLAN的基本配置 一个简单的VLAN实验&#xff0c;基本配置如图。 其中交换机为S5700。 在只对四台PC配置IP地址&#xff0c;交换机不用配置后&#xff0c;四台PC可以互相ping通。 下面是对交换机配置VLAN的方法 <Huawei>sys #进入系统视图 [Huawei…

钉钉搭和金蝶云星空接口打通对接实战

数据源系统:阿里宜搭宜搭是阿里巴巴自研的基于钉钉和阿里云的低代码平台&#xff0c;可让用户通过简单的拖拽、配置即可完成应用搭建&#xff0c;为每个组织提供低门槛、高效率的数字化业务应用生产新模式。有效缩减企业应用开发时间&#xff0c;助力企业数字化升级。对接目标系…

第四层:友元与函数成员别样定义

文章目录前情回顾友元友元的概念友元的目的友元的关键字友元的两种种用法全局函数做友元类做友元函数成员的别样定义有缘人学友元&#xff0c;急速突破第四层本章知识点&#xff08;图片形式&#xff09;&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一的…

Python怎么获取节假日信息?

“holidays” 是一个 Python 第三方库&#xff0c;它可以用来解析和处理节假日信息。 该库提供了一系列函数&#xff0c;可以用来检查某一天是否是节假日、获取某一年中所有节假日的列表等。它支持多种国家和地区的节假日&#xff0c;例如美国、加拿大、澳大利亚、英国等。 “…

【软件架构思想系列】分层架构

- 分层架构 -今天谈下架构设计中的分层思想和分层模型。架构思维概述对于架构思维本身仍然是类似系统思维&#xff0c;结构化思维&#xff0c;编程思维等诸多思维模式的一个合集。由于架构的核心作用是在业务现实世界和抽象的IT实现之间建立起一道桥梁&#xff0c;因此…

CUDA编程笔记(4)

文章目录前言1.CUDA的计时程序2.CUDA程序的计时影响GPU加速的关键总结前言 怎么才能看出使用cuda编程&#xff0c;提高了程序的性能&#xff0c;一般都是通过比较程序运行的时间来验证。所以熟悉程序的运行时间的计时&#xff0c;可以查看优化的性能效果。 1.CUDA的计时程序 …

每日亿题(面试题)

每日亿题(面试题) new Fn和new Fn()有什么区别&#xff1f; 1.首先如果是为传参数的情况下结果是相同的 2.如果是获取属性new Fn() 正常执行&#xff0c;而 new Fn 报错 3.不带括号不能给构造函数传参 分析比较 opacity: 0、visibility: hidden、display: none 优劣和适用…

Spring看这一篇文章就够了

第一章 Spring简介 第1节 Spring的介绍 Spring官网地址 1https://spring.ioSpring的介绍 1Spring是一个开放源代码的设计层面框架&#xff0c;他解决的是业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003年兴起的一…

4.2w字,详细的带你认识基础I/O【Linux--基础IO】

前言 相信大家最开始都挺疑惑的&#xff0c;什么I/O。在计算机操作系统中&#xff0c;所谓的I/O实则就是输入&#xff08;Input&#xff09;和输出&#xff08;Output&#xff09;&#xff0c;也可以理解为读&#xff08;Read&#xff09;和写&#xff08;Write&#xff09;&…

Linux常用命令——tar命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tar Linux下的归档使用工具&#xff0c;用来打包和备份。 补充说明 tar命令可以为linux的文件和目录创建档案。利用tar&#xff0c;可以为某一特定文件创建档案&#xff08;备份文件&#xff09;&#xff0c;也…

mysql 基本组成

1 mysql 基本组成 1.1、mysql连接器的工作流程: 1.2、查看连接状态: show processlist; Note:客户端太长时间没动静 就自动断开 这个时间是由wait_timeout参数控制的,默认8h 长连接短链接 长连接是链接成功后,如果客户端持续有请求,则使用同一个链接[尽量使用长连接,因为每次…