代码之家  ›  专栏  ›  技术社区  ›  Mahmoud Saleh

如何在Spring框架中编码URL?

  •  4
  • Mahmoud Saleh  · 技术社区  · 14 年前

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

    @RequestMapping(method = RequestMethod.POST)
        public String post(HttpServletRequest request) {
    
            return "redirect:http://www.x.appName.com/myPage";
    
        }
    

    假设用户在重定向之前已经有一个会话 我想在重定向之前对新的URL进行编码以维护用户会话 如何做到这一点?

    2 回复  |  直到 9 年前
        1
  •  6
  •   Bozho Michał Mech    14 年前

    你可以通过 HttpServletResponse 作为参数,并使用 encodeRedirectURL(..) 方法:

    String url = "http://www.x.appName.com/myPage";
    url = response.encodeRedirectURL(url);
    return "redirect:" + url;
    

    但首先要确保弹簧不会自动为你做这件事。

        2
  •  0
  •   ericwzc    9 年前

    SpringDoc是此类问题的最终资源。此外,您可以从GitHub下载正确版本的代码,并调试以获得答案。关于这个问题,请看这里 http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/mvc.html#mvc-redirecting-redirect-prefix ,或检查以下RedirectView类的源代码(适用于Spring4.1.0):

        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);
        }
    }
    

    简而言之,如果你知道把这些值放在哪里,Spring会为你做这些。