• struts---JSP界面验证码生成与验证


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

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

    CreateImageAction:

    复制代码
    package com.xiaoluo.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.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;
    
    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 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; } }
    复制代码

    以上是生成随机验证码图片的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">image/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>
  • 相关阅读:
    Unix/Linux环境C编程入门教程(23) 字符数字那些事儿
    Unix/Linux环境C编程入门教程(22) C/C++如何获取程序的运行时间
    如何定义函数模板
    Unix/Linux环境C编程入门教程(21) 各个系统HelloWorld跑起来效果如何?
    为什么使用模板
    CC++初学者编程教程(16) 搭建Xcode cocos2dx开发环境
    delete noprompt archivelog 报错ORA-00245,RMAN-08132
    RMAN-03002、RMAN-06059
    RAC RMAN 备份 RMAN-03009 ORA-19504 ORA-27040 RMAN-06012 channel c3 not allocated 错误分析
    RMAN备份到NFS,报错 ORA-27054
  • 原文地址:https://www.cnblogs.com/Coolkaka/p/5987312.html
Copyright © 2020-2023  润新知