簡體   English   中英

如何使用標頭重定向使用ModelAndView

[英]How to redirect with header use ModelAndView

我想通過一些自定義標頭從一個控制器重定向到另一個。

SpringBoot 2.1.x

@Slf4j
@RestController
@RequestMapping("test")
public class TestController {

    @RequestMapping("t1")
    ModelAndView t1(HttpServletRequest request, HttpServletResponse response) {
        response.setHeader("token", "123");
        return new ModelAndView("redirect:/test/t2");
    }

    @ResponseBody
    @RequestMapping("t2")
    String t2(HttpServletRequest request, HttpServletResponse response) {
        return request.getHeader("token");
    }
}

我希望t2控制器返回由t1控制器設置的請求標頭。

無需在Spring中回答ModelAndView即可進行重定向。 例如,您可以使用狀態代碼302 Response

@RestController
@RequestMapping("test")
public class TestController {
    @RequestMapping("t1")
    Response t1() {
        return Response.found("/test/t2") // just double check how you create this url as it might be invalid
        .header("token","123")
        .build();
    }

    @ResponseBody
    @RequestMapping("t2")
    String t2(HttpServletRequest request) {
        return request.getHeader("token");
    }
}

但真正的問題是: 您打算如何實現?

讓用戶僅在兩次調用之間傳遞一個值,讓用戶從一個控制器跳到另一個控制器絕不是一個好主意。

如果要實現post-redirect-get-pattern:

處理重定向屬性的方法有三種:1.將Flash / model-attributes添加到RedirectAttributes 2.將請求參數(“動態”屬性)添加到RedirectAttributes 3.將請求參數(“動態”屬性)添加到RedirectView

我在以下獲取方法中結合了三種可能性。

@PostMapping("/redirectme")
public RedirectView redirectme(final RedirectAttributes redirectAttributes) {
    // the following attribute is a ModelAttribute
    redirectAttributes.addFlashAttribute("messageA", "A");
    final RedirectView redirectView = new RedirectView("/redirectedpage", true);
    // the following attributes are request-parameter (dynamic Attributes)
    redirectAttributes.addAttribute("messageB", "B");
    redirectView.getAttributesMap().put("messageC", "C");
    return redirectView;
}

@GetMapping("/redirectedpage")
public ModelAndView redirectedPage(
        // access FlashAttributes
        final Model model, @ModelAttribute("messageA") final String messageA,
        // access 'dynamic' Attributes
        @RequestParam("messageB") final String messageB, @RequestParam("messageC") final String messageC) {
    final ModelAndView modelAndView = new ModelAndView("red");
    modelAndView.addObject("caption", "App");
    // access FlashAttributes
    modelAndView.addObject("messageA_1", model.asMap().get("messageA"));
    modelAndView.addObject("messageA_2", messageA);
    // access 'dynamic' Attributes
    modelAndView.addObject("messageB", messageB);
    modelAndView.addObject("messageC", messageC);
    return modelAndView;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM