利用servlet技术实现验证码功能
<%@ 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;
}
}
利用servlet技术实现验证码功能的更多相关文章
- django验证码功能
1.目的 现在我们一般访问网页都需要输入验证码,比如博客园,有的甚至是通过手机验证码实时登录.这样做的目的主要还是为了防止其他人的恶意访问,比如爬虫,下面就来看看验证码是如何实现的 2.StringI ...
- Servlet案例3:验证码功能
这里介绍简单的验证码功能 动态生成图片 一个简单的页面: <!DOCTYPE html> <html> <head> <meta charset=" ...
- 利用PHP绘图函数实现简单验证码功能
index.php __________________________________________________________________________________________ ...
- c#实现验证码功能
一.验证码简介 验证码功能一般是用于防止批量注册的,不少网站为了防止用户利用机器人自动注册.登录.灌水,都采用了验证码技术.所谓验证码,就是将一串随机产生的数字或字母或符号或文字,生成一幅图片, 图片 ...
- javaweb实现验证码功能
在javaweb的用户注册与登陆功能时,有时为了防止漏洞或者大量注册,可以使用验证码功能,下面是验证码的一个简单实现 验证码类 public class ValiImg extends HttpSer ...
- 用PHP实现验证码功能
目前,不少网站为了防止用户利用机器人自动注册.登录.灌水,都采用了 验证码技术.所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片, 图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验 ...
- 用java来实现验证码功能(本帖为转载贴),作为个人学习收藏用
一.关于为何使用验证的解释 在目前的网页的登录.注册中经常会见到各种验证码.其目的便是为了:防止暴力破解 .因为只要CPU性能较强,便可以在慢慢尝试密码的过程中来破解用户账号,因而导致的结果是用户信 ...
- c#实现验证码功能(多种模式下分别实现验证功能)详细,带注释
网上找了很多验证相关的代码,发现有很多瑕疵.现在本人整理测试了一个实现验证码功能的代码,里面有纯数字,纯英文,英文和数字混合等三种模式.并且在必要地方都已经备有注释,希望可以帮到那些需要的人. 验证码 ...
- S2SH框架中的无刷新验证码功能实现
暑假期间在实验室做使用S2SH框架的项目,其中登录和注册需要验证码,实现了一个没有实现刷新验证码功能的简单版本,代码如下: 1 package com.sem.action; 2 3 import j ...
随机推荐
- spring--处理器拦截器详解——跟着开涛学SpringMVC
5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...
- [Irving] Ext.Net动态添加GridPanel列绑定Checkbox值失败的解决办法
var grid = X.GetCmp<GridPanel>(vm.GRID_QUOTATIONS_FEEITEM_RANGE_SHOW); grid.AddColumn(Html.X() ...
- 开始同时在cnblog和BAE上写博客
研究生第一学期已过一半,开始理论学习,当然不能忘了实践学习. \[\frac{{ - b \pm \sqrt {{b^2} - 4ac} }}{{2a}}\]
- [未解出,hzwer]挖掘机
挖掘机(dig.*) 背景 附中机房谁最虚?高二一班***!感觉很顺,是吧? 题目描述 今天,丧尸czy开着挖掘机去上学(……).但是他发现他的mz满天下,所以一路上他碰到了好多他的mz.一开始他以1 ...
- Windows下使用GCC编译器
1.GCC编译器的选择 Windows下最常见的安装GCC的方式有两种:Cygwin和MinGW.本文主要介绍MinGW的安装配置. 2.下载MinGW 下载地址:http://sourceforge ...
- POJ3641-Pseudoprime numbers(快速幂取模)
题目大意 判断一个数是否是伪素数 题解 赤果果的快速幂取模.... 代码: #include<iostream> #include<cmath> using namespace ...
- Linux的五个查找命令:find,locate,whereis,which,type
使用电脑的时候,经常需要查找文件. 在Linux中,有很多方法可以做到这一点.国外网站LinuxHaxor总结了五条命令,你可以看看自己知道几条.大多数程序员,可能经常使用其中的2到3条,对这5条命令 ...
- 判断数组中有没有某个键 isset 和 array_key_exists 的效率比较
判断数组中有没有某个键 isset 和 array_key_exists 谁的效率高呢? 使用 array_key_exists 代码如下 结果如下 如果使用 isset 代码如下 结果如下: 很明显 ...
- 国外一些好用的UX/UI设计工具和资源分享
国外一些好用的UX/UI设计工具和资源分享 你今天使用的设计工具也许不再适合以后的网页和APP设计项目了.新的工具不断的推出市场,目标只有一个,让你的工作更快.更容易而且工作成效更好.今天分享的这些U ...
- Runtime 函数 Swizzling 改变OC方法的调度顺序
首先加入一个小知识: SEL.Method.IMP的含义及区别 在运行时,类(Class)维护了一个消息分发列表来解决消息的正确发送.每一个消息列表的入口是一个方法(Method),这个方法映射了一对 ...