SpringMVC重定向路徑中帶中文參數


SpringMVC重定向路徑中帶中文參數

springboot重定向到后端接口測試

package com.mozq.http.http_01.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

// http://localhost:7001/acc

/**
 * springboot測試是否可以直接重定向進入后端接口。
 */
@Controller
@RequestMapping("/acc")
public class Demo_02 {
    /**
     * 不對中文參數進行編碼,重定向后無法正確獲取參數。
     * 不僅中文字符,還有一些特殊字符都應該進行編碼后拼接到url中,具體的要看規范。
     * 英文字母和數字是肯定可以的。
     *
     * 運行結果:
     * http://localhost:7001/acc/accept?name=??&address=??
     * ??:??
     */
    @RequestMapping("/cn")
    public String cn(){
        return "redirect:http://localhost:7001/acc/accept?name=劉備&address=成都";
    }

    /**
     * 對參數進行編碼,重定向到后端接口,不需要我們進行解碼,就可以拿到正確參數。可能因為springboot內嵌的tomcat的uri編碼默認采用utf-8,和我們編碼的方式相同,所以參數被正確獲取。
     * 運行結果:
     * http://localhost:7001/acc/accept?name=%E5%88%98%E5%A4%87&address=%E6%88%90%E9%83%BD
     * 劉備:成都
     */
    @RequestMapping("/enc")
    public String enc() throws UnsupportedEncodingException {
        String Url = "http://localhost:7001/acc/accept"
                + "?name=" + URLEncoder.encode("劉備", "UTF-8")
                + "&address=" + URLEncoder.encode("成都", "UTF-8");
        return "redirect:" + Url;
    }

    /**
     * 運行結果:
     * http://localhost:7001/acc/accept?name%3D%E5%88%98%E5%A4%87%26address%3D%E6%88%90%E9%83%BD
     * Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'name' is not present]
     */
    @RequestMapping("/encWrong")
    public String encWrong(){
        String params = "name=劉備&address=成都";
        String encParams = "";
        try {
            encParams = URLEncoder.encode(params, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return "redirect:http://localhost:7001/acc/accept?" + encParams;
    }

    @RequestMapping("/accept")
    @ResponseBody
    public String accept(@RequestParam("name") String name, @RequestParam("address") String address){
        return name + ":" + address;
    }

}

springboot重定向到前端接口測試

package com.mozq.http.http_01.demo;

import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

// http://localhost:7001/cn
@Controller
public class Demo_01 {
    /**
     * 不對中文參數進行編碼,重定向后無法正確獲取參數。
     * 不僅中文字符,還有一些特殊字符都應該進行編碼后拼接到url中,具體的要看規范。
     * 英文字母和數字是肯定可以的。
     */
    @RequestMapping("/cn")
    public String cn(){
        return "redirect:http://localhost:7001/demo.html?name=劉備&address=成都";
    }

    /**
     * 對參數進行編碼,重定向后前端可以拿到參數,需要手動解碼。
     */
    @RequestMapping("/enc")
    public String enc() throws UnsupportedEncodingException {
        String Url = "http://localhost:7001/demo.html?"
                + "name=" + URLEncoder.encode("劉備", "UTF-8")
                + "&address=" + URLEncoder.encode("成都", "UTF-8");
        return "redirect:" + Url;
    }

    @RequestMapping("/encWrong")
    public String encWrong(){
        String params = "name=劉備&address=成都";
        String encParams = "";
        try {
            encParams = URLEncoder.encode(params, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return "redirect:http://localhost:7001/demo.html?" + encParams;
    }

}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>demo</h1>
<script>
    console.log(window.location.href);
    console.log(getQueryVariable("name"));
    console.log(getQueryVariable("address"));
    //http://localhost:7001/demo.html?name=??&address=??
    //http://localhost:7001/demo.html?name%3D%E5%88%98%E5%A4%87%26address%3D%E6%88%90%E9%83%BD

    /*
    http://localhost:7001/demo.html?name=%E5%88%98%E5%A4%87&address=%E6%88%90%E9%83%BD
    11 %E5%88%98%E5%A4%87
    12 %E6%88%90%E9%83%BD
    decodeURIComponent("%E5%88%98%E5%A4%87");
    "劉備"
    decodeURI("%E5%88%98%E5%A4%87");
    "劉備"
    
    前端需要自己用js解碼:
        global對象的decodeURI()和decodeURIComponent()使用的編碼是UTF-8和百分號編碼。
        (我們編碼時使用的是UTF-8,所以可以正常解碼)
        decodeURI()和decodeURIComponent()的區別是,decodeURI()不會處理uri中的特殊字符,此處我們應該選擇decodeURIComponent()解碼。
     */
    function getQueryVariable(variable){
        var query = window.location.search.substring(1);
        var vars = query.split("&");
        for (var i=0;i<vars.length;i++) {
            var pair = vars[i].split("=");
            if(pair[0] == variable){return pair[1];}
        }
        return(false);
    }
</script>
</body>
</html>

bug

/*
	bug: 后端代碼在url路徑中直接拼接中文,然后進行重定向,重定向后無法獲取中文參數。
*/
String deliveryAddress = "天字一號30";
String orderMealUrl = "http://"+PropertiesHelper.getRelayDomanName()+"/restaurant/?openId=MO_openId&storeId=MO_storeId&orderEquipment=MO_orderEquipment&deliveryAddress=MO_deliveryAddress"
    .replace("MO_openId", openId)
    .replace("MO_storeId", String.valueOf(storeId))
    .replace("MO_orderEquipment", String.valueOf(orderEquipment))
    .replace("MO_deliveryAddress", deliveryAddress)
    ;
/*
重定向到點餐頁面:orderMealUrl=http://aqv9m6.natappfree.cc/restaurant/?openId=oor4oxEII8_ddih2_RxdtYbxf9Cg&storeId=1&orderEquipment=6&deliveryAddress=天字一號30
*/

/* 方案:對路徑中的中文進行URL編碼處理 */
String deliveryAddress = "天字一號30";
String encDeliveryAddress = "";
try {
    encDeliveryAddress = URLEncoder.encode(deliveryAddress, "UTF-8");
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}
String orderMealUrl = "http://"+PropertiesHelper.getRelayDomanName()+"/restaurant/?openId=MO_openId&storeId=MO_storeId&orderEquipment=MO_orderEquipment&deliveryAddress=MO_deliveryAddress"
    .replace("MO_openId", openId)
    .replace("MO_storeId", String.valueOf(storeId))
    .replace("MO_orderEquipment", String.valueOf(orderEquipment))
    .replace("MO_deliveryAddress", encDeliveryAddress)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM