स्प्रिंग एमवीसी में नियंत्रक कार्रवाई से एक बाहरी URL पर पुनर्निर्देशित करें


118

मैंने देखा है कि निम्नलिखित कोड उपयोगकर्ता को परियोजना के अंदर एक URL पर पुनर्निर्देशित कर रहा है,

@RequestMapping(method = RequestMethod.POST)
public String processForm(HttpServletRequest request, LoginForm loginForm, 
                          BindingResult result, ModelMap model) 
{
    String redirectUrl = "yahoo.com";
    return "redirect:" + redirectUrl;
}

जबकि, निम्नलिखित का उद्देश्य के अनुसार ठीक से पुनर्निर्देशन है, लेकिन इसके लिए http: // या https: // की आवश्यकता है

@RequestMapping(method = RequestMethod.POST)
    public String processForm(HttpServletRequest request, LoginForm loginForm, 
                              BindingResult result, ModelMap model) 
    {
        String redirectUrl = "http://www.yahoo.com";
        return "redirect:" + redirectUrl;
    }

मैं निर्दिष्ट URL पर रीडायरेक्ट हमेशा अनुप्रेषित करना चाहता हूं, चाहे उसमें कोई मान्य प्रोटोकॉल हो या नहीं और किसी दृश्य को पुनर्निर्देशित नहीं करना चाहता। मैं उसे कैसे कर सकता हूँ?

धन्यवाद,

जवाबों:


208

आप इसे दो तरीकों से कर सकते हैं।

प्रथम:

@RequestMapping(value = "/redirect", method = RequestMethod.GET)
public void method(HttpServletResponse httpServletResponse) {
    httpServletResponse.setHeader("Location", projectUrl);
    httpServletResponse.setStatus(302);
}

दूसरा:

@RequestMapping(value = "/redirect", method = RequestMethod.GET)
public ModelAndView method() {
    return new ModelAndView("redirect:" + projectUrl);
}

19
यह और भी सरल है यदि आप सीधे स्ट्रींग वापस करते हैं तो मॉडलएंड व्यू।
daniel.eichten 8

24
ऐसा लगता है कि पहली विधि में आपको 302 पर रिटर्न कोड सेट करना चाहिए। अन्यथा एक सर्वर 200 कोड और लोकेशन हेडर के साथ एक प्रतिक्रिया देगा, जो मेरे मामले (फ़ायरफ़ॉक्स 41.0) में पुनर्निर्देशित नहीं करता है।
इवान मुश्तिलक

क्या हम बाह्य URL पर पुनर्निर्देशित के दौरान कुकीज़ भी जोड़ सकते हैं।
श्रीकर

1
पहली विधि की आवश्यकता है@ResponseStatus(HttpStatus.FOUND)
लैपक्रिटिनिस

@Rinat Mukhamedgaliev इस ModelAndView में ("पुनर्निर्देशित:" + प्रोजेक्टउल); कथन जो कुंजी के रूप में लिया जाएगा डिफ़ॉल्ट रूप में लिया जाएगा, अगर जोड़ा गया मूल्य है?
जावा

56

आप उपयोग कर सकते हैं RedirectViewJavaDoc से कॉपी किया गया :

यह देखें कि एक निरपेक्ष, संदर्भ सापेक्ष या वर्तमान अनुरोध सापेक्ष URL पर रीडायरेक्ट होता है

उदाहरण:

@RequestMapping("/to-be-redirected")
public RedirectView localRedirect() {
    RedirectView redirectView = new RedirectView();
    redirectView.setUrl("http://www.yahoo.com");
    return redirectView;
}

तुम भी एक का उपयोग कर सकते हैं ResponseEntity, जैसे

@RequestMapping("/to-be-redirected")
public ResponseEntity<Object> redirectToExternalUrl() throws URISyntaxException {
    URI yahoo = new URI("http://www.yahoo.com");
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setLocation(yahoo);
    return new ResponseEntity<>(httpHeaders, HttpStatus.SEE_OTHER);
}

और हां, redirect:http://www.yahoo.comदूसरों के बताए अनुसार लौटें ।


रीडायरेक्ट व्यू वही था जो मेरे लिए काम करता था!
जेम्स111

