java实现原生动态生成验证码

  介绍

这篇文章运用简单易懂的例子给大家介绍java实现原生动态生成验证码,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

<强>需求描述:为了防止脚本多次请求,很多时候在注册会用到验证码,我们用java实现一个图片验证的二维码。

<强>项目结构

癹ava实现原生动态生成验证码"

包lhw.wanlin.checkimg;
  
  进口javax.imageio.ImageIO;
  进口javax.servlet.ServletException;
  进口javax.servlet.annotation.WebServlet;
  进口javax.servlet.http.HttpServlet;
  进口javax.servlet.http.HttpServletRequest;
  进口javax.servlet.http.HttpServletResponse;
  进口java.awt。*;
  进口java.awt.image.BufferedImage;
  进口java.io.BufferedReader;
  进口java.io.FileNotFoundException;
  进口java.io.FileReader;
  进口java.io.IOException;
  进口java.util.ArrayList;
  进口并不知道;
  进口java.util.Random;
  
  @WebServlet (name=癈heckServlet")
  公开课CheckServlet扩展HttpServlet {//集中保存所有成语
  私人List,字=new ArrayList<的在();
  
  @Override
  公共空间init()抛出ServletException {//初始化阶段,读取new_words.txt//网络工程中读取文件,必须使用绝对磁盘路径
  字符串路径=getServletContext () .getRealPath (“/web - inf/new_words.txt");
  尝试{
  BufferedReader br=new BufferedReader(新FileReader(路径));
  字符串行;
  在((=br.readLine行())!=null) {
  words.add(线);
  }
  br.close ();
  }捕捉(FileNotFoundException e) {
  e.printStackTrace ();
  }捕捉(IOException e) {
  e.printStackTrace ();
  }
  }
  
  保护无效doPost (HttpServletRequest请求,HttpServletResponse响应)抛出ServletException IOException {
  这一点。doGet(请求、响应);
  }
  
  保护无效doGet (HttpServletRequest请求,HttpServletResponse响应)抛出ServletException IOException {//禁止缓存//response.setHeader (“Cache-Control",“no-cache");//response.setHeader (“Pragma",“no-cache");//response.setDateHeader (“Expires", 1);
  System.out.println(单词);
  
  int宽度=120;
  int高度=30;//步骤一绘制一张内存中图片
  BufferedImage BufferedImage=new BufferedImage(宽度、高度,
  BufferedImage.TYPE_INT_RGB);//步骤二图片绘制背景颜色- - -通过绘图对象
  图形图像=bufferedImage.getGraphics();//得到画图对象- - -画笔//绘制任何图形之前都必须指定一个颜色
  图形。改变颜色(getRandColor (200、250));
  图形。fillRect(0, 0,宽度、高度);//步骤三绘制边框
  graphics.setColor (Color.WHITE);
  图形。宽度绘制矩形(0,0,- 1,- 1)高度;//步骤四四个随机数字
  Graphics2D Graphics2D=(Graphics2D)图形;//设置输出字体
  graphics2d。setFont(新字体(“宋体“,字体。大胆、18));
  
  随机随机=new随机();//生成随机数
  int指数=random.nextInt (words.size ());
  字符串文字=words.get(指数);//获得成语//定义x坐标
  int x=10;
  for (int i=0;我& lt;word.length ();我+ +){//随机颜色
  graphics2d。改变颜色(新颜色(20 + random.nextInt(110), 20 +随机的
  20 + random.nextInt .nextInt (110), (110)));//旋转-30 - 30度
  int jiaodu=random.nextInt (60) - 30;//换算弧度
  双θ=jiaodu *数学。π/180;//获得字母数字
  字符c=word.charAt(我);//将c输出到图片
  graphics2d。旋转(θ,x, 20);
  graphics2d.drawString (String.valueOf (c), x, 20);
  graphics2d。旋转(θ,x, 20);
  x +=30;
  }//将验证码内容保存会话
  request.getSession () .setAttribute (“checkcode_session"、文字);//步骤五绘制干扰线
  图形。改变颜色(getRandColor (160、200));
  int x1;
  int x2;
  int y?;
  int y2;
  for (int i=0;我& lt;30;我+ +){
  x1=random.nextInt(宽度);
  x2=random.nextInt (12);
  日元=random.nextInt(高度);
  y2=random.nextInt (12);
  图形。画直线(x1, y1, x1 + x2, y2 x2 +);
  }//将上面图片输出到浏览器ImageIO
  graphics.dispose();//释放资源//将图片写到response.getOutputStream()中
  ImageIO。写(bufferedImage,“jpg" response.getOutputStream ());
  }/* *
  *取其某一范围的颜色
  *
  * @param fc
  * int范围参数1
  * @param公元前
  * int范围参数2
  * @return颜色
  */私人颜色getRandColor(公元前int fc, int) {//取其随机颜色
  随机随机=new随机();
  如果(fc祝辞255){
  fc=255;
  }
  如果(公元前比;255){
  公元前=255;
  }
  int r=fc +随机的。nextInt (bc - fc);
  int g=fc +随机的。nextInt (bc - fc);
  int b=fc +随机的。nextInt (bc - fc);
  返回新颜色(r, g, b);
  }
  }

java实现原生动态生成验证码