找回密码
 立即注册
首页 业界区 安全 SpringBoot进阶教程(八十六)URL指定参数encode ...

SpringBoot进阶教程(八十六)URL指定参数encode

喜及眩 2025-6-14 20:03:39
Encode(编码)和Decode(解码)是在信息处理中常用的概念,用于表示将信息从一种形式转换为另一种形式的过程。
v直接demo
  1. import java.io.UnsupportedEncodingException;
  2. import java.net.URLDecoder;
  3. import java.net.URLEncoder;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. public class UrlParamEncoder {
  7.     public static void main(String[] args) throws UnsupportedEncodingException {
  8.         String url = "https://www.test.com/s?wd=%E7%99%BE%E5%BA%A6&rsv_spt=1&rsv_iqid=0xbe352d6c00064d34&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=tb&rsv_enter=1&rsv_sug3=17&rsv_sug1=8&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&prefixsug=%25E7%2599%25BE%25E5%25BA%25A6&rsp=6&inputT=3412&rsv_sug4=5053";
  9.         String encodedUrl = encodeSpecificParam(url, "prefixsug", true);
  10.         System.out.println(url);
  11.         System.out.println(encodedUrl);
  12.     }
  13.     /**
  14.      * 对指定参数进行编码
  15.      * ignore是否先解码再编码
  16.      * @param url
  17.      * @param targetParam
  18.      * @param ignore
  19.      * @return
  20.      */
  21.     public static String encodeSpecificParam(String url, String targetParam, boolean ignore) {
  22.         try {
  23.             // 分割基础URL和查询部分
  24.             String[] urlParts = url.split("\\?", 2);
  25.             String baseUrl = urlParts[0];
  26.             String queryAndFragment = urlParts.length > 1 ? urlParts[1] : "";
  27.             // 分离查询参数和锚点
  28.             String[] queryFragment = queryAndFragment.split("#", 2);
  29.             String query = queryFragment[0];
  30.             String fragment = queryFragment.length > 1 ? "#" + queryFragment[1] : "";
  31.             // 解析查询参数
  32.             List<Param> params = parseQueryString(query);
  33.             // 编码目标参数
  34.             for (Param param : params) {
  35.                 if (param.key.equals(targetParam)) {
  36.                     String decoded = ignore ? param.value : URLDecoder.decode(param.value, "UTF-8");
  37.                     String encoded = URLEncoder.encode(decoded, "UTF-8")
  38.                             .replace("+", "%20"); // 将+转换为%20
  39.                     param.value = encoded;
  40.                 }
  41.             }
  42.             // 重构查询字符串
  43.             StringBuilder newQuery = new StringBuilder();
  44.             for (Param param : params) {
  45.                 if (newQuery.length() > 0) {
  46.                     newQuery.append("&");
  47.                 }
  48.                 newQuery.append(param.key).append("=").append(param.value);
  49.             }
  50.             // 组合最终URL
  51.             return baseUrl
  52.                     + (newQuery.length() > 0 ? "?" : "")
  53.                     + newQuery.toString()
  54.                     + fragment;
  55.         } catch (UnsupportedEncodingException e) {
  56.             throw new RuntimeException("字符编码错误", e);
  57.         }
  58.     }
  59.     private static List<Param> parseQueryString(String query) {
  60.         List<Param> params = new ArrayList<>();
  61.         if (query == null || query.isEmpty()) return params;
  62.         for (String pair : query.split("&")) {
  63.             int idx = pair.indexOf("=");
  64.             String key = (idx > 0) ? pair.substring(0, idx) : pair;
  65.             String value = (idx > 0 && pair.length() > idx + 1) ? pair.substring(idx + 1) : "";
  66.             params.add(new Param(key, value));
  67.         }
  68.         return params;
  69.     }
  70.     static class Param {
  71.         String key;
  72.         String value;
  73.         Param(String key, String value) {
  74.             this.key = key;
  75.             this.value = value;
  76.         }
  77.     }
  78. }
复制代码
v源码地址

https://github.com/toutouge/javademosecond/tree/master/hellolearn

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册