java - 在spring mvc中按名称获取cookie值

ham*_*med 38 java cookies spring-mvc

我正在研究一个java spring mvc应用程序.我用这种方式在我的一个控制器方法中设置了一个cookie:

@RequestMapping(value = {"/news"}, method = RequestMethod.GET)
public ModelAndView news(Locale locale, Model model, HttpServletResponse response, HttpServletRequest request) throws Exception {

    ...
    response.setHeader("Set-Cookie", "test=value; Path=/");
    ...

    modelAndView.setViewName("path/to/my/view");
    return modelAndView;
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,我可以test在浏览器控制台中看到名称和值为"value" 的cookie .现在我想在其他方法中按名称获取cookie值.我怎样才能获得testcookie的价值?

mes*_*azs 79

最简单的方法是在带有@CookieValue注释的控制器中使用它:

@RequestMapping("/hello")
public String hello(@CookieValue("foo") String fooCookie) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

否则,您可以使用Spring从servlet请求中获取它 org.springframework.web.util.WebUtils

WebUtils.getCookie(HttpServletRequest request, String cookieName)
Run Code Online (Sandbox Code Playgroud)

顺便说一下,粘贴到问题中的代码可以稍微改进一下.而不是使用#setHeader(),这更优雅:

response.addCookie(new Cookie("test", "value"));
Run Code Online (Sandbox Code Playgroud)

  • 您可能希望在@CookieValue批注上添加“ required = false”,以避免得到400 Bad Request。 (2认同)

rya*_*anp 9

你也可以使用org.springframework.web.util.WebUtils.getCookie(HttpServletRequest, String).


Pad*_*adi 6

private String extractCookie(HttpServletRequest req) {
            for (Cookie c : req.getCookies()) {
               if (c.getName().equals("myCookie"))
                   return c.getValue();
               }
            return null;
        }
Run Code Online (Sandbox Code Playgroud)


ott*_*der 6

private String getCookieValue(HttpServletRequest req, String cookieName) {
    return Arrays.stream(req.getCookies())
            .filter(c -> c.getName().equals(cookieName))
            .findFirst()
            .map(Cookie::getValue)
            .orElse(null);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果cookies为null,则发生null异常 (4认同)

bek*_*kce 5

Spring MVC 已经为您提供了该HttpServletRequest对象,它有一个getCookies()返回的方法Cookie[],因此您可以对其进行迭代。

  • 还有别的办法吗?我不想遍历 cookie 数组,因为那是一个很大的数组。 (2认同)
  • 即使您不手动迭代它,框架也会为您完成它,因为 cookie 存储在单个字符串中。 (2认同)