1、对用户信息的描述

首先用户有一些基本信息:

最简单的:

用户名称 + 用户密码

然后是用户状态,例如封号,注销,停用,等等

用户名称 + 用户密码 + 账号状态

接着为了防止脚本攻击,又产生了图形码验证,为了区分人和机器

用户名称 + 用户密码 + 用户状态 + 图形验证码

2、过程设计:

所以按照最后的这种形式,我们设计一个登陆业务的过程

首先用户在界面上看到三个东西:

- 名称框

- 密码框

- 验证码框

由于账号状态由后台控制,所以这里不会出现,也不会给用户查看

用户名是否会产生重复?

这个问题可以在注册的时候进行业务控制,

也就是说,我们是在一个用户名不会重复的前提下设计的

第一点:

  三个框框都是必须填入信息的,这是第一限制

第二点:

  基于上面用户名不重复的前提上,如果用户输入不存在的用户名就应该限制,并作出提示,用户不存在

第三点:

  根据用户提供的名称获取到对应的密码,就开始对密码进行匹配,如果错误,则限制,并作出提示,密码错误

第四点:

  检查验证码是否匹配,如果错误则限制,并作出提示

而限制是在页面上实现,服务器则负责信息校验的问题:

所以我们的页面和服务器职责是明确的。

对用户的输入信息进行控制,符合第一道工序之后传输信息给服务器,

服务器根据提供的信息进行校验,然后反馈给页面,

页面对反馈信息进行对应的处理,实现页面的限制

所以数据库的用户表设计根据这个业务的需要

至少提供:

用户名|用户密码|账号状态|

验证码是随机生成的,不应该存储在数据库,且浪费存储资源

前置的总结:

但是我没有想到的是可以使用JS来处理页面之间的跳转

因为之前的案例都是通过表单完成,这个步骤完全没有JS来参与逻辑控制

然后后端的事情显得非常的明确,我要做的业务其实也只是查询需要的结果打包给前端

信息校验在业务中处理,然后返回

具体实现描述

JS在发送Ajax之前进行控制,给服务后由程序对数据库访问,查询的结果和用户输入比较

再来是验证码校验,然后返回信息给前端,只有对的JS页面跳转,其他弹窗警告

3、具体实现的代码:

验证码图片生成和保存验证码:

应该简称ImageIDServlet

package cn.dzz.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random; /**
* @author ArkD42
* @file OA
* @create 2020 - 06 - 18 - 10:01
*/ @WebServlet("/verify")
public class VerificationCodeServlet extends BaseServlet{ /**
* /verify?act=genImage
* @param request
* @param response
* @throws IOException
*/
public void genImage(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 设置图片的宽高
int width = 60, height = 20; // 创建具有可访问图像数据缓冲区的Image
BufferedImage bufferedImage = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = bufferedImage.createGraphics(); // 创建一个随机数生成对象
Random random = new Random(); graphics2D.setColor(Color.WHITE);
graphics2D.fillRect(0, 0, width, height); // 创建字体,字体的大小应该根据图片的高度来定
Font font = new Font("微软雅黑", Font.PLAIN, 18); // 设置字体
graphics2D.setFont(font); // 画边框
graphics2D.setColor(Color.BLACK);
graphics2D.drawRect(0, 0, width - 1, height - 1); // 随机产生160条干扰线
graphics2D.setColor(Color.LIGHT_GRAY);
for (int i = 0; i < 160; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int x1 = random.nextInt(12);
int y1 = random.nextInt(12);
graphics2D.drawLine(x, y, x + x1, y + y1);
} // randomCode 用于保存随机产生的验证码
StringBuffer randomCode = new StringBuffer();
int red = 0, green = 0, blue = 0; // 随机产生4位数字的验证码
for (int i = 0; i < 4; i++) {
// 得到随机产生的验证码数字
String strRand = String.valueOf(random.nextInt(10)); // 产生随机的颜色分量来构造颜色值
red = random.nextInt(110);
green = random.nextInt(50);
blue = random.nextInt(50); // 用随机产生的颜色将验证码绘制到图像中
graphics2D.setColor(new Color(red, green, blue));
graphics2D.drawString(strRand, 13 * i + 6, 16); randomCode.append(strRand);
} // 将四位数字的验证码保存到session中
request.getSession().setAttribute("randomCode", randomCode.toString());
System.out.println(this.getClass().getName() + " 生成的验证码:" + randomCode.toString()); // 禁止图像缓存
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0); response.setContentType("image/jpeg");
// 将图像输出到servlet输出流中
ServletOutputStream sos = response.getOutputStream();
ImageIO.write(bufferedImage, "jpeg", sos);
sos.close();
} }

