怎样用java实现验证码

Python020

怎样用java实现验证码,第1张

现在许多系统的注册 登录或者发布信息模块都添加的随机验证码功能 就是为了避免自动注册程序或者自动发布程序的使用

验证码实际上就是随机选择一些字符以图片的形式展现在页面上 如果进行提交操作的同时需要将图片上的字符同时提交 如果提交的字符与服务器session保存的不同 则认为提交信息无效 为了避免自动程序分析解析图片 通常会在图片上随机生成一些干扰线或者将字符进行扭曲 增加自动识别验证码的难度

在这里 我们使用java实现验证码

<%@ page contentType= image/jpeg import= java awt * java awt image * java util * javax imageio * %>

<%!

Color getRandColor(int fc int bc){//给定范围获得随机颜色

Random random = new Random()

if(fc>) fc=

if(bc>) bc=

int r=fc+random nextInt(bc fc)

int g=fc+random nextInt(bc fc)

int b=fc+random nextInt(bc fc)

return new Color(r g b)

}

%>

<%

//设置页面不缓存

response setHeader( Pragma No cache )

response setHeader( Cache Control no cache )

response setDateHeader( Expires )

// 在内存中创建图象

int width= height=

BufferedImage image = new BufferedImage(width height BufferedImage TYPE_INT_RGB)

// 获取图形上下文

Graphics g = image getGraphics()

//生成随机类

Random random = new Random()

// 设定背景色

g setColor(getRandColor( ))

g fillRect( width height)

//设定字体

g setFont(new Font( Times New Roman Font PLAIN ))

// 随机产生 条干扰线 使图象中的认证码不易被其它程序探测到

g setColor(getRandColor( ))

for (int i= i<i++)

{

int x = random nextInt(width)

int y = random nextInt(height)

int xl = random nextInt( )

int yl = random nextInt( )

g drawLine(x y x+xl y+yl)

}

// 取随机产生的认证码( 位数字)

String codeList = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

String sRand=

for (int i= i<i++){

int a=random nextInt(codeList length() )

String rand=codeList substring(a a+ )

sRand+=rand

// 将认证码显示到图象中

g setColor(new Color( +random nextInt( ) +random nextInt( ) +random nextInt( )))//调用函数出来的颜色相同 可能是因为种子太接近 所以只能直接生成

g drawString(rand *i+ )

}

// 将认证码存入SESSION

session setAttribute( rand sRand)

// 图象生效

g dispose()

// 输出图象到页面

ImageIO write(image JPEG response getOutputStream())

out clear()

out = pageContext pushBody()

lishixinzhi/Article/program/Java/hx/201311/25536

原理:

1.随机生成4个数字 用到了Random类

2.对这4个数字设置字体格式 用 setFont方法

3.改变字体颜色用setColor 然后随机生成颜色

代码如下

package s1

import java.awt.Color

import java.awt.Font

import java.awt.Graphics

import java.awt.image.BufferedImage

import java.io.IOException

import java.io.PrintWriter

import java.util.Random

import javax.imageio.ImageIO

import javax.jms.Session

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 GetImage extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

this.doPost(request, response)

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// 发送图片不能够添加这2行代码

// response.setContentType("text/htmlcharset=UTF-8")

//request.setCharacterEncoding("UTF-8")

int width=100

int height=50

//获得一张图片

BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)

Graphics g=image.getGraphics()

g.setColor(Color.WHITE)

g.fillRect(1, 1, width-2, height-2)

g.setFont(new Font("宋体",Font.BOLD,30))

Random random=new Random()

//填充的字符串

String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

//缓存生成的验证码

StringBuffer stringbuffer=new StringBuffer()

//随机生成验证码的颜色和字符

for(int i=0i<4i++)

{ //设置随机颜色

g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)))

int index=random.nextInt(62)//这里的62就是从填充字符段中随意选取一个位置

String str1=str.substring(index,index+1)

g.drawString(str1, 20*i, 30)//x,y数值设置太小会显示不出来

stringbuffer.append(str1)

}

//将生成的验证码存到服务器

request.getSession().setAttribute("checkcode", stringbuffer.toString())//key和value

//将图片发送给浏览器

ImageIO.write(image, "jpg", response.getOutputStream())

}

}

用户登录界面代码

package s1

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 Login extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/htmlcharset=UTF-8")// 设置服务器发送给浏览器的编码方式

request.setCharacterEncoding("UTF-8")// 客户端向服务器提交的数据的解码方式

// 获得用户提交的数据

String checkcode = request.getParameter("checkcode")

System.out.println(checkcode)

// 判断输入的验证码是不是符合

HttpSession session = request.getSession()// session是存放数据的地方

String str = (String) session.getAttribute("checkcode")

if (str != null) {

if (checkcode.compareToIgnoreCase(str) == 0) // 验证码忽略大小写

response.getWriter().println("验证码输入正确")

else

response.getWriter().println("验证码输入错误")

}

else response.getWriter().println("验证码失效")

// 使用完的验证码信息要删除,返回原页面再输一次,验证码就失效了

session.removeAttribute("checkcode")

}

}