Javaweb 登陆与验证码
本次记录分角色登陆以及验证码的Servlet。
1.登陆验证
<html>
<%--
Created by IntelliJ IDEA.
User: jiachenglin
Date: 2022/11/11
Time: 14:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<head>
<title>Title</title>
</head>
<html>
<head>
<title>顾客登陆</title>
<h1 style="text-align: center">学生登陆</h1>
</head>
<body>
<form action="${pageContext.request.contextPath}/StudentServlet" method="post">
<div style="color: red;text-align: center">${login_err}</div><br>//从Servlet中传回登陆错误信息
学号:<input type="text" id="userne" name="id" maxlength="20"><br> //maxlength是指此处最长输入20个字符
<span id="ne_err" style="color: red;display:none">输入有误</span><br>
<span id="ne_num" style="display: none">最长20位</span>
密码:<input type="password" id="pswd" name="password" maxlength="20"><br>
<span id="pswd_err" style="color: red;display:none">输入有误</span><br>
验证码:<input type="text" name="valistr">
<image src="code" id="identity" onload="btn.disable=false;" style="cursor:pointer; vertical-align:middle"/>
<input type="button" value="看不清,更换验证码" onclick="changeImageCode()" id="btn" ><br>
<div style="color: red">${yan}</div><br>
<input type="submit" value="登陆"><input type="reset" value="重制"><br>
<input type="hidden" name="method" value="login"><br>
<a href="index.jsp">点击返回</a>
</form>
<script type="text/javascript">
<!--验证码切换-->
function changeImageCode() {
document.getElementById('btn').isDisabled=true;
document.getElementById('identity').src='code?ts='+new Date().getTime();
}
let ne_num=document.getElementById("ne_num");
ne_num.onblur=function (){
let ne_num1=ne_num.value.trim();
if(ne_num1.length==20){
document.getElementById("ne_num").style.display='';
}else{
document.getElementById("ne_num").style.display='none';
}
}
</script>
</body>
</html>
___________________________________________________________________________________________________________________
Servlet内容
case "login":
String id = request.getParameter("id");
String password = request.getParameter("password");
String cher = request.getParameter("valistr");
String cher2 = request.getSession().getAttribute("randomCode").toString();
List<Student> list1 = studentDao.login(id, password);
if (list1.isEmpty()) {
request.setAttribute("login_err", "用户名或密码错误");
request.getRequestDispatcher("student.jsp").forward(request, response);
} else if (!cher.toLowerCase().equals(cher2.toLowerCase())) {//校验验证码
request.setAttribute("yan", "验证码不一致!");
request.getRequestDispatcher("student.jsp").forward(request, response);
} else {
request.setAttribute("user", id);
request.getRequestDispatcher("studentjm.jsp").forward(request, response);
}
break;
___________________________________________________________________________________________________________________
2.验证码Servlet
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet(name = "VerifyCodeServlet", urlPatterns = "/code")
public class VerifyCodeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//防止浏览器缓存验证码
response.setDateHeader("Expires",-1);
response.setHeader("Cache-Control","no-Cache");
response.setHeader("pragma","no-Cache");
int width = 60;//验证码总宽度
int height = 20;//验证码总高度
// 随机数
char[] codeChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray();//字符串转换成字符数组
String captcha = "";//定义一个临时路径
Random random = new Random();//new 随机类Random
// 生成验证码图片
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 绘制矩形
Graphics2D graphics = image.createGraphics();//绘制环境对象
graphics.setColor(Color.WHITE);//背景色
graphics.fillRect(0, 0, width, height);//绘制矩形
Font font=new Font("Times New Roman",Font.PLAIN,18);
graphics.setFont(font);
//画边框
graphics.setColor(Color.BLACK);
graphics.drawRect(0,0,-1,-1);
//随机产生160条干扰线
graphics.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);
graphics.drawLine(x,y,x+x1,y+y1);
}
//randomCode用于保存随机产生的验证码
StringBuffer randomCode=new StringBuffer();
int red=0,green=0,blue=0;
// 生成验证码图片
for (int i = 0; i < 4; i++) {
int strRand=random.nextInt(codeChar.length)+1;
String s= String.valueOf(codeChar[strRand]);
//产生随机的颜色分量来构造颜色值
red=random.nextInt(110);
green=random.nextInt(50);
blue=random.nextInt(50);
graphics.setColor(new Color(red,green,blue));
graphics.drawString(s,13*i+6,16);
randomCode.append(s);
// int index = random.nextInt(codeChar.length);
// // 设置验证码字体图片颜色
// graphics.setColor(new Color(random.nextInt(110), random.nextInt(150), random.nextInt(200)));
// // 每个验证码字体的宽间距,高度
// graphics.drawString(codeChar[index] + "", (i * 20) + 15, 20);
// captcha += codeChar[index];//把生成的验证码保存在临时变量中
}
//将四位验证码保存在session中
HttpSession session= request.getSession();
session.setAttribute("randomCode",randomCode.toString());
//防止浏览器缓存验证码
response.setDateHeader("Expires",-1);
response.setHeader("Cache-Control","no-Cache");
response.setHeader("pragma","no-Cache");
response.setContentType("image/jpeg");
ServletOutputStream sos=response.getOutputStream();
// request.getSession().setAttribute("codes", captcha); //把验证码保存在Session对象中
// 利用ImageI0输出验证码
ImageIO.write(image, "jpeg", sos);
sos.close();
}
}
Javaweb 登陆与验证码的更多相关文章
- 利用htmlunit登陆带验证码图片的网站
http://htsoft.org/html/y2011/822_using-htmlunit-landing-site-with-captcha-image.html 利用htmlunit登陆带验证 ...
- JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客
JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客https://blog.csdn.net/KooKing_L/article/details/79711379
- 登陆时验证码的制作(asp.net)
登陆时验证码的制作(asp.net) 1.显示样式: 2.新建一个页,Default2.aspx 3.在Page_load事件拷入如下代码 stringtmp = RndNum(4); HttpCoo ...
- 模拟Post登陆带验证码的网站
前言: 作者在一个项目需求 模拟用户登陆,获取该用户的订单记录. 该系统需要用户名,密码,验证码 (验证码为正楷的数字4位),于是参考网络一些文章,并进行了很多测试,总结步骤如下: 步骤1 : 通过h ...
- MVC5----用户登陆及验证码
随便写写记录一下学习的过程 登陆 Models中添加添加 public class LoginViewModel { [Required(ErrorMessage = "*")] ...
- jsp登陆页面验证码在火狐浏览器不能刷新问题处理方案
jsp登陆页面在火狐浏览器验证码不能刷新问题处理方案: <img src="YzmServlet" onClick="this.src='YzmServlet?ti ...
- HttpClient4登陆有验证码的网站
其实就这个问题,本来是很简单的,我自己花了近两个下午才搞定,现在记录一下.也希望能帮助后来的朋友. 先说httpclient 操蛋的httpclent! 为什么说操蛋呢,因为从httpclient ...
- MVC基本登陆与验证码功能实现
一.基本登陆实现与验证码功能实现,该功能是和spring.net功能集合使用的,因为后面要用到验证是否处于登陆状态 1. 先构建一个登陆页面 @{ Layout = null; } <!DOCT ...
- python模拟网站登陆-滑动验证码
普通滑动验证 以http://admin.emaotai.cn/login.aspx为例这类验证码只需要我们将滑块拖动指定位置,处理起来比较简单.拖动之前需要先将滚动条滚动到指定元素位置. impor ...
- react项目中登陆注册验证码的倒计时,页面刷新不会重置
目前很多的网站和app在做登陆注册时都会用到手机验证码,为了防止验证码轰炸,也就是随意的点击验证码,一般我们需要对获取验证码进行一些限制,最常用到的是在规定时间内不得重复发送. 实现倒计时很简单,可以 ...
随机推荐
- win32com操作word 第三集:Range精讲(一)
本课程<win32com操作word API精讲&项目实战>,本公众号以文字分享为主,B站与视频号则发布视频分享,ID均为:一灯编程 本集开始,将会深入Document接口.打开或 ...
- Ant Design Table 如何动态自定义?Ant Popover 遮挡?
项目场景: 基于electron + Vue + node.js + express + mysql + evanpatchouli-mysql + Ant-Design-Vue,编写一款属于自己的轻 ...
- Longhorn+K8S+KubeSphere云端数据管理,实战 Sentry PostgreSQL 数据卷增量快照/备份与还原
云端实验环境配置 VKE K8S Cluster Vultr 托管集群 https://vultr.com/ 3 个 worker 节点,kubectl get nodes. k8s-paas-71a ...
- 使用linux命令直接在网上下载文件,解压,改名
举例: 我们想要在服务器某个路径下,下载一个node.js包 操作如下 假如文件地址为https://npm.taobao.org/mirrors/node/v16.9.1/node-v16.9.1- ...
- What's new in Dubbo 3.1.5 and 3.2.0-beta.4
在 1 月 27 日,新年伊始,Dubbo 3.1.5 和 3.2.0-beta.4 正式通过投票发布.本文将介绍发布的变化一览. Dubbo 3.1.5 版本是目前 Dubbo 3 的最新稳定版本, ...
- docker02-centos上安装
1.前提说明Docker 运行在 CentOS 7 上,要求系统为64位.系统内核版本为 3.10 以上.Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位 ...
- (二) MdbCluster分布式内存数据库——分布式架构1
(二) MdbCluster分布式内存数据库--分布式架构1 分布式架构是MdbCluster的核心关键,业界有很多相关的实现,却很少有文章详细的解释每个架构实现背后的细节和这么做的原因.在Mdb ...
- Navicat 15 or 16 永久版本(window和Mac)
一.下载Navicat Premium 官网https://www.navicat.com.cn/下载最新版本下载安装 链接包含(window激活包和Mac版本,请选择性下载): https://no ...
- SQLSERVER 临时表和表变量到底有什么区别?
一:背景 1. 讲故事 今天和大家聊一套面试中经常被问到的高频题,对,就是 临时表 和 表变量 这俩玩意,如果有朋友在面试中回答的不好,可以尝试看下这篇能不能帮你成功迈过. 二:到底有什么区别 1. ...
- Portainer功能使用之开启远程访问
配置远程连接Docker服务 1.配置 说明:docker默认没有打开"2375"端口,需要先进行配置开启端口 命令 修改配置:vim /usr/lib/systemd/syste ...