Spring Controller中能否读取重定向URL对应的浏览器Cookie?
问题解答
首先要明确两个关键场景的Cookie区别:
- 你当前的Controller方法处理的是
/路径的请求,此时浏览器发送请求到你的服务器时,只会携带当前域名下已存在的Cookie,这些Cookie可以直接读取。 - 重定向到
https://www.somelocation.com后,该域名返回的Cookie是浏览器后续收到的,在当前这个Controller方法里完全无法读取——因为这个方法执行时,重定向还没发生,浏览器根本还没去请求目标地址,自然不会有目标域名的Cookie。
如何读取当前请求携带的Cookie
如果要读取浏览器发送到/路径请求时带来的Cookie,只需要在方法参数里添加HttpServletRequest request,然后通过request对象获取:
@RequestMapping(value = "/") public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException { // 读取当前请求的Cookie Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { System.out.println("Cookie名称:" + cookie.getName() + ",值:" + cookie.getValue()); } } response.sendRedirect("https://www.somelocation.com"); }
为什么拿不到重定向后的Cookie
重定向的本质是服务器返回一个3xx状态码,告诉浏览器去请求新的地址。整个流程是:
- 浏览器请求你的
/路径,携带当前域名Cookie - 你的Controller执行,返回重定向响应
- 浏览器收到响应后,才会去请求
https://www.somelocation.com - 目标服务器返回Cookie,浏览器保存
你的Controller方法在第2步就执行完了,此时第3、4步还没发生,所以不可能获取到目标域名的Cookie。如果需要获取目标域名的Cookie,只能通过前端页面(比如重定向后页面的JS)读取,再通过接口回传给你的服务器,或者在目标域名的服务里处理这些Cookie。
内容的提问来源于stack exchange,提问作者Monis Majeed
相关产品推荐
相关产品推荐

