【问题标题】:In spring mvc 3, how to write a cookie while returning a ModelAndView?在spring mvc 3中,如何在返回ModelAndView的同时编写cookie?
【发布时间】:2011-06-20 18:45:33
【问题描述】:

我的控制器方法返回一个ModelAndView,但还需要将一个cookie写回客户端。春天可以做吗?谢谢。

【问题讨论】:

    标签: spring-mvc spring-boot cookies


    【解决方案1】:

    如果您将响应作为参数添加到您的处理程序方法(请参阅flexible signatures of @RequestMapping annotated methods - 3.2.x4.0.x4.1.x4.3.x5.x.x 的同一部分),您可以 add the cookie 到直接回复:

    科特林

    @RequestMapping(["/example"])
    fun exampleHandler(response: HttpServletResponse): ModelAndView {
       response.addCookie(Cookie("COOKIENAME", "The cookie's value"))
       return ModelAndView("viewname")
    }
    

    Java

    @RequestMapping("/example")
    private ModelAndView exampleHandler(HttpServletResponse response) {
    
            response.addCookie(new Cookie("COOKIENAME", "The cookie's value"));
    
            return new ModelAndView("viewname");
    }
    

    【讨论】:

    • 如果要在请求之间共享cookie,有时需要调用`cookie.setPath("xxx");`。
    【解决方案2】:

    不是ModelAndView 的一部分,不,但您可以将add the cookie directly 传递给您的控制器方法的HttpServletResponse 对象。

    【讨论】:

      【解决方案3】:

      您可以编写一个HandlerInterceptor,它将从您的模型中获取所有 Cookie 实例并生成适当的 cookie 标头。这样你就可以让你的控制器保持干净并且不受HttpServletResponse的影响。

      @Component
      public class ModelCookieInterceptor extends HandlerInterceptorAdapter {
      
          @Override
          public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView modelAndView) throws Exception {
              if (modelAndView != null) {
                  for (Object value : modelAndView.getModel().values()) {
                      if (value instanceof Cookie)
                          res.addCookie((Cookie) value);
                  }
              }
          }
      
      }
      

      注意。不要忘记使用<mvc:interceptors>(XML 配置)或WebMvcConfigurer.addInterceptors()(Java 配置)注册拦截器。

      【讨论】:

      • 如果您想配置是否以 Cookie、Header、JSON 等形式返回数据并提供良好的关注点分离,这尤其有用。
      • 这似乎不起作用,我们可能需要 ControllerAdvice programmersought.com/article/57186340561
      【解决方案4】:

      RustyX 在 Java 8 中的解决方案:

      @Component
          public class ModelCookieInterceptor extends HandlerInterceptorAdapter {
      
              @Override
              public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView modelAndView) throws Exception{
                  if (modelAndView != null) {
                      modelAndView.getModel().values().stream()
                          .filter(c -> c instanceof Cookie)
                          .map(c -> (Cookie) c)
                          .forEach(res::addCookie);
                  }
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-20
        • 1970-01-01
        • 2021-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多