先说下问题:
1、客户端访问的时候,有时候没带指定的cookie。
这个是网上找到的path取值规则:
当cookie的path设置了值不为null的时候,以设置的值为准。
当cookie的path为null时候,获取请求的URI的path值
当URI的path值是以“/”结尾的时候,直接设置为cookie的path值
当URI的path值不是以“/”结尾的时候,查看path里面是否有“/”
如果有“/”的话,直接截取到最后一个“/”,然后设置为cookie的path值。
如果没有“/”的话,将cookie的path设置为”/”。
在本例中,因为是在请求servlet/loginServlet的时候,在LoginServlet这个servlet中设置的Cookie cookie = new Cookie("autologin", username+"|"+password);,如果cookie没有设置cookie.setPath("/");则只有当请求servlet/loginServlet的时候才会带上autologin这个cookie。
2、客户端关闭后,session数据取不到。
这个是因为,当服务端执行request.getSession()的时候,会向客户端写入一个名称为JSESSIONID的Cookie,但是这个JSESSIONID没有设置有效时间maxAge,所以默认有效期是浏览器内存。当浏览器关闭在重新打开的时候,原来的JSESSIONID已经不见了,当服务端再次执行reqeust.getSession的时候,会向客户端写入一个新的JSESSIONID;
测试cookie不设置setPath()
Cookie cookie = new Cookie("autologin", username+"|"+password);
cookie.setMaxAge(60*3);
response.addCookie(cookie);
测试场景:首先访问login.jsp,勾选“自动登录”执行登录操作,这样会访问/servlet/loginServlet,设置autologin这个cookie。
关闭浏览器,观察各个访问路径是否携带autologin这个cookie。
1、http://localhost:8999/index.jsp 没有携带autologin
2:http://localhost:8999/login.jsp 没有携带autologin
3:http://localhost:8999/servlet/loginServlet 携带autologin
测试设置path为 / 的情况:
1、http://localhost:8999/index.jsp 携带autologin
Cookie cookie = new Cookie("autologin", username+"|"+password);
cookie.setMaxAge(60*3);
/*
* 如果不设置Path,则只有请求LoginServlet的时候才会带上autologin这个cookie
* 即请求 servlet/loginServlet
*/
cookie.setPath("/");
response.addCookie(cookie);
测试场景:首先访问login.jsp,勾选“自动登录”执行登录操作,这样会访问/servlet/loginServlet,设置autologin这个cookie。
关闭浏览器,观察各个访问路径是否携带autologin这个cookie。
2:http://localhost:8999/login.jsp 携带autologin
3:http://localhost:8999/servlet/loginServlet 携带autologin
最后附上代码:
login.jsp
<form action="servlet/loginServlet" method="post">
用户名:<input type="text" name="username" value="${param.username}"><br>
密码:<input type="password" name="password" value="${param.password }"><br>
自动登录:<input type="checkbox" name="autologin" ><br>
<input type="submit" value="提交">
</form>
index.jsp
<body>
欢迎${sessionScope.user.username }登陆!!!!!
</body>
LoginServlet:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String autologin = request.getParameter("autologin");
System.out.println(autologin);
User user = null;
if("zhangsan".equals(username) && "12345".equals(password)){
user = new User();
user.setUsername(username);
user.setPassword(password);
}
if(user!=null){
HttpSession session = request.getSession();
session.setAttribute("user", user);
//设置 JSESSIONID 的有效期,否则关闭浏览器后JSESSIONID就失效了
Cookie jsessionidCookie = new Cookie("JSESSIONID", session.getId());
jsessionidCookie.setMaxAge(60*2);//2分钟有效
jsessionidCookie.setPath("/");
response.addCookie(jsessionidCookie);
if("on".equals(autologin)){
Cookie cookie = new Cookie("autologin", username+"|"+password);
cookie.setMaxAge(60*3);
/*
* 如果不设置Path,则只有请求LoginServlet的时候才会带上autologin这个cookie
* 即请求 servlet/loginServlet
*/
cookie.setPath("/");
response.addCookie(cookie);
}else{
Cookie cookie = new Cookie("autologin",null);
cookie.setMaxAge(0);
response.addCookie(cookie);
}
response.sendRedirect("/index.jsp");
}else{
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
过滤器AutoLoginFilter:
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = null;
HttpServletResponse response = null;
try {
request = (HttpServletRequest)req;
response = (HttpServletResponse)resp;
} catch (Exception e) {
throw new RuntimeException("no http reqeust or response");
}
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
//设置 JSESSIONID 的有效期
Cookie jsessionidCookie = new Cookie("JSESSIONID", session.getId());
jsessionidCookie.setMaxAge(60*2);//2分钟有效
jsessionidCookie.setPath("/");
response.addCookie(jsessionidCookie);
if(user!=null){
session.setAttribute("user", user);
chain.doFilter(request, response);
}else{
Cookie[] cookies = request.getCookies();
Cookie cookie = CookieUtils.findCookieByName(cookies, "autologin");
if(cookie!=null){
String path = cookie.getPath();
System.out.println("autologin的path为:"+path);
String value = cookie.getValue();
//对于特殊的分割符号,要加 \\ 进行转译
String[] split = value.split("\\|");
String username = split[0];
String password = split[1];
User cookieuser = null;
if("zhangsan".equals(username) && "12345".equals(password)){
cookieuser = new User();
cookieuser.setUsername(username);
cookieuser.setPassword(password);
}
if(cookieuser!=null){
session.setAttribute("user", cookieuser);
}
chain.doFilter(request, response);
}else{
chain.doFilter(request, response);
}
}
}