然后在登录页的事件绑定:

<img
src="verify?act=genImage"
id="verify_img"
title="看不清?换一张"
name="verify_img"
align="middle"
onclick="loadImage();return false;"
/> <script type="text/javascript"> function loadImage(){
document.getElementById("verify_img").src="verify?act=genImage&time=" + new Date().getTime();
}
</script>

在Dao层中需要的实现:

    @Override
public User queryUserByName(String username) {
final String SQL = "SELECT * FROM t_user WHERE user_name = ?";
return JdbcForTxUtil.queryOne(
TransactionManager.getCurrentThreadConnection(),
User.class,
SQL,
new Object[]{username}
);
}

然后是登陆业务实现:

    @Override
public JsonResult login(HttpServletRequest request) { // 验证码的验证
HttpSession session = request.getSession();
String randomCode = session.getAttribute("randomCode").toString();
String imgID = request.getParameter("imgID");
System.out.println(request.getRemoteAddr() + "用户输入的是:" + imgID + " 从Session得到的是:" + randomCode); if (!(randomCode.equals(imgID))) return new JsonResult(500,"验证码错误",null); // 用户信息验证
String username = request.getParameter("username");
String password = request.getParameter("password"); User user = userDao.queryUserByName(username);
System.out.println(user); if (user == null) return new JsonResult(200,"没有此用户",null); else {
if (!(password.equals(user.getUser_password()))) return new JsonResult(300,"密码错误",null);
else if (user.getUser_status() != 1) return new JsonResult(400,"账号状态异常",null);
} session.setAttribute("userInfo",user); return new JsonResult(100,"验证通过",null);
}

登陆Servlet反馈给登录页

    /**
* /login?act=loginCheck
* 处理从/WEB-INF/jsp/login.jsp页的表单发送的请求,进行信息校验
* @param request
* @param response
* @return
*/
public JsonResult loginCheck(HttpServletRequest request, HttpServletResponse response) {
JsonResult result = loginService.login(request);
return result;
}

最后是由登录页的JS处理

/* 登陆验证 */
$(function () {
$("#loginBtn").click(function () { let username= $("#username").val();
let password= $("#password").val();
let imgID= $("#imgID").val(); if(username === "" || password === "" || imgID === "") {
alert("请输入用户或密码或验证码!!!");
} else {
//ajax 登录
let url = "/login?act=loginCheck";
let obj = {
username:username,
password:password,
imgID:imgID
}
$.ajax({
url: url,
type: "post",
data: obj,
success: function (data) { /* 不要使用全等,JS会把对象和字符串比较类型,对不上就不走了 */
if (data.feedbackStatus == "100") location.href="/home"; // 状态100 验证通过
else if (data.feedbackStatus == "200") alert(data.messageses); // 状态200 用户不存在
else if (data.feedbackStatus == "300") alert(data.messageses); // 状态200 密码错误
else if (data.feedbackStatus == "400") alert(data.messageses); // 状态400 账号状态异常
else if (data.feedbackStatus == "500") alert(data.messageses); // 状态500 验证码错误
},
dataType:"json"
});
}
});
});

