之前想做一个随机验证码的功能,自己也搜索了一下别人写的代码,然后自己重新用struts2实现了一下,现在将我自己实现代码贴出来!大家有什么意见都可以指出来!

首先是生成随机验证码图片的action:

package com.xiaoluo.action;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.p_w_picpath.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Random;

import javax.p_w_picpathio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class CreateImageAction extends ActionSupport
{
   private ByteArrayInputStream inputStream;

   private static int WIDTH = 60;

   private static int HEIGHT = 20;

   public ByteArrayInputStream getInputStream()
   {
       return inputStream;
   }

   public void setInputStream(ByteArrayInputStream inputStream)
   {
       this.inputStream = inputStream;
   }

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

       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 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 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);

   }

   @Override
   public String execute() throws Exception
   {
       HttpServletResponse response = ServletActionContext.getResponse();

       // 设置浏览器不要缓存此图片
       response.setHeader("Pragma", "no-cache");

       response.setHeader("Cache-Control", "no-cache");

       response.setDateHeader("Expires", 0);

       String rands = createRandom();

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

       Graphics g = p_w_picpath.getGraphics();

       // 产生图像
       drawBackground(g);

       drawRands(g, rands);

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

       ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

       ImageIO.write(p_w_picpath, "jpeg", outputStream);

       ByteArrayInputStream input = new ByteArrayInputStream(outputStream
               .toByteArray());

       this.setInputStream(input);

       HttpSession session = ServletActionContext.getRequest().getSession();

       session.setAttribute("checkCode", rands);
       
       input.close();
       
       outputStream.close();

       return SUCCESS;
   }
}

以上是生成随机验证码图片的action,将生成的随机数放到session里,然后页面提交到验证随机数的action:

LoginValidateAction:

package com.xiaoluo.action;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class LoginValidateAction extends ActionSupport
{
    private String checkCode;
    
    public String getCheckCode()
    {
        return checkCode;
    }

    public void setCheckCode(String checkCode)
    {
        this.checkCode = checkCode;
    }

    @Override
    public String execute() throws Exception
    {
        return SUCCESS;
    }
    
    @Override
    public void validate()
    {
        HttpSession session = ServletActionContext.getRequest().getSession();
        
        String checkCode2 = (String)session.getAttribute("checkCode");
        
        if(!checkCode.equals(checkCode2))
        {
            this.addActionError("输入的验证码不正确,请重新输入!");
        }
    }
}

下面是struts.xml配置部分代码:

<action name="createImageAction" class="com.xiaoluo.action.CreateImageAction">
     <result name="success" type="stream">
           <param name="contentType">p_w_picpath/jpeg</param>
           <param name="inputName">inputStream</param>
     </result>
</action>
            
<action name="loginValidateAction" class="com.xiaoluo.action.LoginValidateAction">
      <result name="success">/success.jsp</result>
      <result name="input">/login.jsp</result>
</action>

最后就是jsp部分的代码:

login.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'login.jsp' starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    
  </head>
  
  <body>

    <h3><font color="blue">带有验证码的登陆界面</font></h3>
    
    <s:form action="loginValidateAction.action" theme="simple">
    
        用户名:<s:textfield name="username"></s:textfield><br>
        密码    :<s:password name="password"></s:password><br>
        验证码:<s:textfield name="checkCode"></s:textfield>
     
     <!--若要点击图片刷新,重新得到一个验证码,要在后面加上个随机数,这样保证每次提交过去的都是不一样的path,防止因为缓存而使图片不刷新-->
        <img src="createImageAction.action" onclick="this.src='createImageAction.action?'+ Math.random()" title="点击图片刷新验证码"/><br>
        <s:actionerror cssStyle="color:red"/>
        
        <s:submit value="提交"></s:submit>
    
    </s:form>

  </body>
</html>

到此,就完成用struts2生成随机验证码图片以及实现登陆验证啦!