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

Posted

技术标签:

【中文标题】java - 在spring mvc中按名称获取cookie值【英文标题】:java - get cookie value by name in spring mvc 【发布时间】: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所说的答案,它可以帮助其他有同样问题的人找到正确的答案 【参考方案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)

以上是关于java - 在spring mvc中按名称获取cookie值的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC @CookieValue注解

JAVA spring MVC 前台如何取得后台返回的map类型的数据?

使用spring MVC重新加载弹出页面

Spring MVC方法参数注入

Java-24-Spring-10-2-Spring MVC知识点整理

在 UIAutomation 中从 UIAElementArray 中按名称获取元素时遇到问题