java验证码

Wesley13
• 阅读 637
package cn.edu.pdsu.action;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.RandomStringUtils;
import org.apache.struts2.ServletActionContext;

/**
 * 类说明:验证码类(将验证码信息写入到session中 属性“authCode”)
 * 
 * @author 作者: LiuJunGuang
 * @version 创建时间:2011-7-17 下午03:26:21
 */
public class AuthCodeAction {
    private HttpServletResponse response = ServletActionContext.getResponse();
    private HttpServletRequest request = ServletActionContext.getRequest();

    public String execute() {
        try {
            int width = 50;
            int height = 20;
            // 取得一个4位随机字母数字字符串
            String s = RandomStringUtils.random(4, true, true);

            // 保存入session,用于与用户的输入进行比较.
            // 注意比较完之后清除session.
            HttpSession session = request.getSession(true);
            session.setAttribute("authCode", s);

            response.setContentType("images/jpeg");//告知浏览器内容的类型
            response.setHeader("Pragma", "No-cache");//HTTP 1.0版 不要缓存
            response.setHeader("Cache-Control", "no-cache"); //HTTP 1.1  不要缓存
            response.setDateHeader("Expires", 0);//设置存活时间

            ServletOutputStream out = response.getOutputStream();//得到响应输出流
            BufferedImage image = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = image.getGraphics();
            // 设定背景色
            g.setColor(getRandColor(200, 250));
            g.fillRect(0, 0, width, height);

            // 设定字体
            Font mFont = new Font("Times New Roman", Font.BOLD, 18);// 设置字体
            g.setFont(mFont);

            // 画边框
            // g.setColor(Color.BLACK);
            // g.drawRect(0, 0, width - 1, height - 1);

            // 随机产生干扰线,使图象中的认证码不易被其它程序探测到
            g.setColor(getRandColor(160, 200));
            // 生成随机类
            Random random = new Random();
            for (int i = 0; i < 125; i++) {
                int x2 = random.nextInt(width);
                int y2 = random.nextInt(height);
                int x3 = random.nextInt(12);
                int y3 = random.nextInt(12);
                g.drawLine(x2, y2, x2 + x3, y2 + y3);
            }
            // 绘制一些长的干扰线
            for (int i = 0; i < 5; i++) {
                int y1 = random.nextInt(15) + 3;
                g.drawLine(0, y1, width, y1);
                g.setColor(getRandColor(10, 160));
            }

            // 将认证码显示到图象中
            g.setColor(new Color(20 + random.nextInt(110), 20 + random
                    .nextInt(110), 20 + random.nextInt(110)));

            g.drawString(s, 2, 16);

            // 图象生效
            g.dispose();
            // 输出图象到页面
            ImageIO.write((BufferedImage) image, "JPEG", out);//将图片以JPEG格式输出到out输出流中
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        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);
    }
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java游戏开发杂谈
在Eclipse里,编写如下两个类:packagegame2;importjava.awt.Color;importjava.awt.Graphics;importjavax.swing.JPanel;/java游戏开发杂谈demo2:画
Wesley13 Wesley13
3年前
java 根据坐标和宽高对图片做剪切
importjava.awt.Color;importjava.awt.Graphics;importjava.awt.Image;importjava.awt.Rectangle;importjava.awt.image.BufferedImage;i
Wesley13 Wesley13
3年前
Java日期时间API系列35
  通过Java日期时间API系列1Jdk7及以前的日期时间类(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fxkzhangsanx%2Fp%2F12032719.html)中得知,Java8以前除了java.sql.Timestamp扩充
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
Java修炼——飞机生存小游戏
在学习了java入门的课程之后,自己动手跟着老师写的一个小游戏,用的是Frame。总共有七个类。1.飞机游戏的主窗口(MyGameFrame)继承Frame。packagecom.bjsxt.plane;importjava.awt.Color;importjava.awt.Font;
Stella981 Stella981
3年前
JFreeChart实现柱状图(3D)
 简单实现3D柱状图packageyh.JFreeChart;importjava.awt.Color;importjava.awt.Font;importorg.jfree.chart.ChartFactory;importorg.jfree.chart.ChartF
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了