<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
1. 要求输入验证码
2. 在目标 Servlet 中验证验证码输入的是否正确, 若正确, 响应 success.jsp 页面; 若不正确, 返回 login.jsp
页面, 提示用户 "验证码错误", 并重新输入
-->
<font color="red">${requestScope.errormsg }</font>
<br><br>
<form action="LoginServlet" method="post">
<table>
<tr>
<td>Name: </td>
<td><input name="name" type="text"/></td>
</tr>
<tr>
<td>Password: </td>
<td><input name="password" type="password"/></td>
</tr>
<tr>
<td>Code: </td>
<td><img src="ValidateColorServlet" alt=""/></td>
</tr>
<tr>
<td>Confirm Code: </td>
<td><input name="code" type="text"/><font color="red">验证码区分大小写</font>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Submit"/>
</td>
</tr>
</table>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
注册成功!
</body>
</html>
package com.syh.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.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ValidateColorServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response) ;
}
// 生成数字和字母的验证码
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
service(request, response) ;
/*
//第一种产生随即验证码的方式 ,在采用第三种方式生成验证码的时候要将第一种和第二种方式都注释了
BufferedImage img = new BufferedImage(68, 22,
BufferedImage.TYPE_INT_RGB);
// 得到该图片的绘图对象
Graphics g = img.getGraphics();
Random r = new Random();
Color c = new Color(200, 150, 255);
g.setColor(c);
// 填充整个图片的颜色
g.fillRect(0, 0, 68, 22);
// 向图片中输出数字和字母
StringBuffer sb = new StringBuffer();
char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
int index, len = ch.length;
for (int i = 0; i < 4; i ++) {
index = r.nextInt(len);
g.setColor(new Color(r.nextInt(88), r.nextInt(188), r.nextInt
(255)));
g.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, 22));// 输出的字体和大小
g.drawString("" + ch[index], (i * 15) + 3, 18);//写什么数字,在图片的什么位置画
sb.append(ch[index]);
}
request.getSession().setAttribute("randomCode", randomCode.toString());
ImageIO.write(img, "JPG", response.getOutputStream());
} */
/*
//第二种产生随即验证码的方式 ,在采用第三种方式生成验证码的时候要将第一种和第二种方式都注释了
int width=150;//验证码图片宽度
int height=60;//验证码图片高度
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
Graphics g=image.getGraphics();
Random random=new Random();//创建一个随机类
g.setColor(getRandColor(200,250));//背景颜色要偏淡
g.fillRect(0, 0, width, height);//画背景
g.setColor(getRandColor(0,255));//边框颜色
g.drawRect(0, 0, width-1, height-1);//画边框
g.setColor(getRandColor(160,200));// 随机产生5条干扰线,使图象中的认证码不易被其它程序探测到
for(int i=0;i<8;i++){
int x=random.nextInt(width);
int y=random.nextInt(height);
int x1=random.nextInt(width);
int y1=random.nextInt(height);
g.drawLine(x, y, x1, y1);
}
g.setColor(getRandColor(160,200));// 随机产生100点,使图象中的认证码不易被其它程序探测到
for(int i=0;i<100;i++){
int x=random.nextInt(width);
int y=random.nextInt(height);
g.drawLine(x, y, x, y);
}
Font font = new Font("Times New Roman", Font.ITALIC,38); // 创建字体,字体的大小应该根据图片的高度来定。
g.setFont(font);//设置字体
int length = 6; // 设置默认生成4个验证码
String s="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // 设置备选验证码:包括"a-z"和数字"0-9"
String sRand="";
// 用随机产生的颜色将验证码绘制到图像中。
// 生成随机颜色(因为是做前景,所以偏深)
//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
for(int i=0;i<length;i++){
String ch=String .valueOf(s.charAt(random.nextInt(s.length())));
sRand+=ch;
g.drawString(ch, 22*i+12, (random.nextInt(5)-2)*i+40);
}
//将生成的字符串存储在session中
HttpSession session=request.getSession();
session.setAttribute("randomCode", randomCode.toString());
g.dispose();//图像生效
//禁止图像缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
//创建二进制的输出流
ServletOutputStream sos=response.getOutputStream();
// 将图像输出到Servlet输出流中。
ImageIO.write(image, "jpeg", sos);
sos.flush();
sos.close();
}
public Color getRandColor(int lower,int upper){
Random random = new Random();
if(upper>255)
upper=255;
if(upper<1)
upper=1;
if(lower<1)
lower=1;
if(lower>255)
lower=255;
int r=lower+random.nextInt(upper-lower);
int g=lower+random.nextInt(upper-lower);
int b=lower+random.nextInt(upper-lower);
return new Color(r,g,b);
} */
}
//第三种产生验证码的方式
//设置验证图片的宽度, 高度, 验证码的个数
private int width = 152;
private int height = 40;
private int codeCount = 4;
//验证码字体的高度
private int fontHeight = 4;
//验证码中的单个字符基线. 即:验证码中的单个字符位于验证码图形左上角的 (codeX, codeY) 位置处
private int codeX = 0;
private int codeY = 0;
//验证码由哪些字符组成
char [] codeSequence = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz23456789".toCharArray();
//初始化验证码图形属性
public void init(){
fontHeight = height - 2;
codeX = width / (codeCount + 2);
codeY = height - 4;
}
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//定义一个类型为 BufferedImage.TYPE_INT_BGR 类型的图像缓存
BufferedImage buffImg = null;
buffImg = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
//在 buffImg 中创建一个 Graphics2D 图像
Graphics2D graphics = null;
graphics = buffImg.createGraphics();
//设置一个颜色, 使 Graphics2D 对象的后续图形使用这个颜色
graphics.setColor(Color.WHITE);
//填充一个指定的矩形: x - 要填充矩形的 x 坐标; y - 要填充矩形的 y 坐标; width - 要填充矩形的宽度; height - 要填充矩形的高度
graphics.fillRect(0, 0, width, height);
//创建一个 Font 对象: name - 字体名称; style - Font 的样式常量; size - Font 的点大小
Font font = null;
font = new Font("", Font.BOLD, fontHeight);
//使 Graphics2D 对象的后续图形使用此字体
graphics.setFont(font);
graphics.setColor(Color.BLACK);
//绘制指定矩形的边框, 绘制出的矩形将比构件宽一个也高一个像素
graphics.drawRect(0, 0, width - 1, height - 1);
//随机产生 15 条干扰线, 使图像中的认证码不易被其它程序探测到
Random random = null;
random = new Random();
graphics.setColor(Color.GREEN);
for(int i = 0; i < 20; i++){
int x = random.nextInt(width);
int y = random.nextInt(height);
int x1 = random.nextInt(20);
int y1 = random.nextInt(20);
graphics.drawLine(x, y, x + x1, y + y1);
}
//创建 randomCode 对象, 用于保存随机产生的验证码, 以便用户登录后进行验证
StringBuffer randomCode;
randomCode = new StringBuffer();
for(int i = 0; i < codeCount; i++){
//得到随机产生的验证码数字
String strRand = null;
strRand = String.valueOf(codeSequence[random.nextInt(36)]);
//用随机产生的颜色将验证码绘制到图像中
graphics.setColor(Color.BLUE);
graphics.drawString(strRand, (i + 1)* codeX, codeY);
randomCode.append(strRand);
}
request.getSession().setAttribute("randomCode", randomCode.toString());
//禁止图像缓存
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
//将图像输出到输出流中
ServletOutputStream sos = null;
sos = response.getOutputStream();
ImageIO.write(buffImg, "jpeg", sos);
sos.close();
}
}
package com.syh.servlet;
import java.io.IOException;
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 LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String paramCode = request.getParameter("code") ;
HttpSession session = request.getSession() ;
String sessionCode = (String) session.getAttribute("randomCode") ;
//这里的验证码是区分大小写的!
if(paramCode.equals(sessionCode)) {
response.sendRedirect(request.getContextPath() + "/success.jsp") ;
}else {
request.setAttribute("errormsg", "您输入的验证码不正确,请刷新页面后再次输入") ;
request.getRequestDispatcher("/login.jsp").forward(request, response) ;
return ;
}
}
}
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 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">
<servlet>
<servlet-name>ValidateColorServlet</servlet-name>
<servlet-class>com.syh.servlet.ValidateColorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ValidateColorServlet</servlet-name>
<url-pattern>/ValidateColorServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.syh.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
</web-app>
分享到:
相关推荐
验证码(VerifyCode)是Web应用中常用的一种安全机制,用于防止自动化的机器人或者恶意脚本进行非法操作,比如注册、登录、评论等。在Java中,我们可以创建一个工具类来生成这种随机验证码,以增强系统安全性。下面...
图片验证码在网页应用中主要用于防止恶意自动化脚本的攻击,它要求用户输入显示在图片中的随机字符或数字以验证其是人类操作。本文将深入解析JSP中实现图片验证码的主要技术和步骤。 首先,我们需要理解如何生成...
此压缩包"ASP.NET源码——XPASP验证码控件(ASP.NET DLL)"包含了XPASP验证码控件的源代码和DLL文件。DLL(Dynamic Link Library)是Windows操作系统中的一个重要组成部分,它允许多个程序共享同一块内存空间,从而...
### jsp验证码——数字 #### 知识点详解 ##### JSP 验证码实现原理与过程 在本文档中,我们关注一个基于JavaServer Pages (JSP) 的数字验证码生成示例。此示例主要涉及到JSP页面的配置、Java图形处理库的使用以及...
在这个"ASP.NET源码——简单的验证码实例.zip"中,我们有一个关于验证码实现的简单示例。验证码是一种常用的安全机制,用于防止恶意自动化程序(如机器人)进行非法操作,如注册、登录或提交表单。 验证码的基本...
在这个“ASP.NET源码——问沫验证码示例代码.zip”压缩包中,我们很显然会找到一个关于问沫验证码的实现代码。问沫验证码,通常被称为滑动验证码或拖动验证,是一种防止自动化程序(如机器人)滥用网站的机制。它...
针对描述中提到的问题——“验证码页面产生的图片与从session里面取的不一样”,这可能是由于以下原因导致的: - **会话过期**:用户在验证码图片生成后等待时间过长,导致Session过期,原有的验证码数据被清除。 -...
Java验证码技术是Web应用中常用的一种安全机制,用于防止自动化的机器人或恶意脚本进行非法操作,例如批量注册、恶意登录等。在这个示例中,我们看到一个简单的JSP实现的验证码系统,它包含了三个主要文件:`login....
在这个“ASP.NET源码——Ajax无刷新中文验证码.zip”压缩包中,包含的是一个使用ASP.NET实现的Ajax无刷新中文验证码的源代码示例。Ajax(Asynchronous JavaScript and XML)技术用于在不刷新整个页面的情况下更新...
在这个“ASP.NET源码——带加减法的验证码.zip”压缩包中,我们看到的是一个实现加减法验证码功能的示例代码。 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart...
在这个场景中,我们关注的是基于Java的验证码库——jCaptcha。 jCaptcha是Java验证码解决方案的一个开源项目,它提供了丰富的功能和自定义选项,使得开发者能够轻松地在Web应用中集成验证码服务。jCaptcha-1.0-all....
【标题】"基于PHP的红鸟验证码.zip" 涉及到的是在Web开发中用于安全验证的一种技术——验证码。验证码通常被用来防止自动化程序(如机器人)进行恶意操作,如垃圾邮件提交、账户注册等。PHP是一种广泛使用的服务器端...
这个压缩包“ASP.NET源码——Afritxia在线用户统计、在线编辑器、验证码图片.zip”显然包含了几个关键组件,包括在线用户统计、在线编辑器和验证码图片的实现代码,这些都是构建Web应用时常用的功能。 1. **在线...
该压缩包文件“ASP实例开发源码——ASP+javascript生成PNG格式验证码下载.zip”提供了一个ASP(Active Server Pages)和JavaScript结合实现的验证码生成器的源代码示例。验证码技术在网页开发中扮演着重要的角色,它...
在现代Web应用中,为了防止自动化的恶意操作,常常需要实现一种简单而有效的验证机制——验证码。本文将详细介绍如何使用Servlet与JSP技术动态生成图像验证码。 #### 一、准备工作 1. **开发环境设置**:确保你的...
在这个"JSP生成数字验证码程序例子"中,我们将探讨如何利用JSP来生成一种常见的安全机制——数字验证码。 验证码的主要目的是防止自动化程序(如机器人或爬虫)进行非法操作,比如注册、登录或提交表单。它们通常...
本文将通过解析一个具体的案例——“js图形验证码,只要简单的复制粘贴3步”,来深入理解图形验证码的实现原理及其在Java服务器端(JSP)与客户端(JavaScript)的具体应用。 #### 二、图形验证码生成流程 ##### 1...