【Project】原生JavaWeb工程 02 登陆业务的流程(第一阶段样例)
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 登陆业务的流程(第一阶段样例)的更多相关文章
- ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题
] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题 标签: myeclipsejavawebWeb App Libraries 2013-10-16 1 ...
- Linux环境下在Tomcat上部署JavaWeb工程
本文讲解如何将我们已经编译好的JavaWeb工程在Linux环境下的Tomcat上进行部署,总体上的思路是和Windows下JavaWeb项目部署到tomcat差不多,具体步骤和命令如下. 注:部署之 ...
- idea新建javaweb工程
最近尝试了idea的使用,将idea建立javaweb工程的步骤记录下来 1.方框里边是重点 2.next后输入工程文件名点击finish 3.如图看到项目文件夹里边没有WEB-INF文件夹及里边的w ...
- 创建一个JavaWeb工程
1.用到的工具:eclipse编译器+Tomcat9,在自己电脑上已配置好jdk和tomcat的环境变量 2.新建一个project 2.选择web文件中的Dynamic Web project,进入 ...
- 一步一步实现web程序信息管理系统之三----登陆业务逻辑实现(验证码功能+参数获取)
本篇紧接着上一篇文章[一步一步实现web程序信息管理系统之二----后台框架实现跳转登陆页面] 验证码功能 一般验证码功能实现方式为,前端界面访问一个url请求,后端服务代码生成一个图片流返回至浏览器 ...
- maven构建的模块化的JavaWeb工程
最近对maven构建的模块化的JavaWeb工程,比较感兴趣,所以自己就想从头弄一个出来,在此做一个记录,供以后学习. 前置条件:电脑上有eclipse(或者myeclipse,记事本也可以,那样就得 ...
- 如何将Javaweb工程的访问协议由http改为https及通过域名访问?
将javaweb工程的http访问协议更改为https,需要做一下几部操作: 通过jre生成证书 调整tomcat的配置 调整工程的web.xm配置 具体详细过程如下: 一.生成证书 打开cmd切换到 ...
- idea中创建maven的Javaweb工程并进行配置
学完maven后,可以创建maven的javaweb工程,在创建完成后还需要一些配置,下面来说下具体步骤,在这里我创建的是一个模块,创建web项目的方式和创建模块一样 1.创建一个模块,点new-Mo ...
- 问题总结:mysql和javaweb工程连接的过程中容易产生的问题
问题背景:自己在本机的mysql8瘫痪了,将Oracle中的数据迁移到mysql之后,配置好javaweb工程和虚拟机上的远程Mysql连接的文件之后:遇见了无法访问的问题 具体的配置: dataso ...
- 产品相关 细说软件产品和业务 & 业务过程(流程) & 业务逻辑
细说软件产品和业务& 业务过程(流程) & 业务逻辑 by:授客 QQ:1033553122 作为一名测试人猿,需要懂产品,不懂产品的测试猿不是好测试猿猴.而业务逻辑是软件产品 ...
随机推荐
- 使用 openssl 从cer公钥证书中导出公钥pem
使用 openssl 从cer公钥证书中导出公钥pem ---------- "der 公钥证书"转 "base64 公钥证书"openssl x509 -in ...
- AIGC底层技术介绍
1.AIGC概述 AIGC,全称Artificial Intelligence Generated Content,即人工智能生成内容.这是一种新兴的人工智能技术,其核心思想是利用人工智能模型,根据给 ...
- 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 ...
- 开箱即用的Live2d
安装 npm i @tomiaa/live2d 代码 <template> <div ref="live2dContentRef" id="live2d ...
- 颠覆传统编程,用ChatGPT十倍提升生产力
我们即将见证一个新的时代!这是最好的时代,也是最坏的时代! 需求背景 背景: 平时会编写博客,并且会把这个博客上传到github上,然后自己买一个域名挂到github上. 我平时编写的博客会有一些图片 ...
- 背包dp——01背包
01背包是背包dp的基础的重点,重点的基础!!! 题意概要:有 n 个物品和一个容量为 W 的背包,每个物品有重量 w_{i} 和价值 v_{i} 两种属性,要求选若干物品放入背包使背包中物品的总价值 ...
- BigCodeBench: 继 HumanEval 之后的新一代代码生成测试基准
HumanEval 是一个用于评估大型语言模型 (LLM) 在代码生成任务中的参考基准,因为它使得对紧凑的函数级代码片段的评估变得容易.然而,关于其在评估 LLM 编程能力方面的有效性越来越多的担忧, ...
- Vue2 整理(二):核心篇(组件化开发)
前言 上一篇连接:vue2 整理:基础篇. 组件化开发 组件概念 组件,对于学Java的人来说的话,这个词所要表达的意思再熟悉不过了. 所谓组件就是:面向对象中的抽象.封装思想:而所谓的组件化就是:把 ...
- VS2015 、VS2017 MFC输出日志到控制台窗口
原来使用VS2010建立的项目,安装VS2017后,发现MFC无法通过调试窗口输出printf打印的内容,在CSDN上找到了一个解决方案,使用后恢复打印调试信息功能,推荐如下: https://blo ...
- SSM中Mybatis的配置
注:数据库连接(此过程不当做本次笔记重点,只做简单概述) 1.创建并配置jdbc.properties文件 2.通过Druid连接池配置连接数据库 3.将数据源(dataSource)注入IOC 详细 ...