java,javascript中的url編碼

真實場景

url示例以下javascript

http://localhost:31956/Login/Auto?Token=e8a67a9f-c062-4964-b703-d79f29c8b64e&ReturnUrl=/mobilesite/GoodsReceipt/JumpSourceIBuild?projectSysNo=19&urlReferer=http://www.baidu.comhtml

/Login/Auto接收兩個查詢參數(query string)Token和ReturnUrl, 其中ReturnUrl 的值比較特殊 /mobilesite/GoodsReceipt/JumpSourceIBuild?projectSysNo=19&urlReferer=http://www.baidu.com ,它內部還有查詢參數,其中含有兩個特殊字符(?和&)。若是不進行編碼處理/Login/Auto會認爲本身有三個查詢參數,分別是Token,ReturnUrl和UrlReferer。這顯然不是咱們想要的結果。咱們應該對ReturnUrl進行編碼處理。java

java中使用java.net.URLEncoder.encode進行編碼

@Test
public void testEncode() throws EncoderException, UnsupportedEncodingException {
    String rawUrl = "http://www.baidu.com?param=~!@#$&*()=:/,;?+'";
    String encodeByURLEncoder = URLEncoder.encode(rawUrl, "utf-8");

    System.out.println("java.net.URLEncoder encode(UTF-8):");
    System.out.println(encodeByURLEncoder);
}

java中使用commons-codec進行編碼

  1. 在pom.xml中增長commons-codec依賴
<!--apache commons-->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient -->
<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.5</version>
</dependency>
  1. 實例化URLCodec進行編碼
@Test
public void testEncodeReturnUrl() throws EncoderException {
    String loginUrl = "http://localhost:31956/Login/Auto?Token=%s&ReturnUrl=%s";
    String token = "e8a67a9f-c062-4964-b703-d79f29c8b64e";
    String returnUrl = "/mobilesite/GoodsReceipt/JumpSourceIBuild?projectSysNo=19&urlReferer=http://www.baidu.com";

    URLCodec codec = new URLCodec();
    String tokenEncode = codec.encode(token);
    String returnUrlEncode = codec.encode(returnUrl);

    String loginUrlEncode = String.format(loginUrl, tokenEncode, returnUrlEncode);
    System.out.println("編碼結果:");
    System.out.println(loginUrlEncode);
}

編碼結果http://localhost:31956/Login/Auto?Token=e8a67a9f-c062-4964-b703-d79f29c8b64e&ReturnUrl=%2Fmobilesite%2FGoodsReceipt%2FJumpSourceIBuild%3FprojectSysNo%3D19%26urlReferer%3Dhttp%3A%2F%2Fwww.baidu.comapache

javascript中使用encodeURIComponent進行編碼

var loginUrl = "http://localhost:31956/Login/Auto?Token=#{1}#&ReturnUrl=#{2}#";
var token = "e8a67a9f-c062-4964-b703-d79f29c8b64e";
var returnUrl = "/mobilesite/GoodsReceipt/JumpSourceIBuild?projectSysNo=19&urlReferer=http://www.baidu.com";

var tokenEncode = encodeURIComponent(token);
var returnUrlEncode = encodeURIComponent(returnUrl);

var loginUrlEncode = loginUrl.replace("#{1}#", tokenEncode).replace("#{2}#", returnUrlEncode);
console.log("編碼結果:", loginUrlEncode);

javascript中escape, encodeURI, encodeURIComponent的區別

  1. 對字符串(string)進行編碼,其中 ASCII字母、數字、@*/+ ,這幾個字符不會被編碼,其他的都會。
  2. encodeURI方法不會對下列字符編碼 ASCII字母、數字、~!@#$&*()=:/,;?+'
  3. encodeURIComponent方法不會對下列字符編碼 ASCII字母、數字、~!*()'

參考資料

相關文章
相關標籤/搜索