找回密码
 注册
搜索
热搜: 回贴
微赢网络技术论坛 门户 站长资讯 业界 查看内容

用servlet生成验证码

2009-12-25 00:08| 发布者: admin| 查看: 28| 评论: 0|原作者: 小可爱

package com.work.core.image;



import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.IOException;

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;



import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;



/**

* @author wangmj

* 生成随机的验证码!防止暴利破解。

*/

public class AuthImage extends HttpServlet {

private static Log log = LogFactory.getLog(AuthImage.class);

/**

*

*/

private static final long serialVersionUID = 8165458985542870320L;

//设置图形验证码中的字符串的字体的大小

private Font mFont = new Font("Arial Black", Font.PLAIN, 16);



public void init() throws ServletException {

super.init();

}



/**

* 生成随机颜色

* @param fc

* @param bc

* @return

*/

Color getRandColor(int fc, int bc) {

Random random = new Random();

if (fc > 255)

fc = 255;

if (bc > 255)

bc = 255;

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);

}



/* (non-Javadoc)

* @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

*/

public void service(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//生成服务器相应的service方法

//阻止生成的页面内容被缓存,保证每次重新生成随机验证码

response.setHeader("Pragma", "No-cache");

response.setHeader("Cache-Control", "no-cache");

response.setDateHeader("Expires", 0);

response.setContentType("image/jpeg");

//指定图形验证码图片的大小;

int width = 80;//宽度

int height = 20;//高度



BufferedImage image = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB);



// 准备在图片中绘制内容

Graphics g = image.getGraphics();

Random random = new Random();

g.setColor(getRandColor(200, 250));

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

g.setColor(new Color(102, 102, 102));

g.drawRect(0, 0, width - 1, height - 1);

g.setFont(mFont);

g.setColor(getRandColor(160, 200));

//生成随机线条

for (int i = 0; i < 155; i++) {

int x = random.nextInt(width - 1);

int y = random.nextInt(height - 1);

int xl = random.nextInt(6) + 1;

int yl = random.nextInt(12) + 1;

g.drawLine(x, y, x + xl, y + yl);

}

for (int i = 0; i < 70; i++) {

int x = random.nextInt(width - 1);

int y = random.nextInt(height - 1);

int xl = random.nextInt(12) + 1;

int yl = random.nextInt(6) + 1;

g.drawLine(x, y, x - xl, y - yl);

}



String sRand = "";

//生成随机的字符串并加入到图片中

int LEN = 2; //控制随机码的长度

for (int i = 0; i < LEN; i++) {

String tmp = getRandomChar();

sRand += tmp;

g.setColor(new Color(20 + random.nextInt(110), 20 + random

.nextInt(110), 20 + random.nextInt(110)));

g.drawString(tmp, 15 * i + 10, 15);

}



HttpSession session = request.getSession(true);

log.debug("随机生成的字符串为"+sRand);

//将其自动转换为小写。也就是说用户在输入验证码的时候,不需要区分大小写,方便输入。

session.setAttribute("randomImageStr", sRand.toLowerCase());

log.debug("从session中取出来"+session.getAttribute("randomImageStr"));

g.dispose();

ImageIO.write(image, "JPEG", response.getOutputStream());

}



/**

* 随机生成字符串

* @return

*/

private String getRandomChar() {

int rand = (int) Math.round(Math.random() * 2);

long itmp = 0;

char ctmp = ’\u0000’;

switch (rand) {

case 1:

itmp = Math.round(Math.random() * 25 + 65);

ctmp = (char) itmp;

return String.valueOf(ctmp);

case 2:

itmp = Math.round(Math.random() * 25 + 97);

ctmp = (char) itmp;

return String.valueOf(ctmp);

default:

itmp = Math.round(Math.random() * 9);

return String.valueOf(itmp);

}

}

}

package com.work.core.image;



import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.IOException;

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;



import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;



/**

* @author wangmj

* 生成随机的验证码!防止暴利破解。

*/

public class AuthImage extends HttpServlet {

private static Log log = LogFactory.getLog(AuthImage.class);

/**

*

*/

private static final long serialVersionUID = 8165458985542870320L;

//设置图形验证码中的字符串的字体的大小

private Font mFont = new Font("Arial Black", Font.PLAIN, 16);



public void init() throws ServletException {

super.init();

}



/**

* 生成随机颜色

* @param fc

* @param bc

* @return

*/

Color getRandColor(int fc, int bc) {

Random random = new Random();

if (fc > 255)

fc = 255;

if (bc > 255)

bc = 255;

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);

}



/* (non-Javadoc)

* @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

*/

public void service(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//生成服务器相应的service方法

//阻止生成的页面内容被缓存,保证每次重新生成随机验证码

response.setHeader("Pragma", "No-cache");

response.setHeader("Cache-Control", "no-cache");

response.setDateHeader("Expires", 0);

response.setContentType("image/jpeg");

//指定图形验证码图片的大小;

int width = 80;//宽度

int height = 20;//高度



BufferedImage image = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB);



// 准备在图片中绘制内容

Graphics g = image.getGraphics();

Random random = new Random();

g.setColor(getRandColor(200, 250));

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

g.setColor(new Color(102, 102, 102));

g.drawRect(0, 0, width - 1, height - 1);

g.setFont(mFont);



g.setColor(getRandColor(160, 200));

//生成随机线条

for (int i = 0; i < 155; i++) {

int x = random.nextInt(width - 1);

int y = random.nextInt(height - 1);

int xl = random.nextInt(6) + 1;

int yl = random.nextInt(12) + 1;

g.drawLine(x, y, x + xl, y + yl);

}

for (int i = 0; i < 70; i++) {

int x = random.nextInt(width - 1);

int y = random.nextInt(height - 1);

int xl = random.nextInt(12) + 1;

int yl = random.nextInt(6) + 1;

g.drawLine(x, y, x - xl, y - yl);

}



String sRand = "";

//生成随机的字符串并加入到图片中

int LEN = 2; //控制随机码的长度

for (int i = 0; i < LEN; i++) {

String tmp = getRandomChar();

sRand += tmp;

g.setColor(new Color(20 + random.nextInt(110), 20 + random

.nextInt(110), 20 + random.nextInt(110)));

g.drawString(tmp, 15 * i + 10, 15);

}



HttpSession session = request.getSession(true);

log.debug("随机生成的字符串为"+sRand);

//将其自动转换为小写。也就是说用户在输入验证码的时候,不需要区分大小写,方便输入。

session.setAttribute("randomImageStr", sRand.toLowerCase());

log.debug("从session中取出来"+session.getAttribute("randomImageStr"));

g.dispose();

ImageIO.write(image, "JPEG", response.getOutputStream());

}



/**

* 随机生成字符串

* @return

*/

private String getRandomChar() {

int rand = (int) Math.round(Math.random() * 2);

long itmp = 0;

char ctmp = ’\u0000’;

switch (rand) {

case 1:

itmp = Math.round(Math.random() * 25 + 65);

ctmp = (char) itmp;

return String.valueOf(ctmp);

case 2:

itmp = Math.round(Math.random() * 25 + 97);

ctmp = (char) itmp;

return String.valueOf(ctmp);

default:

itmp = Math.round(Math.random() * 9);

return String.valueOf(itmp);

}

}

}

在web.xml中配置这个servlet

authImage
com.work.core.image.AuthImage



authImage
com.work.core.image.AuthImage
view plaincopy to clipboardprint?

authImage
/authImage



authImage
/authImage
view plaincopy to clipboardprint?




最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 05:23 , Processed in 0.109103 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部