স্প্রিং এমভিসিতে নিয়ামক পদক্ষেপ থেকে বাহ্যিক 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
এটি আরও সহজ যদি আপনি সরাসরি কোনও স্ট্রিং না দিয়ে মডেলএন্ডভিউতে ফিরে যান ler
daniel.eichten 5'15

24
দেখে মনে হচ্ছে প্রথম পদ্ধতিতে আপনার রিটার্ন কোডটি 302 এ সেট করা উচিত। অন্যথায় কোনও সার্ভার কোড 200 এবং লোকেশন শিরোনাম সহ প্রতিক্রিয়া ফিরিয়ে আনবে যা আমার ক্ষেত্রে পুনর্নির্দেশের কারণ নয় (ফায়ারফক্স ৪১.০)।
ইভান মুশকেটিক

বাহ্যিক URL- এ পুনঃনির্দেশের সময় আমরা কী কুকি যুক্ত করতে পারি?
শ্রীকার 0

1
প্রথম পদ্ধতির প্রয়োজন@ResponseStatus(HttpStatus.FOUND)
ল্যাপ্রক্রিটিনিস

@ রিনাত মুখমাদেগিয়েভ এই মডেলএন্ডভিউতে ("পুনর্নির্দেশ:" + প্রকল্প ইউআরএল); বিবৃতি কী হবে তা ডিফল্ট হিসাবে নেওয়া হবে, যদি যুক্ত জিনিসটির মান হয়?
জাভা

56

আপনি ব্যবহার করতে পারেন RedirectView। থেকে অনুলিপি JavaDoc :

একটি নিরঙ্কুশ, প্রাসঙ্গিক আপেক্ষিক, বা বর্তমান অনুরোধ সম্পর্কিত আপেক্ষিক 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

আমি পুনর্নির্দেশ দর্শনের সাথে আমার স্ত্রীর আচরণ করছি, ওয়েবশপেরে আমি পাচ্ছি: [কোড] [27/04/17 13: 45: 55: 385 সিডিটি] 00001303 ওয়েবঅ্যাপ ই com.ibm.ws.webcontainer.webapp.Webapp লগ সার্ভেরিটর SRVE0293E : [ত্রুটি ডি সার্লেট] - [ডিসপ্যাচারপ্রিন্সিপাল]: java.io.IOException: প্যাটার্নটি mx.isban.sec সুরক্ষা.com অংশগুলিতে অনুমোদিত নয়।সেকআউটপুট ফিল্টার $ WrapperRsSecured.sendRedirect (SecOutputFilter.java حقونو34) javax.servletSplet.plp.plp.plp.plp.plp.plp.plp.plp.plp.plp.plp.plp.plp.plp.plp.plp.plp.png এ। প্রেরণরেডিট্রেট করুন (এইচটিটিপি সার্ভেলরেপ্প্রেস র্যাপার্স.জভা অনুগ্রহ) [কোড]
কার্লোস ডি লুনা সেনজ

49

আরলবাসেডভিউ রিসোলভার এবং রিডাইরেক্টভিউয়ের প্রকৃত বাস্তবায়নের দিকে নজর দেওয়া আপনার পুনঃনির্দেশ লক্ষ্যটি / দিয়ে শুরু হলে পুনঃনির্দেশ সর্বদা প্রাসঙ্গিক হবে। সুতরাং একটি //yahoo.com / পাথ / টো / রিসোর্স প্রেরণ প্রোটোকলের আপেক্ষিক পুনর্নির্দেশ পেতে সহায়তা করবে না।

সুতরাং আপনি যা চেষ্টা করছেন তা অর্জন করতে আপনি যেমন কিছু করতে পারেন:

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

তবে এইভাবে পুনর্নির্দেশটি জিইটি হয় বা এটি কোনও পোস্টে থেকে যায়? আমি কীভাবে পোস্ট হিসাবে পুনঃনির্দেশ করব?
অ্যাকোল্লাটিভো

ভাল আসলে ডিফল্ট হিসাবে এটি 302 ফিরিয়ে দিচ্ছে যার অর্থ এটি প্রদত্ত ইউআরএলটির বিরুদ্ধে একটি জিইটি জারি করা উচিত। একই পদ্ধতি রক্ষায় পুনঃনির্দেশের জন্য আপনাকে আলাদা কোড (HTTP / 1.1 হিসাবে 307) সেট করা উচিত। তবে আমি নিশ্চিত যে সুরক্ষার সমস্যার কারণে কোনও ভিন্ন হোস্ট / পোর্ট-সংমিশ্রণটি ব্যবহার করে যদি এটি কোনও নিখুঁত ঠিকানার বিরুদ্ধে চলে তবে ব্রাউজারগুলি এটি ব্লক করবে will
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
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। সেটআপ এবং ব্যবহার করা অত্যন্ত সহজ।
সাইবারবিট

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

আমি মনে করি এই পদ্ধতিটি রিডাইরেক্টভিউয়ের চেয়ে ভাল কারণ এটি পোস্টম্যানেও কাজ করছে।
মেহেদী মোহাম্মদী

8

বাহ্যিক url এর জন্য আপনাকে " http://www.yahoo.com " ব্যবহার করতে হবে পুনঃনির্দেশ url হিসাবে।

এটি পুনর্নির্দেশে ব্যাখ্যা করা হয়েছে : স্প্রিং রেফারেন্স ডকুমেন্টেশনের উপসর্গ

পুনর্নির্দেশ: / myapp / কিছু / রিসোর্স

বর্তমান সার্লেট প্রসঙ্গে তুলনামূলক পুনঃনির্দেশিত করবে, যখন একটি নাম যেমন

পুনঃনির্দেশ: http://myhost.com/some/arbitrary/path

একটি নিখুঁত URL এ পুনঃনির্দেশ করা হবে


3

আপনি কি প্রাসঙ্গিক রিলেটিভ প্যারামিটারটি সরবরাহ করতে পারবেন এমন পুনর্নির্দেশের ভিউ চেষ্টা করেছিলেন?


সেই প্যারামিটারটি /ওয়েবপৃষ্ঠার প্রসঙ্গে তুলনামূলক হওয়া উচিত কিনা তা পরীক্ষা করতে যে পথগুলি শুরু হয় (বা না) এর জন্য দরকারী । পুনর্নির্দেশ অনুরোধটি এখনও একই হোস্টের জন্য থাকবে।
সোতিরিওস ডেলিমনোলিস

-2

সংক্ষেপে "redirect://yahoo.com"আপনি ndণ দেবে yahoo.com

যেখানে "redirect:yahoo.com"আপনাকে your-context/yahoo.comleণ দেবে যেমন প্রাক্তনlocalhost:8080/yahoo.com


উভয় সমাধানের একই কমান্ড রয়েছে: "সংক্ষেপে" পুনর্নির্দেশ: yahoo.com "বনাম" যেখানে "পুনর্নির্দেশ: ইয়াহু ডট কম" হিসাবে রয়েছে এবং কেবল সম্পর্কিত ইউআরএল পুনঃনির্দেশ কাজ করছে।
partizanos
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.