关于java 图形验证码的解决方法

时间:2023-08-09 15:21:19 

package cn.response;

import java.awt.Color;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class validatePicture extends HttpServlet {

 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  try {
   validateimage(request, response);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
 }

 public static final int WIDTH = 120;
 public static final int HEIGHT = 25;

 public void validateimage(HttpServletRequest request,
   HttpServletResponse response) throws Exception {

  BufferedImage bi = new BufferedImage(WIDTH, HEIGHT,
    BufferedImage.TYPE_INT_RGB);// 在内存中构建一幅图象
  Graphics g = bi.getGraphics();

  setBackGround(g);// 设置背景色
  setBorder(g);// 设置边框
  drawRandomLine(g);// 画干扰线
  String random = drawRandomNum((Graphics2D) g);// 写随机数

  request.getSession().setAttribute("random", random);
  //request.getSession(false);
  response.setContentType("image/jpeg");
  // 设置不要缓存
  response.setDateHeader("expries", -1);
  response.setHeader("Cache-Control", "no-cache");

  ImageIO.write(bi, "jpg", response.getOutputStream());
 }

 private String drawRandomNum(Graphics2D g) {
  g.setColor(Color.RED);
  g.setFont(new Font("宋体", Font.BOLD, 20));
  // [\u4e00-\u9fa5]中文数字区间
  String base = "\u4e00\u4f00\u5e00\u4e50\u4e89\u4f10\u4e09";

  StringBuffer sb = new StringBuffer();

  int x = 5;
  for (int i = 0; i < 4; i++) {
   int degree = new Random().nextInt() % 30;

   String ch = base.charAt(new Random().nextInt(base.length())) + "";
   sb.append(ch);
   g.rotate(degree * Math.PI / 180, x, 20);
   g.drawString(ch, x, 20);
   g.rotate(-degree * Math.PI / 180, x, 20);

   x = x + 30;
  }
  System.out.println(sb.toString());
  return sb.toString();
 }

 private void drawRandomLine(Graphics g) {
  g.setColor(Color.GREEN);
  for (int i = 0; i < 3; i++) {
   int x1 = new Random().nextInt(WIDTH);
   int y1 = new Random().nextInt(HEIGHT);

   int x2 = new Random().nextInt(WIDTH);
   int y2 = new Random().nextInt(HEIGHT);

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

 private void setBorder(Graphics g) {
  g.setColor(Color.BLUE);
  g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2);
 }

 private void setBackGround(Graphics g) {
  g.setColor(Color.WHITE);
  g.fillRect(0, 0, WIDTH, HEIGHT);
 }
}

标签:java,图形验证码
0
投稿

猜你喜欢

  • springboot中的静态资源加载顺序优先级

    2023-08-24 11:12:31
  • 探究实现Aware接口的原理及使用

    2022-10-14 14:29:39
  • Java Maven依赖传递,可选依赖,排除依赖详解

    2022-06-09 14:24:14
  • Stream distinct根据list某个字段去重的解决方案

    2022-06-22 22:23:26
  • Java常用集合与原理解析

    2023-04-01 14:26:42
  • Java 实战练习之网上电商项目的实现

    2021-07-17 04:23:59
  • java与微信小程序实现websocket长连接

    2021-09-10 11:32:11
  • Windows下gradle的安装与配置的超详细教程

    2023-08-27 17:01:50
  • Android仿外卖购物车功能

    2023-06-01 02:45:26
  • winform导出dataviewgrid数据为excel的方法

    2023-09-25 15:01:38
  • c# RSA非对称加解密及XML&PEM格式互换方案

    2022-07-10 12:19:31
  • 剖析Java中阻塞队列的实现原理及应用场景

    2023-09-01 17:33:07
  • 在winform下实现左右布局多窗口界面的方法

    2023-02-23 11:31:51
  • C#实现的json序列化和反序列化代码实例

    2022-04-05 22:24:08
  • Java Set集合去重的原理及实现

    2023-08-11 10:56:11
  • 基于C#实现简单离线注册码生成与验证

    2022-02-08 15:22:49
  • WPF+SkiaSharp实现自绘弹幕效果

    2022-09-30 09:52:38
  • 浅谈MyBatis通用Mapper实现原理

    2022-11-18 18:45:16
  • springboot结合maven实现多模块打包

    2022-01-16 07:13:51
  • Android自定义控件实现带数值和动画的圆形进度条

    2021-09-09 22:02:46
  • asp之家 软件编程 m.aspxhome.com