基于struts2框架下的验证码实现

来源:互联网 发布:应用包安装软件 编辑:程序博客网 时间:2024/05/18 02:51

1、配置struts2框架

2、在com.itany.util下新建文件   IdentifyCodeUtil.java

package com.itany.util;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.Random;import javax.imageio.ImageIO;import javax.imageio.stream.ImageOutputStream;import com.sun.image.codec.jpeg.ImageFormatException;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;public class IdentifyCodeUtil{    // 随机产生的验证码字符都是从下面的字符串中获取的    private String s = "0123456789abcdefghijklmnopqrstuvwxyz";        // 图片的字节流    private InputStream imageStream;        // 验证码图片对应的验证码字符串    private String identifyCode;        // 私有的构造方法    private IdentifyCodeUtil()    {        init();    }        public InputStream getImageStream()    {        return imageStream;    }        public String getIdentifyCode()    {        return identifyCode;    }        public static IdentifyCodeUtil Instance()    {        return new IdentifyCodeUtil();    }        private void init()    {        int width, height;        width = 100;// 图片宽度        height = 30;// 图片高度        // 在内存中创建图片对象,宽度为width,高度为height        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);        // 获取图形上下文        Graphics graphics = image.getGraphics();        // 设置图片背景色        graphics.setColor(Color.WHITE);        // 填充背景色        graphics.fillRect(0, 0, width, height);                graphics.setColor(Color.DARK_GRAY);        // 设置字体        graphics.setFont(new Font("宋体", Font.BOLD + Font.ITALIC, 30));                // 生成随机类        Random random = new Random();        // 生成长度为5位的字符串,并放入sb中        StringBuffer sb = new StringBuffer();        for (int i = 0; i < 5; i++)        {            int index = random.nextInt(s.length());            sb.append(s.charAt(index));            // 将认证码显示到图象中            graphics.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));            // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成            graphics.drawString(s.charAt(index) + "", 15 * i + 6, 25);        }        // 重新设置字体的颜色,使其与线条的颜色不同        graphics.setColor(getRandColor(170, 250));        // 先设置线条的颜色,再随机产生120条干扰线,使图象中的认证码不易被其它程序探测到        graphics.setColor(getRandColor(120, 200));        for (int i = 0; i < 120; i++)        {            int x = random.nextInt(width);// 每条线条的起点坐标            int y = random.nextInt(height);            int xl = random.nextInt(12);            int yl = random.nextInt(12);            graphics.drawLine(x, y, x + xl, y + yl);        }                this.identifyCode = sb.toString();                ByteArrayOutputStream bos = new ByteArrayOutputStream();        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);                try        {            encoder.encode(image);        }        catch (ImageFormatException e)        {            e.printStackTrace();        }        catch (IOException e)        {            e.printStackTrace();        }                this.imageStream = new ByteArrayInputStream(bos.toByteArray());    }        /*     * 给定范围获得随机颜色     */    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);    }}


3、在包   com.itany.action 下新建文件 BaseAction.java

package com.itany.action;import java.util.Map;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts2.interceptor.ServletRequestAware;import org.apache.struts2.interceptor.ServletResponseAware;import org.apache.struts2.interceptor.SessionAware;import org.apache.struts2.util.ServletContextAware;import com.opensymphony.xwork2.ActionSupport;public class BaseAction extends ActionSupport implements ServletRequestAware, ServletResponseAware, ServletContextAware, SessionAware{        protected HttpServletRequest request;        protected HttpServletResponse response;        protected ServletContext application;        protected Map<String, Object> session;        public void setServletRequest(HttpServletRequest request)    {        this.request = request;    }        public void setServletResponse(HttpServletResponse response)    {        this.response = response;    }        public void setServletContext(ServletContext application)    {        this.application = application;    }        public void setSession(Map<String, Object> session)    {        this.session = session;    }    }


 

4、在包   com.itany.action 下新建文件 ImageAction.java

package com.itany.action;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.util.Random;import com.itany.util.IdentifyCodeUtil;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;import org.apache.struts2.json.annotations.JSON;public class ImageAction extends BaseAction{        private InputStream imageStream;        /* private String s = "0123456789abcdefghijklmnopqrstuvwxyz"; */        public InputStream getImageStream()    {        return imageStream;    }        public void setImageStream(InputStream imageStream)    {        this.imageStream = imageStream;    }        @Override    public String execute()        throws Exception    {        IdentifyCodeUtil icu = IdentifyCodeUtil.Instance();        session.put("code", icu.getIdentifyCode());        imageStream = icu.getImageStream();        return SUCCESS;    }}


 

5、在包   com.itany.action 下新建文件 SecurityAction.java

package com.itany.action;import javax.servlet.ServletOutputStream;import org.apache.struts2.json.annotations.JSON;public class SecurityAction extends BaseAction{    private String info;        public SecurityAction()    {        super();    }        public String getInfo()    {        return info;    }        public void setInfo(String info)    {        this.info = info;    }        @Override    public String execute()        throws Exception    {        String code = (String)session.get("code");        if (code.equals(info))        {            info = "true";            return SUCCESS;        }        else        {            info = "false";            return SUCCESS;        }    }}


 

6、在src下面配置struts文件struts.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd" ><struts><package name="result" namespace="/result" extends="struts-default"><result-types><result-type name="json" class="org.apache.struts2.json.JSONResult" /></result-types><action name="image" class="com.itany.action.ImageAction"><result type="stream"><param name="inputName">imageStream</param></result><result name="fail" type="redirect">/fail.jsp</result></action><action name="security" class="com.itany.action.SecurityAction"><result type="json"><param name="root">info</param></result></action></package></struts>


 

7、在WEB-ROOT下新建image.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags"%><html><head><script type="text/javascript" src="js/jquery-1.4.min.js"></script><script type="text/javascript"> var timer2 = null; var num = 0; function changeImage() {  var img = document.getElementById("img");  img.src = "${pageContext.request.contextPath}/result/image.action?a="    + new Date().getTime();  return false;//因为是用onclik触发,所以为了防止跳转,此处用false } function h(info) {  //$("#message").html("正在验证......");  timer2 = window.setInterval("show()", 250);//每隔0.25秒执行一次show()方法  $    .post(      "${pageContext.request.contextPath}/result/security.action",      {       "info" : info      },      function(data) {       if (data == "true") {        $("#message")          .html(            "<img style='vertical-align:top;' src='image/success.png' />验证码输入正确");        isImageCodeRight = true;        window.clearInterval(timer2);//清除已设置的setInterval对象       } else {        $("#message")          .html(            "<img style='vertical-align:top;' src='image/fail.png' />验证输入错误");        isImageCodeRight = false;        window.clearInterval(timer2);//清除已设置的setInterval对象       }

      }); } function show() {  var info = "正在验证";  for ( var i = 0; i < num; i++) {   info = info + ".";  }  if (num < 6) {   num = num + 1;  } else {   num = 0;  }  $("#message").html(info); }</script></head><body> 验证码: <a href="javascript:;" onclick="return changeImage();"><img  id="img" src="${pageContext.request.contextPath }/result/image.action"  title="点击图片刷新验证码" style="border: solid 2px red" /></a> <br /> <input type="text" name="code" id="code" onblur="h(this.value);" /> <span id="message" style="color: red;"></span></body></html>


 

原创粉丝点击