验证码在FF里显示很快,但是在IE里需要20秒左右才能显示
通过FF的Web控制台查看链接状态,响应很快,但加载很慢--
[10:37:23.033] GET http://192.168.186.140:8080/ifengstar3/CodeServlet [HTTP/1.1 200 OK 21016ms]这个要这么解决啊?
我找了好久都没发现问题在哪里
验证码Webjavaspring
通过FF的Web控制台查看链接状态,响应很快,但加载很慢--
[10:37:23.033] GET http://192.168.186.140:8080/ifengstar3/CodeServlet [HTTP/1.1 200 OK 21016ms]这个要这么解决啊?
我找了好久都没发现问题在哪里
验证码Webjavaspring
解决方案 »
- java 不能获取当前串口
- 最新15个javaEE判断题4(T/F)
- 关于orcale读出大量数据写入txt文件,内存溢出
- java ee 6 tutorial 能下载下来吗?
- Spring配置文件
- 用struts2+eclipse做了一个小程序,总提示404错误,请大家来看看
- 请问大家java邮件服务器怎么开发啊
- JAVA实现SQLServer和Excel,数据导入,导出问题?在线等~~
- JDO怎么不能Enhance
- 各位大侠们,请问在JAVA中怎样弹出一个消息框。如何弹出一个form.(是否可以用show).
- ibatis 插入oracle数据问题
- 在高并发的情况下,不使用自增方式如何生成唯一主键?
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());
}
生成验证码:null
java.util.Random@dd36f3
[INFO ] 2013-06-19 14:03:30,968 method:com.ifengstar.common.controller.MainPage.validateCode(MainPage.java:303)
验证码生成完成TPJB