一:Code.java文件(servlet文件)
package main;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
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 Code extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
//回应为image
response.setContentType("image/jpeg");
// 设置要画的图片的宽和高
int width = 70;
int height = 24;
// 具有可访问图像数据缓冲区的Image
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 创建两个画笔
Graphics g = image.getGraphics();
Graphics2D g2d = (Graphics2D) g;
g.setColor(getColor(200, 240));// 上色
g.fillRect(0, 0, width, height);// 全图绘制背景色
// 在图片上绘制150条干扰线
g.setColor(getColor(180, 200));// 上色
Random random = new Random();
for (int i = 0; i < 150; i++)
{
// 绘制线的坐标
int x = random.nextInt(width - 1);
int y = random.nextInt(height - 1);
// x、y坐标偏移多少个单位
int deltax = random.nextInt(6) + 1;
int deltay = random.nextInt(12) + 1;
// 构造一个具有指定属性的实心的 BasicStroke(2D图形)
BasicStroke bs = new BasicStroke(2f, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_BEVEL);
// Line2D是一个无法直接实例化的抽象类
Line2D line = new Line2D.Double(x, y, x + deltax, y + deltay);
g2d.setStroke(bs);// 绘制 BasicStroke
g2d.draw(line);// 再绘制线条
}
// 输出那些字符,以便验证
String str = "";
int temp = 0;
Font font = new Font("华文宋体", Font.BOLD, 14);
g.setFont(font);// 设置画笔画的字体格式
// 绘制四个字符
for (int i = 0; i < 4; i++)
{
if (random.nextInt(2) == 1)
{
temp = random.nextInt(26) + 'A';
}
else
{
temp = random.nextInt(10) + '0';
}
char ctemp = (char) temp;
str += ctemp;
Color c=getColor(20,130);//颜色较深
g.setColor(c);
/** ******随机将文字缩放并旋转一定的角度****** */
// 将文字旋转一定角度
/*AffineTransform 类表示 2D 仿射变换,它执行从 2D 坐标到其他 2D 坐标的线性映射,
保留了线的“直线性”和“平行性”。可以使用一系列
平移 (translation)、缩放 (scale)、翻转 (flip)、旋转 (rotation) 和错切 (shear)
来构造仿射变换。*/
AffineTransform trans=new AffineTransform();
//45弧度,旋转点位置
trans.rotate(random.nextInt(45) * Math.PI / 180, 15 * i + 10, 6);
// 缩放文字
float scaleSize=random.nextFloat()+0.5f;//缩放大小
if(scaleSize<0.8f||scaleSize>1.2)
{
scaleSize=1.0f;
}
trans.scale(scaleSize, scaleSize);
g2d.setTransform(trans);
//画在什么位置
g.drawString(ctemp+"", 15*i+10, 14);
}
//禁止图片缓存那样刷新就不会有重复的图片出现
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);
HttpSession session=request.getSession();
session.setAttribute("BBScode", str);//把验证码发送到session以便验证
try
{
//把得到的验证码保存称jpeg格式放在输入流中
ImageIO.write(image, "jpeg", response.getOutputStream());
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 得到具有规定的颜色
public static Color getColor(int start, int end)
{
Random R = new Random();
int r = start + R.nextInt(end - start);
int g = start + R.nextInt(end - start);
int b = start + R.nextInt(end - start);
return new Color(r, g, b);
}
}
二、在XML里配置
<servlet>
<servlet-name>code</servlet-name>
<servlet-class>main.Code</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>code</servlet-name>
<url-pattern>/code</url-pattern>
</servlet-mapping>
三、code.jsp(显示页面)
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<script language="javascript">
function reloadcode()
{
var timenow = new Date().getTime();
document.getElementById("reqCode").src="../code?d="+timenow;
}
</script>
<style type="text/css">
body{
color:blue;
font-family:楷体;
text-align:center;
background:cyan;
font-Size:24;
background-image: url(image/4.jpg);
}
.style1 {font-size: 15px}
</style>
<title>注册君临账号_君临论坛</title>
</head>
<body>
<font color="olive" size="6" face="华文行楷">注册君临账号</font>
<hr color="silver">
<div align="left" class="style1"><a href="load.jsp">首页</a>>>注册页</div>
<form action="checkmyindex.jsp" name="info" id="info">
<center>
<img alt="验证码" name="reqCode" id="reqCode" src="<%=request.getContextPath() %>/code"/>
<a href="JavaScript:reloadcode();">再换一张</a>
<input type="text" name="xincode" size="15" />
<%
String ssss=request.getParameter("codeerror");
if(ssss!=null){
%>
<label id="codeError"><font color='red' size='-1'>您输入的验证码不正确!</font></label><br/>
<%
}
%>
<input type="submit" value="确定">
</form>
<hr color="gray">
<font size="2" face="宋体">
<a href="#">关于君临</a>|
<a href="#">君临客服</a>|
<a href="#">隐私和版权</a>|
<a href="#">联系我们</a>|
<a href="#">加入君临</a>|
<a href="#">举报投诉</a>
</font>
</body>
</html>
四、验证输入的验证码是否一致
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<title>验证BBS</title>
</head>
<body>
<%
String yuancode=(String)session.getAttribute("BBScode");
String xingcode=request.getParameter("xincode");
if(xingcode.equals(yuancode)){
response.sendRedirect("register.jsp");
}else{
response.sendRedirect("code.jsp?codeerror=4564641");
}
%>
</body>
</html>
分享到:
相关推荐
JavaWeb项目生成随机验证码,使用IDEA开发,可以导入到Eclipse和MyEclipse中
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”的缩写,即全自动区分计算机和人类的图灵测试。它的主要目标是验证用户是否为真实的人,而非自动化的程序。在...
它的全称是“Completely Automated Public Turing test to tell Computers and Humans Apart”,即全自动区分计算机和人类的图灵测试。验证码通常用于防止自动化程序(如机器人)进行恶意操作,如垃圾邮件发送、恶意...
验证码(CAPTCHA)是“全自动区分计算机和人类的图灵测试”的缩写,它是一种用于防止恶意自动化程序(如机器人)滥用网站服务的安全机制。在PHP中,验证码通常通过生成随机字符串并配合图像处理库来创建,使得人类...
验证码(CAPTCHA)全称“全自动区分计算机和人类的图灵测试”,它的核心目标是区分用户是人还是自动化程序。常见的验证码形式有图像验证码、滑动验证码、点击验证等,通过让用户完成一项简单的任务来证明其人类身份...
验证码,全称全自动区分计算机和人类的图灵测试(CAPTCHA),其主要设计目的是区分用户是真实的、有意识的人还是无意识的机器。常见的验证码形式包括图像中的扭曲字母或数字、声音验证码以及更复杂的交互式验证码。 ...
验证码(CAPTCHA)是一种自动公共图灵测试,用于区分人类和计算机。它的目的是防止机器自动填写表单,如注册、登录等,以保护系统免受垃圾邮件、恶意注册等攻击。 在.NET MVC中,创建Gif动态验证码主要涉及以下几个...
首先,验证码(CAPTCHA)全称“全自动区分计算机和人类的图灵测试”,它的主要目的是防止恶意的自动化程序(如机器人或爬虫)对网站进行非法操作,如注册大量虚假账号或进行恶意投票。验证码通常包含扭曲的字母、...
验证码(CAPTCHA)全称为“Completely Automated Public Turing test to tell Computers and Humans Apart”,即全自动区分计算机和人类的图灵测试。它通常表现为扭曲的文字、数字、图像或其他视觉元素,要求用户在...
验证码(CAPTCHA)是一种自动的公共图灵测试,用于区分人类与机器。在互联网上,验证码主要用于防止恶意机器人或自动化脚本执行某些操作,如注册账号、发送垃圾邮件等。验证码通常会呈现出扭曲的文字或图像,用户...
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机和人的公共全自动程序。可以防止:恶意...
验证码是一种“全自动区分计算机和人类的图灵测试”,它要求用户执行一项人类容易完成但计算机难以自动化的任务,以证明用户是真人而不是机器人。常见的验证码类型有图像验证码、滑动验证码、点击验证码等。在...
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”的缩写,中文通常称为全自动区分计算机和人类的图灵测试。它是一种防止自动化程序(如机器人或爬虫)非法操作...
验证码(CAPTCHA)全称为“全自动区分计算机和人类的图灵测试”,它的主要目的是为了防止恶意自动化程序(如机器人或爬虫)对网站进行非法操作,比如批量注册、刷票、垃圾评论等。验证码通常会显示一串随机字符,...
- **验证码**:验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”的缩写,即全自动区分计算机和人类的图灵测试,用于防止机器自动操作。 - **动态GIF**:动态...
验证码(CAPTCHA)全称“Completely Automated Public Turing test to tell Computers and Humans Apart”,即全自动区分计算机和人类的图灵测试。通常,验证码会显示一个或多个扭曲的文字或数字,用户需要正确输入...
验证码的全称是“Completely Automated Public Turing test to tell Computers and Humans Apart”,即全自动区分计算机和人类的图灵测试。它通过让用户完成一项人类可以轻松完成但机器难以解决的任务来验证用户身份...
首先,验证码(CAPTCHA)全称为“Completely Automated Public Turing test to tell Computers and Humans Apart”,即全自动区分计算机和人类的图灵测试。它的主要目的是防止恶意机器人和自动化程序进行非法操作,...
验证码,全称“全自动区分计算机和人类的图灵测试”(Completely Automated Public Turing test to tell Computers and Humans Apart),通常要求用户输入在图像中显示的一组字符或完成简单的逻辑任务。其主要目的是...
验证码全称为“Completely Automated Public Turing test to tell Computers and Humans Apart”,即全自动区分计算机和人类的图灵测试。它的主要作用是防止恶意的自动化程序(如机器人或爬虫)进行某些操作,如注册...