【问题标题】:java - get cookie value by name in spring mvcjava - 在spring mvc中按名称获取cookie值
【发布时间】:2016-01-12 03:05:52
【问题描述】:

我正在开发一个 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;
}

这工作正常,我可以在我的浏览器控制台中看到一个名为 test 和值“值”的 cookie。现在我想在其他方法中按名称获取 cookie 值。如何获得test cookie 的值?

【问题讨论】:

  • 您应该接受 meskobalazs 或 ryanp 的回答。
  • 你真的应该接受@Frans所说的答案,它可以帮助其他有同样问题的人找到正确的答案

标签: java spring-mvc cookies


【解决方案1】:

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

【讨论】:

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

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

@RequestMapping("/hello")
public String hello(@CookieValue("foo") String fooCookie) {
    // ...
}

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

WebUtils.getCookie(HttpServletRequest request, String cookieName)

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

response.addCookie(new Cookie("test", "value"));

【讨论】:

  • 您可能希望在 @CookieValue 注释上添加“required = false”以避免收到 400 Bad Request。
  • @evandor 有没有办法捕获 400 空响应并返回其他内容。这仍然是 400,但不会为空。类似于 @GlobalExceptionHandler 所做的事情
  • @kerw 我正在为此添加一个请求过滤器。
  • 你也可以用defaultValue="yourDeafultValue"代替"required = false"
【解决方案3】:

Cookie 没有按值获取的方法试试这个

Cookie cookie[]=request.getCookies();
Cookie cook;
String uname="",pass="";
if (cookie != null) {
for (int i = 0; i < cookie.length; i++) {
    cook = cookie[i];
    if(cook.getName().equalsIgnoreCase("loginPayrollUserName"))
            uname=cook.getValue();
    if(cook.getName().equalsIgnoreCase("loginPayrollPassword"))
            pass=cook.getValue();                   
}    
}

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:
      private String extractCookie(HttpServletRequest req) {
                  for (Cookie c : req.getCookies()) {
                     if (c.getName().equals("myCookie"))
                         return c.getValue();
                     }
                  return null;
              }
      

      【讨论】:

        【解决方案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);
        }
        

        【讨论】:

        • 如果cookies为空,则发生空异常
        • 抛出异常而不是抛出 null。 .orElseThrow(UnAuthorizedException::new)
        猜你喜欢
        • 2012-05-30
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        • 2014-05-13
        • 2018-05-06
        • 1970-01-01
        • 2011-05-05
        相关资源
        最近更新 更多