2010-05-26 11 views
5

को रीडायरेक्ट पर RedirectView में इस्तेमाल किया जा रहा वसंत MVC 2.5 में से jsessionid रोकें - शायद किसी भी सर्वलेट कंटेनर के साथ -, मैं जादू के माध्यम से RedirectView का उपयोग कर एक बाहरी साइट रीडायरेक्ट करना चाहते हैं "अनुप्रेषित: "ModelAndView में दृश्य नाम के लिए उपसर्ग।वसंत MVC और जेट्टी: जेट्टी के साथ बाहरी साइट

दुर्भाग्यवश, RedirectView respond.encodeRedirectURL() का उपयोग करता है, इसलिए मेरा (अन्य चाहता था) सत्र आईडी यूआरएल में संलग्न है। यह न केवल एक सुरक्षा जोखिम बाहरी साइट पर सत्र id ले जाने के लिए है, "; jsessionid = gagnbaba" स्ट्रिंग भी अन्य साइट पर ContextPath/PathInfo के हिस्से के रूप में ख़राब URL में जिसके परिणामस्वरूप में व्याख्या की जा सकती है।

मेरे अपने बाहरी रीडायरेक्ट व्यू को लागू करने के अलावा कोई भी "वसंत" विकल्प ... और "बाहरी रेडियोधर्मी:" उपसर्ग की व्याख्या करने के लिए व्यू रीसोलवर को भी हैक करें?

मोरित्ज़

+0

'' RedirectView' response.encodeURL() 'फोन नहीं है, यह कहता है' response.encodeRedirectURL() ' – skaffman

+0

ठीक है, धन्यवाद। प्रश्न में यह सही है। –

+0

मानक 'रीडायरेक्ट व्यू' के लिए आप अलग-अलग 'बाहरी रीडायरेक्ट व्यू' को कैसे लागू करेंगे? – skaffman

उत्तर

2

अब यहाँ ऊपर मेरी टिप्पणी में योजना के अनुसार ExternalRedirectView है (कुकीज़ की आवश्यकता होती है एक विकल्प नहीं है।) ... यह उस तरह से किया था।

import java.io.IOException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.web.servlet.view.RedirectView; 

/** variant of RedirectView, will not add a session id to the url 
*/ 
public class ExternalRedirectView extends RedirectView { 
    public ExternalRedirectView(String url, boolean contextRelative) { 
     super(url, contextRelative); 
    } 

    /** copied from @link{RedirectView#sendRedirect} and removed calls to 
    * reponse.encodeRedirectURL() 
    */ 
    @Override 
    protected void sendRedirect(HttpServletRequest request, 
      HttpServletResponse response, String targetUrl, 
      boolean http10Compatible) throws IOException { 
     if (http10Compatible) { 
      // Always send status code 302. 
      response.sendRedirect(targetUrl); 
     } 
     else { 
      // Correct HTTP status code is 303, in particular for POST requests. 
      response.setStatus(303); 
      response.setHeader("Location", targetUrl); 
     } 
    } 
} 

मैं भी पहले से ही अपने ही ViewResolver जिसमें मैं नई externalRedirect के लिए कार्यक्षमता जोड़ा था: जादू Vier नाम उपसर्ग, जो अब पढ़ता है:

class MyViewResolver extends AbstractCachingViewResolver implements BeanFactoryAware { 
[...] 
    private static final String EXTERNAL_REDIRECT_URL_PREFIX = "externalRedirect:"; 
[...] 
    @Override 
    protected View loadView(String viewName, Locale locale) throws Exception { 
     View view; 
     if (viewName.startsWith(UrlBasedViewResolver.REDIRECT_URL_PREFIX)) 
     { 
      view = new RedirectView(viewName.substring(UrlBasedViewResolver.REDIRECT_URL_PREFIX.length()), true); 
     } 
     else if (viewName.startsWith(EXTERNAL_REDIRECT_URL_PREFIX)) 
     { 
      view = new ExternalRedirectView(viewName.substring(EXTERNAL_REDIRECT_URL_PREFIX.length()), true); 
     } 
     else 

[...] हर किसी के लिए धन्यवाद जिन्होंने इसे पढ़ा और इसके बारे में सोचा।

संबंधित मुद्दे