java servlet图片_JavaWeb-Servlet-通过servlet生成验证码图片

packagecom.fpc;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.image.BufferedImage;importjava.io.IOException;importjava.util.Random;importjavax.imageio.ImageIO;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class BufferImage extendsHttpServlet {public static final int WIDTH = 120;//生成图片的宽度

public static final int HEIGHT = 30;//生成图片的高度

public static final int WORDS_NUMBER = 5;//验证码中字符的个数

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {//TODO Auto-generated method stub

this.doPost(req, resp);

}

@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {//TODO Auto-generated method stub

String createTypeFlag = req.getParameter("createTypeFlag");//接收客户端传递的createTypeFlag标识//在内存中创建一张图片

BufferedImage bi = newBufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_3BYTE_BGR);//得到图片

Graphics g =bi.getGraphics();//设置图片的背景色

setBackGround(g);//设置图片的边框

setBorder(g);//在图片上画干扰线

drawRandomLine(g);//在图片上放上随机字符

String randomString = this.drawRandomNum((Graphics2D)g, createTypeFlag);//将随机数存在session中

req.getSession().setAttribute("checkcode", randomString);//设置响应头通知浏览器以图片的形式打开

resp.setContentType("image/jpeg");//设置响应头控制浏览器不要缓存

resp.setDateHeader("expries", -1);

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

resp.setHeader("Pragma", "no-cache");//将图片传给浏览器

ImageIO.write(bi, "jpg", resp.getOutputStream());

}//设置图片背景色//@param g

private voidsetBackGround(Graphics g) {//设置颜色

g.setColor(Color.WHITE);//填充区域

g.fillRect(0, 0, WIDTH, HEIGHT);

}/** 设置图片的边框

* @param g

**/

private voidsetBorder(Graphics g) {//设置边框颜色

g.setColor(Color.BLUE);//边框区域

g.drawRect(1, 1, WIDTH - 2, HEIGHT -2);

}/** 在图片上画随机线条

* @param g

**/

private voiddrawRandomLine(Graphics g) {//设置颜色

g.setColor(Color.GREEN);//设置线条个数并画线

for ( int i = 0 ; i < 3 ; i++) {int x1 = newRandom().nextInt(WIDTH);int y1 = newRandom().nextInt(HEIGHT);int x2 = newRandom().nextInt(WIDTH);int y2 = newRandom().nextInt(HEIGHT);

g.drawLine(x1, y1, x2, y2);

}

}/** 在图片上画随机字符

* @param g

* @param createTypeFlag

* @return String

**/

privateString drawRandomNum(Graphics g,String createTypeFlag) {//设置颜色

g.setColor(Color.RED);

g.setFont(new Font("宋体",Font.BOLD,20));//数字字母的组合

String baseNumLetter = "0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ";

String baseNum= "0123456789";

String baseLetter= "ABCDEFGHJKLMNOPQRSTUVWXYZ";if ( createTypeFlag != null && createTypeFlag.length() > 0) {if( createTypeFlag.equals("nl") ) {//截取数字和字母的组合

returncreateRandomChar((Graphics2D) g,baseNumLetter);

}else if ( createTypeFlag.equals("n") ) {//截取数字的组合

returncreateRandomChar((Graphics2D) g,baseNum);

}else if ( createTypeFlag.equals("l") ) {//截取字母的组合

returncreateRandomChar((Graphics2D) g,baseLetter);

}

}else{//截取数字和字母的组合

returncreateRandomChar((Graphics2D) g,baseNumLetter);

}return "";

}/** 创建随机字符

* @param g

* @param baseChar

* @return String

**/

privateString createRandomChar(Graphics2D g , String baseChar) {

StringBuffer b= newStringBuffer();int x = 5;

String ch= "";for ( int i = 0 ; i < WORDS_NUMBER ; i++) {//设置字体的旋转角度

int degree = new Random().nextInt() % 30;

ch= baseChar.charAt(new Random().nextInt(baseChar.length())) + "";

b.append(ch);//正向角度

g.rotate(degree * Math.PI / 180 , x,20);

g.drawString(ch, x,20);//反向角度

g.rotate(-degree * Math.PI / 180 , x,20);

x+=30;

}returnb.toString();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值