在Spring MVC 3.1中缺少POST上的set-cookie头

时间:2014-03-19 20:32:35

标签: spring-mvc post cookies

在$ .ajax POST调用期间添加到HttpServletResponse的Cookie没有出现在响应头中(没有set-cookie)。在GET请求期间,相同的代码可以正常运行。

我在拦截器postHandle中有以下代码:

public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView modelAndView) throws Exception {
.
.
            Cookie cookie = new Cookie(User.USER_KEY, userAsJson);
            LOGGER.info("Cookie json is: " + userAsJson);
            cookie.setPath("/");
            response.addCookie(cookie);
            LOGGER.info("Header names: " + response.getHeaderNames());
            LOGGER.info("Set-cookie header(s): " + response.getHeaders("Set-Cookie"));
}

从请求返回到此映射时,我看到了这个问题:

@RequestMapping(value = "/api/user/wait", method = RequestMethod.POST)
@ResponseBody
public User waitingApi(HttpSession session) {

Ajax调用参数:

    var ajaxMessage = {
        url : '/api/user/wait',
        type : 'POST',
        success : waitCallback,
        error : waitErrorCallback
    };

在GET上,我在日志中看到以下内容:

  

Cookie json是:{my valid json object}

     

标题名称:[Set-Cookie]

     

Set-cookie标头:[user =“{my valid json object}”;版本= 1;   路径= /]

在POST上,我在日志中看到以下内容:

  

Cookie json是:{my valid json object}

     

标题名称:[内容类型,传输编码,日期,服务器]

     

Set-cookie标题:[]< ---这是空的,没有编辑

2 个答案:

答案 0 :(得分:2)

在谷歌花了很多时间后,我发现这篇文章: http://mjremijan.blogspot.ca/2012/06/spring-not-setting-cookie-on-ajax.html

简而言之,当请求到达具有注释@ResponseBody的操作时,postHandle拦截器不会执行任何操作。您可以通过将响应对象添加到操作参数并在操作中调用addCookie来在操作方法中设置cookie。

答案 1 :(得分:0)

postHandleafterCompletion方法中,它都检查响应是否已提交。两种情况都太晚了,无法添加cookie。 将Cookie放在preHandle内,一切就好。