解决重定向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);
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳宗德

您的鼓励是我进步的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值