【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 作为一名测试人猿,需要懂产品,不懂产品的测试猿不是好测试猿猴.而业务逻辑是软件产品 ...
随机推荐
- 剑指Offer-62.二叉搜索树的第k个结点(C++/Java)
题目: 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. 分析: 二叉搜索树的中序遍历结果正好是按数值升序排列的结 ...
- 剑指Offer-47.求1+2+3+...+n(C++/Java)
题目: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 分析: 利用短路与来判断n是否大于0,从而实现递 ...
- helm常用命令
一.helm常用命令 1.查看帮助 helm help 2.创建一个chart包模板 格式: helm create [releasename] 例子: $helm create hello-worl ...
- INFINI Labs 产品更新 | Easysearch 1.7.1发布
INFINI Labs 产品又更新啦~,包括 Console,Gateway,Agent 1.23.0 和 Easysearch 1.7.1.此次版本重点修复历史遗留 Bug .网友们提的一些需求等. ...
- Spring扩展——@Import注解
引言 在Spring中有许多Enable开头的注解,比如以下常见注解 @EnableTransactionManagement @EanbleAsync @EnableCache @EnableAsp ...
- 泛型模板化设计DEMO
泛型模板化设计DEMO 1. 定义Result泛型类 package com.example.core.mydemo.java.fanxing; public class Result<T> ...
- Python做点击率数据预测
点击率(Click-Through Rate, CTR)预测是推荐系统.广告系统和搜索引擎中非常重要的一个环节.在这个场景中,我们通常需要根据用户的历史行为.物品的特征.上下文信息等因素来预测用户点击 ...
- 天翼云centos7.6安装redis6.2.6
以下部分的具体略: 1.wget获取源码 2.make 这里重点说下,如何使用 utils/install_server.sh脚本 使用install_service.sh添加服务 有了这个脚本,那么 ...
- 【主流技术】聊一聊消息队列 RocketMQ 的基本结构与概念
目录 前言 一.初识 RocketMQ 1.1基本模型 二.基本概念 2.1Producer 2.2Consumer 2.3Topic 2.4Tag 2.5Message 2.6Broker 2.7P ...
- 记录一次EF实体跟踪错误
记录一次EF实体跟踪错误 前言 在我写文章编辑接口的,出现了一个实体跟踪的错误,详情如下 System.InvalidOperationException: The instance of entit ...