以文件流的形式生成验证码
2016-02-22 15:32
465 查看
/****
* 生成验证码
* @param request
* @param response
*/
@RequestMapping("/imgVerifyCode")
public void imgVerifyCode(HttpServletRequest request,HttpServletResponse response){
int width=100;//验证码图片宽度
int height=40;//验证码图片高度
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
Graphics g=image.getGraphics();
Graphics2D g2d = (Graphics2D) g;
Random random=new Random();
g.setColor(Color.white);//背景颜色(或getRandColor(160,250))
g.fillRect(0, 0, width, height);//画背景
//g.setColor(getRandColor(0,255));//边框颜色
// g.drawRect(0, 0, width-1, height-1);//画边框
// 随机产生20条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
//Stroke stroke=new BasicStroke(3.0f);//设置线宽为3.0
for(int i=0;i<20;i++){
int x=random.nextInt(width);
int y=random.nextInt(height);
int x1=random.nextInt(20);
int y1=random.nextInt(20);
g.drawLine(x,y,x+x1,y+y1);
//g2d.setStroke(stroke);
}
// 随机产生20点,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for(int i=0;i<20;i++){
int x=random.nextInt(width);
int y=random.nextInt(height);
g.drawLine(x, y, x, y);
}
//随机生成不同的字体、字体样式和字体大小
String[] fontName = {"微软雅黑","黑体","Georgia","Verdana","Arial","Comic Sans MS","Lucida Console"};
int [] fontEffect = {Font.PLAIN, Font.ITALIC, Font.BOLD};
int [] fontSize = {28, 30, 32, 26};
Font[] fonts = new Font[fontName.length*fontEffect.length*fontSize.length];
int fontsIndex=0;
for(String str: fontName){
for(int effect: fontEffect){
for(int size : fontSize){
Font font = new Font(str, effect, size);
fonts[fontsIndex]=font;
fontsIndex = fontsIndex +1;
}
}
}
String s="abcdefghijknpqrstuvxyzABCDEFGHJKLNPQRSTUVXYZ23456789"; // 设置备选验证码
String sRand="";
// 用随机产生的颜色将验证码绘制到图像中。
int length = 4; // 设置默认生成4个验证码
for(int i=0;i<length;i++){
g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110))); // 生成随机颜色(因为是做前景,所以偏深)
g.setFont(fonts[random.nextInt(fonts.length)]); //调用上方的随机字体
String ch=String.valueOf(s.charAt(random.nextInt(s.length())));
//设置字体旋转
int zhuan = random.nextInt(20);
int fzhuan = -random.nextInt(20);
g2d.rotate(Math.toRadians(zhuan),25*(i-1),20); /// 坐标系顺时针转
g2d.rotate(Math.toRadians(fzhuan),25*(i-1),20); /// 坐标系逆时针转
sRand+=ch;
g.drawString(ch, 18 * i + 15, 30); //将认证码用 drawString 函数显示到图象里
g2d.rotate(Math.toRadians(-1*zhuan),25*(i-1),20);
g2d.rotate(Math.toRadians(-1*fzhuan),25*(i-1),20);
}
//将生成的字符串存储在session中
HttpSession session=request.getSession();
//在认证码的上端画一条不规则的线
int visit[] = new int[6];
for (int i = 0; i < visit.length; i++) {
visit[i] = 1 + (int) (Math.random() * 10);
}
int visitValue = 0;
g.setColor(Color.BLACK);
int drawHigh[] = new int[6];
int drawwidth[] = new int[6];
//折点坐标
for (int i = 0; i < 6; i++) {
drawHigh[i] = 40 - (int) (Math.ceil(visit[i] * 3.8));
drawwidth[i] = 5 + i * 17;
}
//g2d.setXORMode(Color.WHITE);
g2d.setStroke(new BasicStroke(3.0f)); //折线粗细
g2d.setPaint(Color.gray);//折线的颜色
g2d.drawPolyline(drawwidth, drawHigh, 6); //画折线
session.setAttribute("checkCode", sRand);
g.dispose();//图像生效
//禁止图像缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
//创建二进制的输出流
// 将图像输出到Servlet输出流中。
try {
ServletOutputStream sos=response.getOutputStream();
ImageIO.write(image, "jpeg", sos);
sos.flush();
sos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public Color getRandColor(int lower,int upper){
Random random = new Random();
if(upper>255)
upper=255;
if(upper<1)
upper=1;
if(lower<1)
lower=1;
if(lower>255)
lower=255;
int r=lower+random.nextInt(upper-lower);
int g=lower+random.nextInt(upper-lower);
int b=lower+random.nextInt(upper-lower);
return new Color(r,g,b);
}
* 生成验证码
* @param request
* @param response
*/
@RequestMapping("/imgVerifyCode")
public void imgVerifyCode(HttpServletRequest request,HttpServletResponse response){
int width=100;//验证码图片宽度
int height=40;//验证码图片高度
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
Graphics g=image.getGraphics();
Graphics2D g2d = (Graphics2D) g;
Random random=new Random();
g.setColor(Color.white);//背景颜色(或getRandColor(160,250))
g.fillRect(0, 0, width, height);//画背景
//g.setColor(getRandColor(0,255));//边框颜色
// g.drawRect(0, 0, width-1, height-1);//画边框
// 随机产生20条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
//Stroke stroke=new BasicStroke(3.0f);//设置线宽为3.0
for(int i=0;i<20;i++){
int x=random.nextInt(width);
int y=random.nextInt(height);
int x1=random.nextInt(20);
int y1=random.nextInt(20);
g.drawLine(x,y,x+x1,y+y1);
//g2d.setStroke(stroke);
}
// 随机产生20点,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for(int i=0;i<20;i++){
int x=random.nextInt(width);
int y=random.nextInt(height);
g.drawLine(x, y, x, y);
}
//随机生成不同的字体、字体样式和字体大小
String[] fontName = {"微软雅黑","黑体","Georgia","Verdana","Arial","Comic Sans MS","Lucida Console"};
int [] fontEffect = {Font.PLAIN, Font.ITALIC, Font.BOLD};
int [] fontSize = {28, 30, 32, 26};
Font[] fonts = new Font[fontName.length*fontEffect.length*fontSize.length];
int fontsIndex=0;
for(String str: fontName){
for(int effect: fontEffect){
for(int size : fontSize){
Font font = new Font(str, effect, size);
fonts[fontsIndex]=font;
fontsIndex = fontsIndex +1;
}
}
}
String s="abcdefghijknpqrstuvxyzABCDEFGHJKLNPQRSTUVXYZ23456789"; // 设置备选验证码
String sRand="";
// 用随机产生的颜色将验证码绘制到图像中。
int length = 4; // 设置默认生成4个验证码
for(int i=0;i<length;i++){
g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110))); // 生成随机颜色(因为是做前景,所以偏深)
g.setFont(fonts[random.nextInt(fonts.length)]); //调用上方的随机字体
String ch=String.valueOf(s.charAt(random.nextInt(s.length())));
//设置字体旋转
int zhuan = random.nextInt(20);
int fzhuan = -random.nextInt(20);
g2d.rotate(Math.toRadians(zhuan),25*(i-1),20); /// 坐标系顺时针转
g2d.rotate(Math.toRadians(fzhuan),25*(i-1),20); /// 坐标系逆时针转
sRand+=ch;
g.drawString(ch, 18 * i + 15, 30); //将认证码用 drawString 函数显示到图象里
g2d.rotate(Math.toRadians(-1*zhuan),25*(i-1),20);
g2d.rotate(Math.toRadians(-1*fzhuan),25*(i-1),20);
}
//将生成的字符串存储在session中
HttpSession session=request.getSession();
//在认证码的上端画一条不规则的线
int visit[] = new int[6];
for (int i = 0; i < visit.length; i++) {
visit[i] = 1 + (int) (Math.random() * 10);
}
int visitValue = 0;
g.setColor(Color.BLACK);
int drawHigh[] = new int[6];
int drawwidth[] = new int[6];
//折点坐标
for (int i = 0; i < 6; i++) {
drawHigh[i] = 40 - (int) (Math.ceil(visit[i] * 3.8));
drawwidth[i] = 5 + i * 17;
}
//g2d.setXORMode(Color.WHITE);
g2d.setStroke(new BasicStroke(3.0f)); //折线粗细
g2d.setPaint(Color.gray);//折线的颜色
g2d.drawPolyline(drawwidth, drawHigh, 6); //画折线
session.setAttribute("checkCode", sRand);
g.dispose();//图像生效
//禁止图像缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
//创建二进制的输出流
// 将图像输出到Servlet输出流中。
try {
ServletOutputStream sos=response.getOutputStream();
ImageIO.write(image, "jpeg", sos);
sos.flush();
sos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public Color getRandColor(int lower,int upper){
Random random = new Random();
if(upper>255)
upper=255;
if(upper<1)
upper=1;
if(lower<1)
lower=1;
if(lower>255)
lower=255;
int r=lower+random.nextInt(upper-lower);
int g=lower+random.nextInt(upper-lower);
int b=lower+random.nextInt(upper-lower);
return new Color(r,g,b);
}
<img src="/home/index/verifyImg" onclick="this.src='/home/index/verifyImg'" alt="" />
相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- Zend的MVC机制使用分析(二)
- ASP.NET MVC 4 捆绑和缩小实例介绍
- ASP.NET MVC中将控制器分离到类库的实现
- asp.net实现在非MVC中使用Razor模板引擎的方法
- ASP.NET MVC中的AJAX应用
- 为ASP.NET MVC及WebApi添加路由优先级
- ASP.NET MVC中图表控件的使用方法
- ASP.NET MVC的四种验证编程方式
- 仅30行代码实现Javascript中的MVC
- ASP.NET MVC 3仿Server.Transfer效果的实现方法
- 如何在MVC应用程序中使用Jquery
- ASP.NET MVC小结之基础篇(二)
- ASP.NET小结之MVC, MVP, MVVM比较以及区别(一)
- Asp.net实现MVC处理文件的上传下载功能实例教程