मैं एक अजीब व्यवहार कर रहा हूँ wiwth रीडायरेक्ट देखें, webshpere पर मुझे मिल रहा है: [कोड] [27/04/17 13: 45: 55: 385 CDT] 00001303 webapp E com.ibm.ws .webcontainer.webapp.WebApp logServletError SRVE0293E [[त्रुटि de सर्वलेट] - [DispatcherPrincipal]: java.io.IOException: पैटर्न को mx.isban.security.computers.ecOutputFilter $ Wrapper.sececured.sendRedirect (SecOutputFilter.java:234) पर jaxaxax.com पर jaxaxx में स्थापित करने की अनुमति नहीं है। sendRedirect (HttpServletResponseWrapper.java:145) [कोड]
कार्लोस डे लूना

49

UrlBasedViewResolol और RedirectView के वास्तविक कार्यान्वयन को देखते हुए रीडायरेक्ट हमेशा संदर्भ होगा यदि आपका रीडायरेक्ट लक्ष्य / के साथ प्रारंभ होता है। इसलिए एक //yahoo.com/path/to/resource भेजने से प्रोटोकॉल रिडायरेक्ट होने में मदद नहीं मिलेगी।

इसलिए आप जो हासिल करना चाह रहे हैं उसे हासिल करने के लिए कुछ ऐसा कर सकते हैं:

@RequestMapping(method = RequestMethod.POST)
public String processForm(HttpServletRequest request, LoginForm loginForm, 
                          BindingResult result, ModelMap model) 
{
    String redirectUrl = request.getScheme() + "://www.yahoo.com";
    return "redirect:" + redirectUrl;
}

लेकिन इस तरह से पुनर्निर्देशन एक GET है या क्या यह एक POST है? मैं POST के रूप में पुनर्निर्देशित कैसे करूँ?
अकोलातिवो

वास्तव में प्रति डिफ़ॉल्ट यह एक 302 लौटा रहा है जिसका अर्थ है कि इसे प्रदान किए गए url के खिलाफ GET जारी करना चाहिए। उसी विधि को रखते हुए पुनर्निर्देशन के लिए आपको एक अलग कोड (HTTP / 1.1 के रूप में 307) भी निर्धारित करना चाहिए। लेकिन मुझे पूरा यकीन है कि अगर यह सुरक्षा मुद्दों के कारण एक अलग होस्ट / पोर्ट-संयोजन का उपयोग करके पूर्ण पते के खिलाफ जा रहा है, तो ब्राउज़र इसे ब्लॉक करेगा।
daniel.eichten

26

इसका एक और तरीका यह है कि आप इस sendRedirectविधि का उपयोग करें :

@RequestMapping(
    value = "/",
    method = RequestMethod.GET)
public void redirectToTwitter(HttpServletResponse httpServletResponse) throws IOException {
    httpServletResponse.sendRedirect("https://twitter.com");
}

22

आप इस तरह का उपयोग कर सुंदर तरीके से कर सकते ResponseEntityहैं:

  @GetMapping
  ResponseEntity<Void> redirect() {
    return ResponseEntity.status(HttpStatus.FOUND)
        .location(URI.create("http://www.yahoo.com"))
        .build();
  }

1
यह स्वीकृत उत्तर होना चाहिए। स्थापित करने और उपयोग करने के लिए बेहद आसान है।
21

9

मेरे लिए ठीक काम करता है:

@RequestMapping (value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<Object> redirectToExternalUrl() throws URISyntaxException {
    URI uri = new URI("http://www.google.com");
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setLocation(uri);
    return new ResponseEntity<>(httpHeaders, HttpStatus.SEE_OTHER);
}

मुझे लगता है कि यह तरीका RedirectView से बेहतर है क्योंकि यह पोस्टमैन में भी काम कर रहा है।
मेहदी मोहम्मदी

8

बाहरी यूआरएल के लिए आपको " http://www.yahoo.com " का उपयोग रीडायरेक्ट यूआरएल के रूप में करना होगा।

इसे रीडायरेक्ट में समझाया गया है : स्प्रिंग संदर्भ दस्तावेज का उपसर्ग

अनुप्रेषित: / MyApp / कुछ / संसाधन

वर्तमान सर्वलेट संदर्भ के सापेक्ष पुनर्निर्देशित करेगा, जबकि एक नाम जैसे

रीडायरेक्ट: http://myhost.com/some/arbiteath/path

निरपेक्ष URL पर पुनर्निर्देशित करेगा


3

क्या आपने रिडायरेक्ट व्यू की कोशिश की जहां आप संदर्भ प्रदान कर सकते हैं।


यह पैरामीटर उन रास्तों के लिए उपयोगी है, जो शुरू करते हैं (या नहीं) /यह जांचने के लिए कि क्या यह वेब के संदर्भ के सापेक्ष होना चाहिए। पुनर्निर्देशित अनुरोध अभी भी उसी होस्ट के लिए होगा।
सोथिरियोस डेलिमोनोलिस

-2

संक्षेप में "redirect://yahoo.com"आपको उधार देगाyahoo.com

के रूप में "redirect:yahoo.com"आप के your-context/yahoo.comलिए उधार दे देंगे, जहां पूर्व-localhost:8080/yahoo.com


दोनों समाधानों में एक ही कमांड है: "संक्षेप में" पुनर्निर्देशित: yahoo.com "बनाम" जहां "पुनर्निर्देशित: yahoo.com" के रूप में, और केवल रिश्तेदार यूआरएल पुनर्निर्देशन काम कर रहा है।
partizanos
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.