package com.ruoyi.common.utils.http; 
 | 
  
 | 
import java.util.HashMap; 
 | 
import java.util.Map; 
 | 
  
 | 
/** 
 | 
 * 请求参数特殊字符转义工具类 
 | 
 * 用于处理HTTP请求参数中的特殊字符,防止XSS攻击和参数解析错误 
 | 
 */ 
 | 
public class ParameterEscaperUtil { 
 | 
    // 特殊字符转义映射表 
 | 
    private static final Map<Character, String> ESCAPE_MAP; 
 | 
    // 转义字符反转映射表 
 | 
    private static final Map<String, Character> UNESCAPE_MAP; 
 | 
     
 | 
    static { 
 | 
        // 初始化转义映射 
 | 
        ESCAPE_MAP = new HashMap<>(); 
 | 
        ESCAPE_MAP.put('&', "&"); 
 | 
        ESCAPE_MAP.put('<', "<"); 
 | 
        ESCAPE_MAP.put('>', ">"); 
 | 
        ESCAPE_MAP.put('"', """); 
 | 
        ESCAPE_MAP.put('\'', "'"); 
 | 
        ESCAPE_MAP.put('/', "/"); 
 | 
        ESCAPE_MAP.put('\\', "\"); 
 | 
        ESCAPE_MAP.put(' ', "%20"); 
 | 
        ESCAPE_MAP.put('?', "%3F"); 
 | 
        ESCAPE_MAP.put('=', "%3D"); 
 | 
        ESCAPE_MAP.put('+', "%2B"); 
 | 
        ESCAPE_MAP.put('%', "%25"); 
 | 
        ESCAPE_MAP.put('#', "%23"); 
 | 
        ESCAPE_MAP.put(':', "%3A"); 
 | 
        ESCAPE_MAP.put(';', "%3B"); 
 | 
         
 | 
        // 初始化反转义映射 
 | 
        UNESCAPE_MAP = new HashMap<>(); 
 | 
        for (Map.Entry<Character, String> entry : ESCAPE_MAP.entrySet()) { 
 | 
            UNESCAPE_MAP.put(entry.getValue(), entry.getKey()); 
 | 
        } 
 | 
    } 
 | 
     
 | 
    /** 
 | 
     * 转义请求参数中的特殊字符 
 | 
     * @param input 原始输入字符串 
 | 
     * @return 转义后的字符串 
 | 
     */ 
 | 
    public static String escape(String input) { 
 | 
        if (input == null || input.isEmpty()) { 
 | 
            return input; 
 | 
        } 
 | 
         
 | 
        StringBuilder sb = new StringBuilder(); 
 | 
        for (char c : input.toCharArray()) { 
 | 
            // 如果是需要转义的字符,则使用转义后的字符串,否则直接添加 
 | 
            String escaped = ESCAPE_MAP.get(c); 
 | 
            sb.append(escaped != null ? escaped : c); 
 | 
        } 
 | 
        return sb.toString(); 
 | 
    } 
 | 
     
 | 
    /** 
 | 
     * 反转义请求参数中的特殊字符 
 | 
     * @param input 转义后的字符串 
 | 
     * @return 原始字符串 
 | 
     */ 
 | 
    public static String unescape(String input) { 
 | 
        if (input == null || input.isEmpty()) { 
 | 
            return input; 
 | 
        } 
 | 
         
 | 
        StringBuilder sb = new StringBuilder(); 
 | 
        int i = 0; 
 | 
        while (i < input.length()) { 
 | 
            boolean found = false; 
 | 
            // 检查是否是转义序列 
 | 
            for (String escapeSeq : UNESCAPE_MAP.keySet()) { 
 | 
                if (input.startsWith(escapeSeq, i)) { 
 | 
                    sb.append(UNESCAPE_MAP.get(escapeSeq)); 
 | 
                    i += escapeSeq.length(); 
 | 
                    found = true; 
 | 
                    break; 
 | 
                } 
 | 
            } 
 | 
            if (!found) { 
 | 
                sb.append(input.charAt(i)); 
 | 
                i++; 
 | 
            } 
 | 
        } 
 | 
        return sb.toString(); 
 | 
    } 
 | 
} 
 | 
     
 |