本次记录分角色登陆以及验证码的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 登陆与验证码的更多相关文章

  1. 利用htmlunit登陆带验证码图片的网站

    http://htsoft.org/html/y2011/822_using-htmlunit-landing-site-with-captcha-image.html 利用htmlunit登陆带验证 ...

  2. JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客

    JEECG--去掉(增加)登陆页面验证码功能 - CSDN博客https://blog.csdn.net/KooKing_L/article/details/79711379

  3. 登陆时验证码的制作(asp.net)

    登陆时验证码的制作(asp.net) 1.显示样式: 2.新建一个页,Default2.aspx 3.在Page_load事件拷入如下代码 stringtmp = RndNum(4); HttpCoo ...

  4. 模拟Post登陆带验证码的网站

    前言: 作者在一个项目需求 模拟用户登陆,获取该用户的订单记录. 该系统需要用户名,密码,验证码 (验证码为正楷的数字4位),于是参考网络一些文章,并进行了很多测试,总结步骤如下: 步骤1 : 通过h ...

  5. MVC5----用户登陆及验证码

    随便写写记录一下学习的过程 登陆 Models中添加添加 public class LoginViewModel { [Required(ErrorMessage = "*")] ...

  6. jsp登陆页面验证码在火狐浏览器不能刷新问题处理方案

    jsp登陆页面在火狐浏览器验证码不能刷新问题处理方案: <img src="YzmServlet" onClick="this.src='YzmServlet?ti ...

  7. HttpClient4登陆有验证码的网站

    其实就这个问题,本来是很简单的,我自己花了近两个下午才搞定,现在记录一下.也希望能帮助后来的朋友. 先说httpclient 操蛋的httpclent!   为什么说操蛋呢,因为从httpclient ...

  8. MVC基本登陆与验证码功能实现

    一.基本登陆实现与验证码功能实现,该功能是和spring.net功能集合使用的,因为后面要用到验证是否处于登陆状态 1. 先构建一个登陆页面 @{ Layout = null; } <!DOCT ...

  9. python模拟网站登陆-滑动验证码

    普通滑动验证 以http://admin.emaotai.cn/login.aspx为例这类验证码只需要我们将滑块拖动指定位置,处理起来比较简单.拖动之前需要先将滚动条滚动到指定元素位置. impor ...

  10. react项目中登陆注册验证码的倒计时,页面刷新不会重置

    目前很多的网站和app在做登陆注册时都会用到手机验证码,为了防止验证码轰炸,也就是随意的点击验证码,一般我们需要对获取验证码进行一些限制,最常用到的是在规定时间内不得重复发送. 实现倒计时很简单,可以 ...

随机推荐

  1. C Primer Plus(4.8)編程練習

    /*C Primer Plus (4.7) 5*/ 1 include<stdio.h> 2 #define BOOK "War and Peace" 3 int ma ...

  2. ADG无法同步:TT00进程报错 Error 12514

    环境: Oracle 19.16 ADG (Single Instance -> RAC) 在配置ADG的场景,发现ADG不能同步. 1.查看报错信息 2.oerr查看该错误说明 3.尝试sql ...

  3. 芯片下载相关-CH32系列芯片下载方式汇总及教程

    一.CH32Fx系列芯片下载 1.ISP下载: 2.SWD下载 3.脱机烧录器下载: 二.CH32Vx系列芯片下载 1.ISP下载: 2.SWD下载: 3.脱机烧录器下载: 4.CH32V003下载注 ...

  4. 走进Linux

    走进Linux Linux诞生 ​ BSD,Unix,Minix都是操作系统. ​ 1991年,林纳斯托瓦兹在上大学时,对操作系统很好奇.但是由于 386 BSD 还没有出来.可是他不喜欢他的 386 ...

  5. Vue32 插槽

    1 简介 是一种组件间通信的方式,让父组件可以向子组件指定位置插入 html 结构.子组件中的提供给父组件使用的一个占位标签,用<slot></slot> 表示,父组件可以在这 ...

  6. Idea移除和删除模块

    移除:右键模块-remove moduel 删除:在移除操作后 右键模块-delete 然后删除项目pom文件里面的<moduel>

  7. 来了!来了!国内使用chatGPT的方式总结

    大家好,最近ChatGPT大火呀. 最近几天OpenAI发布的ChatGPT聊天机器人火出天际了,连着上了各个平台的热搜榜. 这个聊天机器人最大的特点是不仅可以模仿人类说话风格同时回答大量问题,能和你 ...

  8. python中操控excel的几个库:xlwt,xlrd,xlutils

    一.xlrd和xlwt模块介绍 xlrd模块提供在任何平台上从excel电子表格(.xls和.xlsx)中提取数据的功能,xlwt模块提供生成与Microsoft Excel 95 到2003版本兼容 ...

  9. 记一次hooks陷阱

    今天写一个hook,正想发挥hooks这种高级复用方式来缩短我的开发时间,就出现了一个新bug. 我编写的这个hook用于管理数据列表状态.除了导出内部的状态外,还导出一些方法供外部调用.代码简化如下 ...

  10. TouchableOpacity无效

    错误代码如下: <TouchableOpacity onPress={this.handleConfirmPress} activeOpacity={0.6} > <Text sty ...