strut2登陆注册验证码

1. 生成图片和验证码

package com.jmu.code;

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.util.Random;

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

import org.apache.struts2.ServletActionContext; 

import com.opensymphony.xwork2.ActionSupport;

/**
 * 生成图片和验证码类
 *
 * @author Sky
 * @date 2017年3月4日 上午10:18:08
 *
 */
public class CreateImageAction extends ActionSupport
{
    private static final long serialVersionUID = 1L;

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

    /**
     * 产生随机数
     * @return
     */
    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 image = new BufferedImage(WIDTH, HEIGHT,
                BufferedImage.TYPE_INT_RGB);

        Graphics g = image.getGraphics();

        // 产生图像
        drawBackground(g);
        drawRands(g, rands);

        // 结束图像的绘制过程, 完成图像
        g.dispose();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ImageIO.write(image, "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;
    }
}

2. 前台jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    function refreshImage(obj){
        /** 
          * 每次请求需要一个不同的参数,否则可能会返回同样的验证码     
          * 这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。   
          */  
        var timeNow = new Date().getTime();      
        obj.src="createImageAction.action?" + timeNow;    
    }
</script>
</head>
<body>
<form action="loginValidateAction" method="post">
        <!--若要点击图片刷新,重新得到一个验证码,要在后面加上个随机数,这样保证每次提交过去的都是不一样的path,防止因为缓存而使图片不刷新-->
        验证码:<input type="text" name="checkCode" />
        <img src="createImageAction.action" onclick="refreshImage(this)" title="点击图片刷新验证码" />
        <br>
        <button>提交</button>
    </form>
</body>
</html>

3. strut2.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="default" namespace="/" extends="struts-default">

    <action name="createImageAction" class="com.jmu.code.CreateImageAction" method="execute">
        <result name="success" type="stream">
            <param name="contentType">image/jpeg</param>
            <param name="inputName">inputStream</param>
        </result>
    </action>

    <action name="loginValidateAction" class="com.jmu.code.LoginValidateAction">
        <result name="success">/success.jsp</result>
        <result name="input">/login.jsp</result>
    </action>
</package>
</struts>

4. web.xml 要加上strut2的过滤

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>code</display-name>
    
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

5. 后台检查输入验证码是否正确

package com.jmu.code;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class LoginValidateAction extends ActionSupport
{
    private static final long serialVersionUID = 1L;
    private String checkCode;
    
    @Override
    public String execute() throws Exception
    {
        if(checkCode()){
            System.out.println("check success");
        }else {
            System.out.println("check false");
        }
        return SUCCESS;
    }
    
    /**
     * 验证验证码是否正确
     * @return true or false
     */
    public boolean checkCode()
    {
        HttpSession session = ServletActionContext.getRequest().getSession();
        String checkCode2 = (String)session.getAttribute("checkCode");
        
        if(!checkCode.equals(checkCode2))
        {
            this.addActionError("输入的验证码不正确,请重新输入!");
            return false;
        }
        return true;
    }
    
    public String getCheckCode()
    {
        return checkCode;
    }
    public void setCheckCode(String checkCode)
    {
        this.checkCode = checkCode;
    }
}

目录结构:

 

posted @ 2017-03-04 10:41  Sky.宾桀锋  阅读(278)  评论(0编辑  收藏  举报