【Project】原生JavaWeb工程 02 登陆业务的流程(第一阶段样例)的更多相关文章

  1. ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题

    ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题 标签: myeclipsejavawebWeb App Libraries 2013-10-16 1 ...

  2. Linux环境下在Tomcat上部署JavaWeb工程

    本文讲解如何将我们已经编译好的JavaWeb工程在Linux环境下的Tomcat上进行部署,总体上的思路是和Windows下JavaWeb项目部署到tomcat差不多,具体步骤和命令如下. 注:部署之 ...

  3. idea新建javaweb工程

    最近尝试了idea的使用,将idea建立javaweb工程的步骤记录下来 1.方框里边是重点 2.next后输入工程文件名点击finish 3.如图看到项目文件夹里边没有WEB-INF文件夹及里边的w ...

  4. 创建一个JavaWeb工程

    1.用到的工具:eclipse编译器+Tomcat9,在自己电脑上已配置好jdk和tomcat的环境变量 2.新建一个project 2.选择web文件中的Dynamic Web project,进入 ...

  5. 一步一步实现web程序信息管理系统之三----登陆业务逻辑实现(验证码功能+参数获取)

    本篇紧接着上一篇文章[一步一步实现web程序信息管理系统之二----后台框架实现跳转登陆页面] 验证码功能 一般验证码功能实现方式为,前端界面访问一个url请求,后端服务代码生成一个图片流返回至浏览器 ...

  6. maven构建的模块化的JavaWeb工程

    最近对maven构建的模块化的JavaWeb工程,比较感兴趣,所以自己就想从头弄一个出来,在此做一个记录,供以后学习. 前置条件:电脑上有eclipse(或者myeclipse,记事本也可以,那样就得 ...

  7. 如何将Javaweb工程的访问协议由http改为https及通过域名访问?

    将javaweb工程的http访问协议更改为https,需要做一下几部操作: 通过jre生成证书 调整tomcat的配置 调整工程的web.xm配置 具体详细过程如下: 一.生成证书 打开cmd切换到 ...

  8. idea中创建maven的Javaweb工程并进行配置

    学完maven后,可以创建maven的javaweb工程,在创建完成后还需要一些配置,下面来说下具体步骤,在这里我创建的是一个模块,创建web项目的方式和创建模块一样 1.创建一个模块,点new-Mo ...

  9. 问题总结:mysql和javaweb工程连接的过程中容易产生的问题

    问题背景:自己在本机的mysql8瘫痪了,将Oracle中的数据迁移到mysql之后,配置好javaweb工程和虚拟机上的远程Mysql连接的文件之后:遇见了无法访问的问题 具体的配置: dataso ...

  10. 产品相关 细说软件产品和业务 & 业务过程(流程) & 业务逻辑

    细说软件产品和业务& 业务过程(流程) & 业务逻辑   by:授客 QQ:1033553122   作为一名测试人猿,需要懂产品,不懂产品的测试猿不是好测试猿猴.而业务逻辑是软件产品 ...

随机推荐

  1. 使用 openssl 从cer公钥证书中导出公钥pem

    使用 openssl 从cer公钥证书中导出公钥pem ---------- "der 公钥证书"转 "base64 公钥证书"openssl x509 -in ...

  2. AIGC底层技术介绍

    1.AIGC概述 AIGC,全称Artificial Intelligence Generated Content,即人工智能生成内容.这是一种新兴的人工智能技术,其核心思想是利用人工智能模型,根据给 ...

  3. java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $

    java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $ pack ...

  4. 开箱即用的Live2d

    安装 npm i @tomiaa/live2d 代码 <template> <div ref="live2dContentRef" id="live2d ...

  5. 颠覆传统编程,用ChatGPT十倍提升生产力

    我们即将见证一个新的时代!这是最好的时代,也是最坏的时代! 需求背景 背景: 平时会编写博客,并且会把这个博客上传到github上,然后自己买一个域名挂到github上. 我平时编写的博客会有一些图片 ...

  6. 背包dp——01背包

    01背包是背包dp的基础的重点,重点的基础!!! 题意概要:有 n 个物品和一个容量为 W 的背包,每个物品有重量 w_{i} 和价值 v_{i} 两种属性,要求选若干物品放入背包使背包中物品的总价值 ...

  7. BigCodeBench: 继 HumanEval 之后的新一代代码生成测试基准

    HumanEval 是一个用于评估大型语言模型 (LLM) 在代码生成任务中的参考基准,因为它使得对紧凑的函数级代码片段的评估变得容易.然而,关于其在评估 LLM 编程能力方面的有效性越来越多的担忧, ...

  8. Vue2 整理(二):核心篇(组件化开发)

    前言 上一篇连接:vue2 整理:基础篇. 组件化开发 组件概念 组件,对于学Java的人来说的话,这个词所要表达的意思再熟悉不过了. 所谓组件就是:面向对象中的抽象.封装思想:而所谓的组件化就是:把 ...

  9. VS2015 、VS2017 MFC输出日志到控制台窗口

    原来使用VS2010建立的项目,安装VS2017后,发现MFC无法通过调试窗口输出printf打印的内容,在CSDN上找到了一个解决方案,使用后恢复打印调试信息功能,推荐如下: https://blo ...

  10. SSM中Mybatis的配置

    注:数据库连接(此过程不当做本次笔记重点,只做简单概述) 1.创建并配置jdbc.properties文件 2.通过Druid连接池配置连接数据库 3.将数据源(dataSource)注入IOC 详细 ...