(servelet)验证码
时间:2022-06-06
本文章向大家介绍(servelet)验证码,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
验证码的作用
- 为了防止机器人的破坏操作,可以使用验证码技术来防止恶意的发送数据。
- 验证码本质上是一张动态产生的图片。
- 图片的内容会随着程序的运行而随机产生。
验证码的绘制
- 验证码图片的生成需要使用java提供的与绘图有关的一系列API。
- 想要绘图,需要画板,画笔,颜料,背景色,字体等多种类对象配合完成。
验证码图片的绘制步骤
- 1、创建一个内存画板对象
- 2、获取画笔
- 3、为画笔指定颜色
- 4、为画板设置背景色
- 5、绘制一个随机的字符串
- 6、修改画笔颜色
- 7、绘制多条干扰线
- 8、压缩图片并输出到客户端
package com.verificationCode.servelet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class ValidateCode extends HttpServlet {
private static final long serialVersionUID = 1L;
public ValidateCode() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//0、创建空白图片
BufferedImage image = new BufferedImage(100, 30, BufferedImage.TYPE_INT_RGB);
//1、获取图片画笔
Graphics g = image.getGraphics();
Random r = new Random();
//2、设置画笔颜色
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
//3、绘制矩形的背景
g.fillRect(0, 0, 100, 30);
//4、调用自定义的方法,获取长度为5的字母数字组合的字符串
String number = getNumber(5);
HttpSession session = request.getSession();
session.setAttribute("code", number);
g.setColor(new Color(0, 0, 0));
g.setFont(new Font(null, Font.BOLD, 24));
//5、设置颜色字体后,绘制字符串
g.drawString(number, 5, 25);
//6、绘制8条干扰线
for(int i = 0;i<8;i++){
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255), r.nextInt(255)));
g.drawLine(r.nextInt(100), r.nextInt(30), r.nextInt(100), r.nextInt(30));
}
response.setContentType("image/jpeg");
OutputStream ops = response.getOutputStream();
ImageIO.write(image, "jpeg", ops);
ops.close();
}
private String getNumber(int size){
String str = "ASDFGHJLPOIUYTREWQZXCVBNM";
String number = "";
Random r = new Random();
for(int i = 0 ; i<size;i++){
number += str.charAt(r.nextInt(str.length()));
}
return number;
}
}
验证码的验证流程
- 请求带有验证码的页面时:
- 通过img标签的src属性获取验证码图片
- 服务器端生成随机字符串,并绘制
- 服务器端将生成的随机字符串绑定到session中
- 提交表单及填写的验证码内容时:
- 处理程序将session中绑定的正确的验证码字符串取出来
- 获取表单提交时填写的验证码内容
- 比较两者,根据结果做出判断
package com.verificationCode.servelet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class ActionServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public ActionServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String uri = request.getRequestURI();
String action = uri.substring(uri.lastIndexOf("/")+1, uri.lastIndexOf("."));
//判断动作是否为登录
if(action.equals("login")){
String name = request.getParameter("uname");
String pwd = request.getParameter("pwd");
String number = request.getParameter("vcode");
HttpSession session = request.getSession();
String code = session.getAttribute("code").toString();
if(number.equals(code)&&name.equals("111")&&pwd.equals("111")){
//编程式--设定session超时时间为10秒
//session.setMaxInactiveInterval(10);
session.setAttribute("uname", name);
//重定向到首页
//response.sendRedirect("index.jsp");
response.sendRedirect(response.encodeRedirectUrl("index.jsp"));
} else{
//登录失败
request.setAttribute("msg", "用户名或密码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}else if(action.equals("logout")){
HttpSession session = request.getSession();
//session失效
session.invalidate();
response.sendRedirect("login.jsp");
}
out.close();
}
}
login.jsp代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type="text/javascript"></script>
<style type="text/css">
.s1 {
cursor: pointer;
}
</style>
</head>
<body>
<form action="" method="post">
姓名:<input type="text" /><br>
密码:<input type="password" /><br>
验证码:<input type="text" />
<img src="code" onclick="this.src='code?'+Math.random()" class="s1" title="点击更换"><br>
<input type="submit" value="提交" />
</form>
</body>
</html>
web.xml代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>verificationCode</display-name>
<servlet>
<servlet-name>ValidateCode</servlet-name>
<servlet-class>com.verificationCode.servelet.ValidateCode</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ValidateCode</servlet-name>
<url-pattern>/code</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ActionServlet</servlet-name>
<servlet-class>com.verificationCode.servelet.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ActionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux系统运维企业常见面试题集合(三)
- python第三十二课——队列
- python第三十四课——1.匿名函数的定义和使用
- python第三十四课——2.匿名函数配合容器函数的使用
- 专家专栏|使用agent2自定义插件采集通过MQTT协议发送的数据
- Linux系统双网卡绑定配置教程
- python第三十五课——生成器
- python第三十六课——1.可迭代对象
- Linux系统Shell编程——脚本编写思路与过程
- python第三十六课——2.迭代器对象
- python第三十七课——模块
- Linux系统MySQL数据库主从同步实战过程
- 最火的java8新特性:Lambda 表达式
- python第三十九课——面向对象(二)之设计类
- python第三十九课——面向对象(二)之初始化属性