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

    目录结构:

  • 相关阅读:
    使用CoreData [3]
    使用CoreData [2]
    使用CoreData [1]
    [翻译] CRPixellatedView-用CIPixellate滤镜动态渲染UIView
    简易使用UILabel的富文本
    [翻译] OrigamiEngine
    [翻译] DoActionSheet
    解决tableView中cell动态加载控件的重用问题
    ARC中用代码检测一个对象有没有释放掉
    HTTP请求中浏览器的缓存机制
  • 原文地址:https://www.cnblogs.com/sky230/p/6500713.html
Copyright © 2020-2023  润新知