• S2SH框架中的无刷新验证码功能实现


    暑假期间在实验室做使用S2SH框架的项目,其中登录和注册需要验证码,实现了一个没有实现刷新验证码功能的简单版本,代码如下:

      1 package com.sem.action;
      2 
      3 import java.io.*;
      4 import java.util.Map;
      5 
      6 import javax.imageio.ImageIO;
      7 import javax.imageio.stream.ImageOutputStream;
      8 //import javax.servlet.http.HttpServletRequest;
      9 import javax.servlet.http.HttpServletResponse;
     10 
     11 //import org.apache.struts2.interceptor.ServletRequestAware;
     12 import org.apache.struts2.interceptor.ServletResponseAware;
     13 //import org.springframework.context.annotation.Scope;
     14 
     15 import com.opensymphony.xwork2.ActionContext;
     16 import com.opensymphony.xwork2.ActionSupport;
     17 
     18 import java.awt.*;
     19 import java.awt.image.BufferedImage;
     20 
     21 
     22 public class ImageCodeAction extends ActionSupport implements ServletResponseAware {
     23 
     24     private ByteArrayInputStream inputStream;
     25     private HttpServletResponse response;
     26 
     27     //生成4个0~9的随机数,放在一个字符串里
     28     public String createRandomString() {
     29         String str = "";
     30         for (int i = 0; i < 4; i++) {
     31             str += Integer
     32                     .toString((new Double(Math.random() * 10)).intValue());
     33         }
     34         return str;
     35     }
     36 
     37     //随机生成一种颜色
     38     public Color createsRandomColor() {
     39         int r = (new Double(Math.random() * 256)).intValue();
     40         int g = (new Double(Math.random() * 256)).intValue();
     41         int b = (new Double(Math.random() * 256)).intValue();
     42         return new Color(r, g, b);
     43     }
     44 
     45     //生成一个内存图片,将四个随机数写在图片上
     46     public BufferedImage createImage(String str) {
     47         int width = 60;
     48         int height = 20;
     49         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
     50         //获取图形上下文
     51         Graphics g = image.getGraphics();
     52         //设定背景色
     53         g.setColor(Color.WHITE);
     54         g.fillRect(0, 0, width, height);
     55         //画边框
     56         g.setColor(Color.black);
     57         g.drawRect(0, 0, width - 1, height - 1);
     58         //将验证码显示到图像中
     59         g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
     60         //使用随机颜色
     61         g.setColor(this.createsRandomColor());
     62         //将随机字符串的每个数字分别写到图片上
     63         g.drawString(Character.toString(str.charAt(0)), 8, 17);
     64         g.drawString(Character.toString(str.charAt(1)), 20, 17);
     65         g.drawString(Character.toString(str.charAt(2)), 33, 17);
     66         g.drawString(Character.toString(str.charAt(3)), 45, 17);
     67         //图像生效
     68         g.dispose();
     69         return image;
     70     }
     71 
     72     //将图片以字节形式写到InputStream里
     73     public ByteArrayInputStream createInputStream() throws Exception {
     74         //获取随机字符串
     75         String str = this.createRandomString();
     76         BufferedImage image = this.createImage(str);
     77         //将产生的字符串写入session,供校验时使用
     78         ActionContext actionContext = ActionContext.getContext();
     79         Map session = actionContext.getSession();
     80         session.put("random", str);
     81         System.out.print("str: " + str + "  session: " + (String)session.get("random") + "
    ");
     82         ByteArrayOutputStream output = new ByteArrayOutputStream();
     83         ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);
     84         ImageIO.write(image, "JPEG", imageOut);
     85         imageOut.close();
     86         ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
     87         output.close();
     88         return input;
     89     }
     90 
     91     //传入action后执行该方法生成图片验证码
     92     public String createCodeImage() throws Exception {
     93         response.setHeader("Pragma","No-cache"); 
     94         response.setHeader("Cache-Control","no-cache"); 
     95         response.setDateHeader("Expires", 0); 
     96         setInputStream(createInputStream());
     97         return SUCCESS;
     98     }
     99 
    100     public ByteArrayInputStream getInputStream() {
    101         return inputStream;
    102     }
    103 
    104     public void setInputStream(ByteArrayInputStream inputStream) {
    105         this.inputStream = inputStream;
    106     }
    107     
    108     public void setServletResponse(HttpServletResponse response) {
    109         this.response = response;
    110     }
    111 }

     如果想要实现刷新功能,利用JavaScript可以很容易做到。

  • 相关阅读:
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
  • 原文地址:https://www.cnblogs.com/jzincnblogs/p/4807577.html
Copyright © 2020-2023  润新知