Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在spring框架中编码url?_Java_Spring_Servlets_Spring Mvc_Spring Security - Fatal编程技术网

Java 如何在spring框架中编码url?

Java 如何在spring框架中编码url?,java,spring,servlets,spring-mvc,spring-security,Java,Spring,Servlets,Spring Mvc,Spring Security,大家好 我在控制器中有一个post方法,它重定向到一个新页面 我喜欢这样的方式: @RequestMapping(method = RequestMethod.POST) public String post(HttpServletRequest request) { return "redirect:http://www.x.appName.com/myPage"; } 假设用户在重定向之前已经有一个会话 我想在重定向之前对新url进行编码,以维护用户会话

大家好 我在控制器中有一个post方法,它重定向到一个新页面 我喜欢这样的方式:

@RequestMapping(method = RequestMethod.POST)
    public String post(HttpServletRequest request) {

        return "redirect:http://www.x.appName.com/myPage";

    }
假设用户在重定向之前已经有一个会话 我想在重定向之前对新url进行编码,以维护用户会话
如何执行此操作?

您可以将
HttpServletResponse
作为参数传递,并使用以下方法:


但首先要确保spring不会自动为您执行此操作。

spring文档是此类问题的终极资源。此外,您还可以从github下载正确版本的代码,并进行调试以获得答案。对于这个问题,请点击这里,或者点击下面的类RedirectView的源代码(适用于spring 4.1.0):

受保护的void appendqueryproperty(StringBuilder targetUrl、映射模型、字符串编码方案)
抛出不支持的DencodingException{
//提取锚定片段(如有)。
字符串片段=null;
int anchorIndex=targetUrl.indexOf(“#”);
如果(锚定索引>-1){
fragment=targetUrl.substring(anchorIndex);
delete(anchorIndex,targetUrl.length());
}
//如果还没有一些参数,我们需要一个“?”。
boolean first=(targetUrl.toString().indexOf(“?”)<0);
对于(Map.Entry:queryProperties(model).entrySet()){
对象rawValue=entry.getValue();
迭代器估值器;
if(rawValue!=null&&rawValue.getClass().isArray()){
valueIter=Arrays.asList(ObjectUtils.toObjectArray(rawValue)).iterator();
}
else if(集合的原始值实例){
valueIter=((集合)rawValue).iterator();
}
否则{
valueIter=Collections.singleton(rawValue.iterator();
}
while(valueIter.hasNext()){
Object value=valueIter.next();
如果(第一){
targetUrl.append(“?”);
第一个=假;
}
否则{
targetUrl.append('&');
}
字符串encodedKey=urlEncode(entry.getKey(),encodingScheme);
字符串encodedValue=(value!=null?urlEncode(value.toString(),encodingScheme):“”);
append(encodedKey).append('=').append(encodedValue);
}
}
//将锚定片段(若有)附加到URL的末尾。
if(片段!=null){
追加(片段);
}
}

简而言之,如果您知道将值放在何处,Spring会为您执行此操作。

UriComponentsBuilder的构建方法默认为“false”,这将触发编码:

UriComponentsBuilder.fromHttpUrl(url).build().toString()

谢谢,但我不确定spring是否会自动执行此操作,请使用spring的专家告诉我们:“尝试”是一种非常糟糕的方法。它可能在他使用的版本/设置中以一种方式工作,而在另一种版本/设置中以不同的方式工作(如在生产中)。从这个答案开始已经过了很多时间,现在您是否了解Spring(安全)是否自动执行此操作的信息?我不知道:)如果您进行调查并得到答案,请告诉我们依赖默认值是有风险的,显式编码更好/更安全。不能保证默认值在将来的版本中不会改变。
    protected void appendQueryProperties(StringBuilder targetUrl, Map<String, Object> model, String encodingScheme)
        throws UnsupportedEncodingException {

    // Extract anchor fragment, if any.
    String fragment = null;
    int anchorIndex = targetUrl.indexOf("#");
    if (anchorIndex > -1) {
        fragment = targetUrl.substring(anchorIndex);
        targetUrl.delete(anchorIndex, targetUrl.length());
    }

    // If there aren't already some parameters, we need a "?".
    boolean first = (targetUrl.toString().indexOf('?') < 0);
    for (Map.Entry<String, Object> entry : queryProperties(model).entrySet()) {
        Object rawValue = entry.getValue();
        Iterator<Object> valueIter;
        if (rawValue != null && rawValue.getClass().isArray()) {
            valueIter = Arrays.asList(ObjectUtils.toObjectArray(rawValue)).iterator();
        }
        else if (rawValue instanceof Collection) {
            valueIter = ((Collection<Object>) rawValue).iterator();
        }
        else {
            valueIter = Collections.singleton(rawValue).iterator();
        }
        while (valueIter.hasNext()) {
            Object value = valueIter.next();
            if (first) {
                targetUrl.append('?');
                first = false;
            }
            else {
                targetUrl.append('&');
            }
            String encodedKey = urlEncode(entry.getKey(), encodingScheme);
            String encodedValue = (value != null ? urlEncode(value.toString(), encodingScheme) : "");
            targetUrl.append(encodedKey).append('=').append(encodedValue);
        }
    }

    // Append anchor fragment, if any, to end of URL.
    if (fragment != null) {
        targetUrl.append(fragment);
    }
}
UriComponentsBuilder.fromHttpUrl(url).build().toString()