2010-10-27 65 views
4

问候所有 我有一个控制器POST方法时会被重定向到一个新页面 我的方式等类如何在春季框架中编码一个网址?

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

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

    } 

假设用户已经具有重定向 之前的会话,我想在重定向之前编码新的url以维护用户会话 如何做?

回答

6

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

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

但首先要确保弹簧不会自动为您做到这一点。

+0

谢谢,但我不确定春天是否自动执行此操作,任何有春季专家都可以告诉我们吗? – 2010-10-28 13:28:01

+0

好吧,试试吧...... – Bozho 2010-10-28 13:31:00

+0

“尝试”是一种非常糟糕的方法。它可以在他使用的版本/设置中以一种方式工作,并且工作方式不同(例如在生产中)。 – 2015-04-01 11:29:18

0

Spring doc是这类问题的终极资源。此外,您可以从github下载正确版本的代码,并调试以获得答案。至于这个问题,在这里检查http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/mvc.html#mvc-redirecting-redirect-prefix,或检查以下类RedirectView的源代码(适用于春季4.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); 
    } 
} 

总之,春天会为你,如果你知道放在哪里值。