⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tokenutil.java

📁 电信计费系统
💻 JAVA
字号:
package com.allan.ums.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * 验证码处理工具类,包含如下功能:
 * 1)产生验证码
 * 2)保存验证码
 * 3)校验验证码
 * 4)生成图像验证码
 * 
 * @author Allan
 * @version 1.0
 */
public class TokenUtil {
	public static final String TOKEN_KEY_NAME = "token";
	public static final String TOKEN_PARAMETER_NAME = "token";
    /**
     * 根据给定的字符序列生成随即的验证码。
     * 
     * @param characters 验证码的字符取值范围
     * @param length 生成的验证码的长度
     * @return 指定长度的验证码字符串
     */
    public static String generateToken(String characters, int length) {
        Random ran = new Random();
        char[] tokens = new char[length];
        for (int i = 0; i < length; i++) {
            char ch = characters.charAt(ran.nextInt(characters.length()));
            tokens[i] = ch;
        }

        return new String(tokens);
    }
   
    /**
     * 生成验证码,并将其保存到当前的会话中。该方法主要应用于Struts1,Servlet,JSP环境。
     * 如果会话不存在,自动创建会话。
     * 
     * @param session 当前的请求对象。
     * @param characters 验证码的字符取值范围
     * @param length 生成的验证码的长度
     */
    public static void saveToken(HttpServletRequest request, String characters, int length) {
        HttpSession session = request.getSession();
        session.setAttribute(TOKEN_KEY_NAME, generateToken(characters, length));
    }
  

    /**
     * 针对当前的请求进行验证码的校验,并且在校验完毕候从会话中清空验证码,将其作废。
     * 该方法适用于Struts1,Servlet,JSP环境。
     * 
     * 下面的情况标识校验通过:
     * 1)请求中包含名字为TokenConstants.TOKEN_PARAMETER_NAME所指定的参数。
     * 2)会话中包含名字为TokenConstants.TOKEN_KEY_NAME所指定的属性。
     * 3)1参数的值和2属性的值(字符串类型)相等(忽略大小写)。
     * 
     * @param request HTTP请求对象。
     * @return 验证通过返回true,否则返回false。
     */
    public static boolean isTokenValid(HttpServletRequest request) {
        HttpSession session = request.getSession();
        
        boolean isLegal = true;
        String[] tokenParams = (String[]) request.getParameterValues(TOKEN_PARAMETER_NAME);
        if (tokenParams == null) {
            isLegal = false;
        } else {
            String token = tokenParams[0];
            if (token == null) {
                isLegal = false;
            } else {
                String sessionToken = (String) session.getAttribute(TOKEN_KEY_NAME);
                if (!token.equalsIgnoreCase(sessionToken)) {
                    isLegal = false;
                }
            }
        }
        //删除会话中的token信息
        session.removeAttribute(TOKEN_KEY_NAME);

        return isLegal;
    }

    /**
     * 向客户端生成验证码图片。
     * 
     * @param response HHTP 响应对象。
     * @param session 包含会话属性信息的Map对象。
     * @param width 验证码图片的宽度。
     * @param height 验证码图片的高度。
     * @throws IOException 执行操作时发生网络错误时。
     */
    public static void generateTokenImage(HttpServletResponse response, HttpSession session, int width, int height) throws IOException {
        //设置响应内容为图片格式
        response.setContentType("image/jpeg");

        //禁止浏览器缓存
        response.addHeader("pragma", "NO-cache");
        response.addHeader("Cache-Control", "no-cache");
        response.addDateHeader("Expries", 0);

        //绘制图片
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();

        //以下填充背景颜色
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);

        //设置字体颜色
        g.setColor(Color.RED);
        Font font = new Font("Arial", Font.BOLD, 18);
        g.setFont(font);

        //绘制
        String token = (String) session.getAttribute(TOKEN_KEY_NAME);
        g.drawString(token, 5, height - 2);
        g.dispose();

        //发送内容到客户端
        ServletOutputStream out = response.getOutputStream();
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
        encoder.encode(image);
        out.close();
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -