Java Web实现登录验证码(Servlet+jsp)
1.生成验证码图片(Servlet)
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random; import javax.imageio.ImageIO;
import javax.servlet.ServletException;
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; /**
* Servlet implementation class VerifyCode
*/
@WebServlet("/VerifyCode")
public class VerifyCode extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public VerifyCode() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 首先设置浏览器不缓存
response.setHeader("cache-control", "no-cache");
response.setHeader("Expire", "-1"); // >0为缓存
response.setHeader("pragma", "no-cache");
// 存储正确的验证码
String vali_code = "";
String Vali_str = "abcdefghijklmnopqrstuvwsyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Color[] colors =
{ Color.BLACK, Color.RED, Color.BLUE };
// 1.创建图像
int width = 110, height = 40;
int x_offset = 5, y_offset = 28;
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
// 2.创建画布
Graphics2D g = img.createGraphics();
// 3.为画布添加背景颜色为亮灰色
g.setColor(Color.LIGHT_GRAY);
g.fillRect(0, 0, width, height);//fillRect是包括矩形框内部
// 4.为画布添加边框
g.setColor(Color.BLUE);
g.drawRect(0, 0, width - 1, height - 1);//drawRect是绘制矩形边框
// 5.绘制干扰线
for (int i = 0; i < 10; i++)
{
g.setColor(new Color(randNum(0, 255), randNum(0, 255), randNum(0, 255)));
g.drawLine(randNum(0, width), randNum(0, height), randNum(0, width), randNum(0, height));
}
g.setFont(new Font("黑体", Font.BOLD, 20));
for (int i = 0; i < 4; i++)
{
int r = randNum(-180, 180);
String code = Vali_str.charAt(randNum(0, Vali_str.length() - 1)) + "";
g.rotate(r / 180 * Math.PI);
g.setColor(colors[randNum(0, colors.length)]);
g.drawString(code, x_offset + i * 30, y_offset);
g.rotate(-r / 180 * Math.PI);
vali_code += code;
} //将验证码的内容存储在HttpSession中
HttpSession session = request.getSession();
session.setAttribute("Valicode", vali_code); // 通过response的输出流打给浏览器
ImageIO.write(img, "jpg", response.getOutputStream());
}
private Random random = new Random();
//随机生成begin和end之间的一个int值
private int randNum(int begin, int end)
{
return random.nextInt(end - begin) + begin;
}
}
2.JSP显示验证码
<input type="text" placeholder="输入验证码" name="ValiImage" id="ValiImage" /><!-- 输入验证码文本 -->
<img src="VerifyCode" onclick="changeValiImage(this)"><!-- 验证码图片 --> <script type="text/javascript"> function changeValiImage(img){
img.src = "VerifyCode?time=" + new Date().getTime();//刷新
} </script>
3.进行用户输入和正确验证码的比对
我在LoginServlet中
//1 获得用户输入的验证码
String verifyCode = request.getParameter("ValiImage");
//2 获得服务器session 存放数据 ,如果没有返回null
String sessionCacheData = (String) request.getSession().getAttribute("Valicode");
// *将服务器缓存session数据移除
request.getSession().removeAttribute("Valicode");
// ** 判断服务器是否存在
if(sessionCacheData == null){
request.setAttribute("message", "请不要重复提交");
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
}
//3 比较
if(! sessionCacheData.equalsIgnoreCase(verifyCode)){
//用户输入错误
// * 存放request作用域
request.setAttribute("message", "验证码输入错误");
// * 请求转发
request.getRequestDispatcher("login.jsp").forward(request, response);
return;
}
//接登录方法...


Java Web实现登录验证码(Servlet+jsp)的更多相关文章
- java web 开发入门 --- tomcat/servlet/jsp
在做java web 开发时,要先安装tomcat.它是一个web服务器,也叫web容器,我们把写好的jsp, html页面放到它里面,然后启动它,就可以用浏览器访问这些页面,地址栏中输入localh ...
- Java Web制作登录 验证码
具体操作如下: 新建一个servlet,代码如下:标记一个WebServlet, @WebServlet(urlPatterns = {"/checkCode"}) //验证码Se ...
- java web 学习总结之 Servlet/JSP 编码问题
Servlet和JSP编码问题 字节流: 1.得到OutputStream 字节流 OutputStream os = response.getOutputStream(); 用默认编码输出数据 ...
- SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。
熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...
- Java web每天学之Servlet工作原理详情解析
上篇文章中我们介绍了Servlet的实现方式以及Servlet的生命周期,我们这篇文章就来介绍一下常用对象. 点击回顾:<Java Web每天学之Servlet的工作原理解析>:<J ...
- Java Web每天学之Servlet的原理解析
Java Web每天学之Servlet的工作原理解析,上海尚学堂Java技术文章Java Web系列之二上一篇文章Java Web每天学之Servlet的工作原理解析是之一,欢迎点击阅读. Servl ...
- 【Java Web开发学习】Servlet、Filter、Listener
[Java Web开发学习]Servlet 转发:https://www.cnblogs.com/yangchongxing/p/9274739.html 1.Servlet package cn.y ...
- Java Web整合开发(3) -- Servlet
Servlert基本程序架构: (FirstServlet.java + web.xml) FirstServlet.java package com.helloben.servlet; import ...
- Web用户登录---验证码的设计与实现
在开发中验证码是比较常用到有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试的方式. 验证码生成步骤:1.获得随机生成的颜色,画出随机线条生成背景底.2.String cod ...
随机推荐
- Linux命令(七)之上传/共享/挂载文件至Linux系统中
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- Manage sshd Service on CentOS
Check the current sshd status: service sshd status Start sshd service: service sshd start Set sshd a ...
- CYPEESS USB3.0程序解读之---SPI读写
前面已经解读了GPIO以及同步FIFO操作,下面我们看一个SPI读写的例子,它是主程序命令从SPI中读写一些数据. SPI传输子程序看一下: 页地址,字节计数,缓冲区,读写标志 因为只能一页一页的读或 ...
- Java横向技术 网络【笔记】
Java横向技术 网络[笔记] 计算机网络 服务器返回给客户端 http 响应包的状态码有哪几大类?302.304 分别是什么意思? 状态码分为五大类: (1)信息性状态码(Informatio ...
- DVWA(五):CSRF 全等级跨站请求伪造
CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie.会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面 ...
- STM32—SPI详解
目录 一.什么是SPI 二.SPI协议 物理层 协议层 1.通讯时序图 2.起始和停止信号 3.数据有效性 4.通讯模式 三.STM32中的SPI 简介 功能框图 1.通讯引脚 2.时钟控制逻辑 3. ...
- Semaphore 的使用
var workerSemphore = new Semaphore(0, 800000); var IsWorkThreadCreated = true; var workThread = new ...
- IOC--框架进阶
IOC控制反转 含义:把高层对底层的依赖 转移到由第三方决定 避免高层对底层的直接依赖 使得程序架构具有良好的扩展性和稳定性 理解:就是一种目的--解除依赖 DI依赖注入 含义:在构造对象是 可以自动 ...
- Spring整合Quartz轻松完成定时任务
一.背景 上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等. 二.开发环境及必 ...
- 深入浅出Mybatis系列(七)---TypeHandler简介
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型.Mybatis默认 ...