j2ee-验证码

由于项目中用到了验证码,在网上找了一些示例,应用到了自己的项目中,还是只讲验证码忽略业务代码。
验证码本身和Ibtatis,Mybatis框架无关框架无关

1, 在struts2-Spring-Ibatis框架中使用验证码

-页面部分

<input  value="" name="checkCode"/>
<!--若要点击图片刷新,重新得到一个验证码,要在后面加上个随机数,这样保证每次提交过去的都是不一样的path,防止因为缓存而使图片不刷新-->
<img src="<%=basePath%>publicUse/createImage.action" id="yzm"                       onclick="this.src='<%=basePath%>publicUse/createImage.action?'+ Math.random()" title="点击图片刷新验证码"                            style="width:90px;height:28px;vertical-align:middle;"/>
  • struts配置文件部分
<!-- 验证码 -->
<action name="createImage" class="userLoginAction" method="createImage">
    <result name="success" type="stream">
        <param name="contentType">image/jpeg</param>
        <param name="inputName">inputStream</param>
    </result>
</action>

-Action部分

private ByteArrayInputStream inputStream;

public String createImage() throws IOException{
    HttpServletResponse response = this.getResponse();
       // 设置浏览器不要缓存此图片
       response.setHeader("Pragma", "no-cache");
       response.setHeader("Cache-Control", "no-cache");
       response.setDateHeader("Expires", 0);
       BufferedImage image = CreateImageUtil.drawImage();
       ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
       ImageIO.write(image, "jpeg", outputStream);
       ByteArrayInputStream input = new ByteArrayInputStream(outputStream
               .toByteArray());
       this.setInputStream(input);
       input.close();
       //强制刷新  
       outputStream.flush();  
       outputStream.close();

    return SUCCESS;
}
  • 工具类
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import org.apache.struts2.ServletActionContext;

public class CreateImageUtil {

    private static int WIDTH = 90;
    private static int HEIGHT = 28;

    private static String createRandom(){
        String str = "0123456789zxcvbnmasdfghjklqwertyuiop";

        char[] rands = new char[4];

        Random random = new Random();

        for (int i = 0; i < 4; i++)
        {
            rands[i] = str.charAt(random.nextInt(36));
        }

        return new String(rands);
    }

    private static void drawBackground(Graphics g)
    {
        // 画背景
        g.setColor(new Color(0xDCDCDC));

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

        // 随机产生 120 个干扰点

        for (int i = 0; i < 120; i++)
        {
            int x = (int) (Math.random() * WIDTH);

            int y = (int) (Math.random() * HEIGHT);

            int red = (int) (Math.random() * 255);

            int green = (int) (Math.random() * 255);

            int blue = (int) (Math.random() * 255);

            g.setColor(new Color(red, green, blue));

            g.drawOval(x, y, 1, 0);
        }
    }

    private static void drawRands(Graphics g, String rands)
    {
        g.setColor(Color.BLACK);

        g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));

        // 在不同的高度上输出验证码的每个字符

        g.drawString("" + rands.charAt(0), 1, 17);

        g.drawString("" + rands.charAt(1), 16, 15);

        g.drawString("" + rands.charAt(2), 31, 18);

        g.drawString("" + rands.charAt(3), 46, 16);

        System.out.println(rands);

    }

    public static BufferedImage drawImage(){
        String rands = createRandom();

        //将验证码放入Session
        ServletActionContext.getRequest().getSession().setAttribute("checkCode", rands);   

        BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
                BufferedImage.TYPE_INT_RGB);

        Graphics g = image.getGraphics();

        // 产生图像
        drawBackground(g);

        drawRands(g, rands);

        // 结束图像 的绘制 过程, 完成图像
        g.dispose();

        return image;
    }

}
  • 效果
    这里写图片描述

2, 在spring mvc-Mybatis框架中使用验证码

  • 页面部分
<img src="<%=basePath%>tp/createImage.html"     onclick="this.src='<%=basePath%>tp/createImage.html?'+ Math.random()" title="点击图片刷新验证码" 
            style="width:90px;height:28px;vertical-align:middle;"/><input id="authcode"  />
</tr>
  • Controller部分
@RequestMapping("createImage")
public void createImage(HttpServletRequest request, 
        HttpServletResponse response,HttpSession session) throws IOException{
       // 设置浏览器不要缓存此图片
       response.setHeader("Pragma", "no-cache");
       response.setHeader("Cache-Control", "no-cache");
       response.setDateHeader("Expires", 0);
       BufferedImage image = CreateImageUtil.drawImage(session);
       ImageIO.write(image, "jpeg",  response.getOutputStream());
       response.getOutputStream().flush();
}
  • 工具类部分与上一个类似
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.servlet.http.HttpSession;


public class CreateImageUtil {

    private static int WIDTH = 90;
    private static int HEIGHT = 28;

    private static String createRandom(){
        String str = "0123456789asdfghjklzxcvbnmpoiuytrewq";

        char[] rands = new char[5];

        Random random = new Random();

        for (int i = 0; i < 5; i++)
        {
            rands[i] = str.charAt(random.nextInt(36));
        }

        return new String(rands);
    }

    private static void drawBackground(Graphics g)
    {
        // 画背景
        g.setColor(new Color(0xDCDCDC));

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

        // 随机产生 120 个干扰点

        for (int i = 0; i < 120; i++)
        {
            int x = (int) (Math.random() * WIDTH);

            int y = (int) (Math.random() * HEIGHT);

            int red = (int) (Math.random() * 255);

            int green = (int) (Math.random() * 255);

            int blue = (int) (Math.random() * 255);

            g.setColor(new Color(red, green, blue));

            g.drawOval(x, y, 1, 0);
        }
    }

    private static void drawRands(Graphics g, String rands)
    {
        g.setColor(Color.BLACK);

        g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));

        // 在不同的高度上输出验证码的每个字符

        g.drawString("" + rands.charAt(0), 1, 17);

        g.drawString("" + rands.charAt(1), 16, 15);

        g.drawString("" + rands.charAt(2), 31, 18);

        g.drawString("" + rands.charAt(3), 46, 16);

        g.drawString("" + rands.charAt(4), 56, 20);

        System.out.println(rands);

    }

    public static BufferedImage drawImage(HttpSession session){
        String rands = createRandom();

        //将验证码放入Session
        session.setAttribute("authcode", rands);   

        BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
                BufferedImage.TYPE_INT_RGB);

        Graphics g = image.getGraphics();

        // 产生图像
        drawBackground(g);

        drawRands(g, rands);

        // 结束图像 的绘制 过程, 完成图像
        g.dispose();

        return image;
    }

}
  • 效果
    这里写图片描述

注:部分代码来自网络,另外这两种方式都是在项目中应用过的。不足之处请大家多多指教。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值