67,513
社区成员
发帖
与我相关
我的任务
分享
--
[10:37:23.033] GET http://192.168.186.140:8080/ifengstar3/CodeServlet [HTTP/1.1 200 OK 21016ms]
这个要这么解决啊?package com.ifengstar.common.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* 验证码生成器
*
* @author
*
*/
public class ValidateCode {
// 图片的宽度。
private int width = 60;
// 图片的高度。
private int height = 20;
// 验证码字符个数
private int codeCount = 4;
// 验证码干扰线数
private int lineCount = 150;
// 验证码
private String code = null;
// 验证码图片Buffer
private BufferedImage buffImg = null;
private HttpServletRequest request = null;
private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
public ValidateCode() throws ImageFormatException, IOException {
this.createCode();
}
/**
*
* @param width
* 图片宽
* @param height
* 图片高
* @throws IOException
* @throws ImageFormatException
*/
public ValidateCode(int width, int height) throws ImageFormatException,
IOException {
this.width = width;
this.height = height;
this.createCode();
}
/**
*
* @param width
* 图片宽
* @param height
* 图片高
* @param codeCount
* 字符个数
* @param lineCount
* 干扰线条数
* @throws IOException
* @throws ImageFormatException
*/
public ValidateCode(int width, int height, int codeCount, int lineCount,
HttpServletRequest request) throws ImageFormatException,
IOException {
this.width = width;
this.height = height;
this.codeCount = codeCount;
this.lineCount = lineCount;
this.request = request;
this.createCode();
}
public void createCode() throws ImageFormatException, IOException {
int x = 0, fontHeight = 0, codeY = 0;
int red = 0, green = 0, blue = 0;
x = width / (codeCount + 1);// 每个字符的宽度
fontHeight = height - 2;// 字体的高度
codeY = height - 4;
// 图像buffer
buffImg = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
/*String imageFile = request.getSession().getServletContext()
.getRealPath("/images/pic.jpg");
InputStream imageIn = new FileInputStream(new File(imageFile));
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn);
buffImg = decoder.decodeAsBufferedImage();*/
Graphics2D g = buffImg.createGraphics();
// 生成随机数
Random random = new Random();
System.out.println(random);
// 将图像填充为白色
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
// 画边框
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
// 创建字体
Font font;
try {
Font baseFont = Font.createFont(Font.TRUETYPE_FONT,
new ByteArrayInputStream(hex2byte(getFontByteStr())));
font = baseFont.deriveFont(Font.PLAIN, fontHeight);
} catch (Exception e) {
font = new Font("Arial", Font.PLAIN, fontHeight);
}
/*
* ImgFontByte imgFont=new ImgFontByte(); Font font
* =imgFont.getFont(fontHeight); g.setFont(font);
*/
g.setFont(font);
g.setColor(getRandColor(160, 200));
for (int i = 0; i < lineCount; i++) {
int xs = random.nextInt(width);
int ys = random.nextInt(height);
int xe = xs + random.nextInt(width / 8);
int ye = ys + random.nextInt(height / 8);
g.drawLine(xs, ys, xe, ye);
}
// randomCode记录随机产生的验证码
StringBuffer randomCode = new StringBuffer();
// 随机产生codeCount个字符的验证码。
for (int i = 0; i < codeCount; i++) {
String strRand = String.valueOf(codeSequence[random
.nextInt(codeSequence.length)]);
// 产生随机的颜色值,让输出的每个字符的颜色值都将不同。
red = random.nextInt(255);
green = random.nextInt(255);
blue = random.nextInt(255);
g.setColor(new Color(red, green, blue));
g.drawString(strRand, (i*x + x/2), codeY);
// 将产生的四个随机数组合在一起。
randomCode.append(strRand);
}
// 将四位数字的验证码保存到Session中。
code = randomCode.toString();
g.dispose();
}
private byte[] hex2byte(String str) {
if (str == null)
return null;
str = str.trim();
int len = str.length();
if (len == 0 || len % 2 == 1)
return null;
byte[] b = new byte[len / 2];
try {
for (int i = 0; i < str.length(); i += 2) {
b[i / 2] = (byte) Integer
.decode("0x" + str.substring(i, i + 2)).intValue();
}
return b;
} catch (Exception e) {
return null;
}
}
private 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);
}
/**
* ttf字体文件的十六进制字符串
*
* @return
*/
private String getFontByteStr() {
return null;
}
public void write(String path) throws IOException {
OutputStream sos = new FileOutputStream(path);
this.write(sos);
}
public void write(OutputStream sos) throws IOException {
/*JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos);
encoder.encode(buffImg);*/
ImageIO.write(buffImg, "jpeg", sos);
sos.close();
}
public BufferedImage getBuffImg() {
return buffImg;
}
public String getCode() {
return code;
}
}
@RequestMapping(value = "/CodeServlet", method = RequestMethod.GET)
public void validateCode(HttpServletRequest request,
@RequestParam(required = false, value = "temp") String temp,
HttpServletResponse response,HttpSession session) {
log.info("生成验证码:"+temp);
// 设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
ValidateCode vCode=null;
try {
vCode = new ValidateCode(width,height,4,100,request);
} catch (ImageFormatException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
session.setAttribute("validateCode", vCode.getCode());
try {
vCode.write(response.getOutputStream());
log.info("验证码生成完成"+vCode.getCode());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
<img id="codeImg" src="CodeServlet" title="看不清?点击刷新" onclick="changeCode()" alt="验证码"/>
function changeCode(){
$("#codeImg").removeAttr('src');
$("#codeImg").attr("src",CodeServlet?temp="+Math.random());
}
[INFO ] 2013-06-19 14:03:30,953 method:com.ifengstar.common.controller.MainPage.validateCode(MainPage.java:284)
生成验证码:null
java.util.Random@dd36f3
[INFO ] 2013-06-19 14:03:30,968 method:com.ifengstar.common.controller.MainPage.validateCode(MainPage.java:303)
验证码生成完成TPJB