解决重定向cookie丢失或重复生成问题
什么是重定向
- 两次请求,两次响应
- 重定向不携带数据
- 重定向地址栏发生改变
什么是请求转发
- 一次请求,一次响应
- 转发需要携带数据
- 转发地址栏不会发生变化
如何使用
- 如果要保留请求域中的数据,使用转发,否则使用重定向。
- 以后访问数据库,增删改使用重定向,查询使用转发。
重定向与请求转发区别
1、转发使用的是getRequestDispatcher()方法;重定向使用的是sendRedirect();
2、转发:浏览器URL的地址栏不变。重定向:浏览器URL的地址栏改变;
3、转发是服务器行为,重定向是客户端行为;
4、转发是浏览器只做了一次访问请求。重定向是浏览器做了至少两次的访问请求;
5、转发2次跳转之间传输的信息不会丢失,重定向2次跳转之间传输的信息会丢失(request范围)。
如何解决重定向cookie丢失或重复生成
正是由于发生了两次请求和返回,所以第一次cookie与第二次cookie并不相同。
所以我们需要做的就是将第一次的请求与第二次请求的cookie设置为同一个。
方法1:
将第一次请求过来的cookie,设置到第一次返回Response中,这样第二次请求时,将会使用相同的cookie。以下是伪代码:
@GetMapping("/test")
public void test( HttpServletRequest request, HttpServletResponse response) {
try {
Cookie[] cookies = request.getCookies();
// 浏览器 若已访问过 该服务,将 请求携带过来的 原封不动返回 重定向 Response
if (ObjectUtil.isNotEmpty(cookies)) {
for (Cookie cookie : cookies) {
response.addCookie(cookie);
}
}
// 浏览器 第一次访问该服务,浏览器未生成cookie时, 将 sessionId 存储到 重定向 Response
// 可以根据实际情况 做一谢业务 逻辑 如 判断登录过没
if (ObjectUtil.isEmpty(cookies)) {
Cookie session = new Cookie("SESSION", request.getSession().getId());
response.addCookie(session);
}
} catch (Exception e) {
log.error("单点登入失败", e);
} finally {
try {
response.sendRedirect("/");
} catch (Exception e) {
log.error("重定向失败", e);
}
}
}
方法2:
通过设置同一个域domain、访问路径path,使得第二次不重新生成cookie。
Cookie cookie = new Cookie("token", xxxxxxxxxx);
cookie.setDomain("localhost");
cookie.setPath("/");
httpServletResponse.addCookie(cookie);