自动登录案例中因为过滤器中Cookie名称与Servlet里Cookie名称编写不一致而引出的问题

自动登录案例中因为过滤器中Cookie名称与Servlet里Cookie名称编写不一致而引出的问题

因为Cookie名称前后不一致而引出的对Cookie思考。
如下图:
在这里插入图片描述

这里就是我的编写错误,一开始在LoginServlet里创建Cookie时,把 name 写成了这样:
首次编写时的错误

而在过滤器AutoLoginFilter里对cookie获取时的 name 写成了这样:
接下的编写没有按照前面的名称来规范名字
因为前后Cookie名称不一致,所以导致了,自动登录实现不了。最后发现问题之后,将 name 统一修正为 auto_login 后,还是不能通过Cookie实现自动登录。之后查看了本地的Cookie发现 name 没有被修正,一直都是刚开的那个由于失误编写错误的 name
在这里插入图片描述
最后的解决,是把 所有 name 全部修正为刚开始编写错误的那个 name。

通过这个错误,给出了其他的思考。
为什么在修正了Cookie的 name 后,本地浏览器里的 name 还是没有变化?
首先想到的原因,可能是因为Cookie是服务器发送给本地客户端的一个小数据包,难道是在本地的原因吗?
还有为什么在第一次修正 name为( auto_login )原因仍旧没有解决后,去清除了Cookie,代码如下:

  Cookie cookie = new Cookie("auto_loin","");
                   cookie.setMaxAge(0);  
                    cookie.setPath("/AutoLoginDemo");
                    response.addCookie(cookie);

但是,却清除不了呢?
这个问题是否与getSession()有关?

 //LoginServlet  --> doGet 部分代码块`
 request.getSession().setAttribute("userBean",userBean1);

//AutoLoginFilter部分代码块`。
 UserBean userBean  = (UserBean) request.getSession().getAttribute("userBean");

核心代码如下:

下面展示是 AutoLoginFilter代码块

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        //先判断,现在session 中还有没有那个userBean. 
        UserBean userBean  = (UserBean) request.getSession().getAttribute("userBean");
        //还有,有效
        if (userBean != null){
            chain.doFilter(req,resp);
        }else {
            //代表session 失效
            //2,看 cookie
            //1,来请求的时候,先从请求里面取出cookie, 但是 cookie 有跟多的 key-value
            Cookie[] cookies = request.getCookies();
            //2,从一堆的cookie 里面找出我们以前给浏览器发的那个cookie
            Cookie cookies1 = CookieUtil.findCookie(cookies,"auto_login");
            //第一次来
            if (cookies1 == null){
                chain.doFilter(request,resp);
            }else {
                //不是第一次来
                String value = cookies1.getValue();
                String username =  value.split("#")[0];
                String password =  value.split("#")[1];
                //完成登录
                UserBean user = new UserBean();
                user.setUsername(username);
                user.setPassword(password);
                UserDao userDao = new UserDaoImpl();
                try {
                    userBean = userDao.login(user);
                    //使用session 存这个值到域中,方便下次未过期前还可以用
                    request.getSession().setAttribute("userBean",userBean);
                    chain.doFilter(request,resp);
                } catch (SQLException e) {
                    e.printStackTrace();
                    chain.doFilter(req,resp);
                }
            }
        }
    }

下面展示是 LoginServlet --> doGet 部分代码块

try {
            UserBean userBean1 = userDao.login(userBean);
            if (userBean1 != null){
                System.out.println("校验成功,用户存在");
                //页面提交上来的时候,是否选择自动登录
                if ("on".equals(auto_login)){
                    System.out.println("自动登录打开");
                    //发送 cookie 给客户端
                     Cookie cookie = new Cookie("auto_loin",username+"#"+password);
                     cookie.setMaxAge(60*60*24*7);  //7天有效期
                    cookie.setPath("/AutoLoginDemo");
                    response.addCookie(cookie);
                }
                request.getSession().setAttribute("userBean",userBean1);
                request.getRequestDispatcher("index.jsp").forward(request,response);
            }else {
                //不成功
                request.getRequestDispatcher("login.jsp").forward(request,response);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值