有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用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控制器设置的请求头


共 (2) 个答案

  1. # 1 楼答案

    如果要实现post重定向get模式:

    处理重定向属性有三种可能性 1.将flash/model属性添加到重定向属性 2.将请求参数(“动态”属性)添加到重定向属性 3.向重定向视图添加请求参数(“动态”属性)

    我在下面的get方法中结合了这三种可能性

    @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;
    }
    
  2. # 2 楼答案

    不需要在Spring中回答ModelAndView来重定向。您可以使用状态代码为302Responseasnwer,例如:

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

    但真正的问题是:你想用这个实现什么

    让用户从一个控制器跳到另一个控制器,只是为了在调用之间传递一个值,这从来都不是一个好主意