利用servlet技术实现验证码功能

时间:2022-04-01 14:48:18
 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>  

 <%
String action = request.getParameter("action");
String safecodeText = request.getParameter("safecodeTest");
if("action".equals(action)){
String safecode = (String)session.getAttribute("safecode");
if(safecode.equals(safecodeText)){
out.print("验证码正确!");
}else{
out.print("验证码错误!请重新输入!");
}
}
%>
<html>
<head>
<title>验证码测试</title>
</head> <body>
<form action="servlet/demo" method="post">
<input type="hidden" name="action" value="action"/>
<img alt="验证码" src="servlet/demo">
<input type="text" name="safecodeTest">
<input type="submit" value="go">
</form>
</body>
</html>
 import java.io.*;  

 import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Random;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*; public class demo extends HttpServlet {
//产生随即的字体
private Font getFont() {
Random random = new Random();
Font font[] = new Font[5];
font[0] = new Font("Ravie", Font.PLAIN, 24);
font[1] = new Font("Antique Olive Compact", Font.PLAIN, 24);
font[2] = new Font("Forte", Font.PLAIN, 24);
font[3] = new Font("Wide Latin", Font.PLAIN, 24);
font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 24);
return font[random.nextInt(5)];
} protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置响应头 Content-type类型
resp.setContentType("image/jpeg");
// 以下三句是用于设置页面不缓存
resp.setHeader("Pragma", "No-cache");
resp.setHeader("Cache-Control", "No-cache");
resp.setDateHeader("Expires", 0); OutputStream os = resp.getOutputStream();
int width = 83, height = 30;
// 建立指定宽、高和BufferedImage对象
BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); // 该画笔画在image上
Color c = g.getColor(); // 保存当前画笔的颜色,用完画笔后要回复现场
g.fillRect(0, 0, width, height); char[] ch = "abcdefghjkmnpqrstuvwxyz23456789".toCharArray(); // 随即产生的字符串 不包括 i l(小写L) o(小写O) 1(数字1)0(数字0)
int length = ch.length; // 随即字符串的长度
String sRand = ""; // 保存随即产生的字符串
Random random = new Random();
for (int i = 0; i <; i++) {
// 设置字体
g.setFont(getFont());
// 随即生成0-9的数字
String rand = new Character(ch[random.nextInt(length)]).toString();
sRand += rand;
// 设置随机颜色
g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
g.drawString(rand, 20 * i + 6, 25);
}
//产生随即干扰点
for (int i = 0; i < 20; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
g.drawOval(x1, y1, 2, 2);
}
g.setColor(c); // 将画笔的颜色再设置回去
g.dispose(); //将验证码记录到session
req.getSession().setAttribute("safecode", sRand);
// 输出图像到页面
ImageIO.write(image, "JPEG", os); } protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
} }
 <?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_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>JavaWebDemo</display-name>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>demo</servlet-name>
<servlet-class>demo</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/servlet/demo</url-pattern>
</servlet-mapping> <welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
 package action;

 import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Map; import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class ImageAction extends ActionSupport { /**
*
*/
private static final long serialVersionUID = 1L;
private ByteArrayInputStream inputStream;
public String createRandomString(){
String str="";
for(int i=0;i<4;i++){
str+=Integer.toString((new Double(Math.random()*10)).intValue());
}
return str;
}
public Color createRandomColor(){
int r=(new Double(Math.random()*256)).intValue();
int g=(new Double(Math.random()*256)).intValue();
int b=(new Double(Math.random()*256)).intValue();
return new Color(r,g,b);
}
public BufferedImage createImage(String str){
int width=60;
int height=22;
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
g.setColor(Color.BLACK);
g.drawRect(0, 0, width-1, height-1);
g.setFont(new Font("Atlantic Inline",Font.PLAIN,18));
g.setColor(this.createRandomColor());
g.drawString(Character.toString(str.charAt(0)), 8, 17);
g.drawString(Character.toString(str.charAt(1)), 20, 17);
g.drawString(Character.toString(str.charAt(2)), 33, 17);
g.drawString(Character.toString(str.charAt(3)), 45, 17);
g.dispose();
return image;
}
public ByteArrayInputStream createInputStream() throws Exception{
String str=this.createRandomString();
BufferedImage image=this.createImage(str);
ActionContext actioncontext=ActionContext.getContext();
Map session=actioncontext.getSession();
session.put("random", str);
ByteArrayOutputStream output=new ByteArrayOutputStream();
ImageOutputStream imageout=ImageIO.createImageOutputStream(output);
ImageIO.write(image, "JPEG", imageout);
imageout.close();
ByteArrayInputStream input=new ByteArrayInputStream(output.toByteArray());
output.close();
return input;
}
public String execute() throws Exception{
setInputStream(createInputStream());
return SUCCESS;
}
public ByteArrayInputStream getInputStream(){
return inputStream;
}
public void setInputStream(ByteArrayInputStream inputStream){
this.inputStream=inputStream;
}
}