繁体   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