自动登录案例中因为过滤器中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();
}