1.会话的概念(打开一个浏览器访问各页面直至关闭此浏览器的过程)-------------->用于保存用户数据
用户购买商品过程:
Cookie使用:创建Cookie对象(名称-->值),通过response的addCookie方法带给浏览器.用户下次带Cookie过来,通过request获取Cookie,这里getCookies获取所有的Cookie.
setMaxAge使用:如果不设置,Cookie默认有效期是浏览器进程,一次会话关闭浏览器,Cookie即消失。如果设置,则把Cookie写入本地硬盘。
setPath:有效目录,默认是设置该Cookie的Servlet所在目录。
setDomain:设置域------->实际无效,其他网站不会接受你的第三方Cookie(浏览器默认也会阻止该Cookie)
应用:显示用户上次访问时间--->每次访问根据Cookie获取上次访问时间,每次又都要把本次访问时间通过Cookie回写给浏览器
代码:
package cn.itcast.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SessionCookieServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
out.print("您上次访问时间是:");
//获得用户的时间Cookie
//得到的是一个Cookie数组
Cookie cookies[]=request.getCookies();
//一定要严谨!用户第一次没有带Cookie过来!
for(int i=0;cookies!=null && i<cookies.length;i++){//不为空判断写在前面,短路判断,如果为空不判断第二个条件,保证安全!
//找到这个名字的Cookie
if(cookies[i].getName().equals("lastAccessTime")){
long cookieValue=Long.parseLong(cookies[i].getValue());//转成毫秒值,为long类型
Date date=new Date(cookieValue);
out.print(date.toLocaleString());
}
}
//给用户回送最新访问时间
//创建Cookie对象
Cookie cookie=new Cookie("lastAccessTime",System.currentTimeMillis()+"");//注意System.currentTimeMillis()是long值,转字符串加""
//设置有效期
cookie.setMaxAge(1*30*24*3600);
cookie.setPath("/practice_servlet");//该应用下所有的资源
response.addCookie(cookie);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Cookie细节:
清除Cookie:只要回写一个同名Cookie,最大时效设为0,则浏览器收到后会自动删除该Cookie.
代码:
SessionCookieServlet中添加:
out.print("<a href='/practice_servlet/servlet/ClearCookie'>清除访问时间</a><br/>");
ClearCookie页面:
package cn.itcast.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ClearCookie extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Cookie cookie=new Cookie("lastAccessTime",System.currentTimeMillis()+"");
cookie.setMaxAge(0);
//注意有效路径也要设置一致!
cookie.setPath("/practice_servlet");
response.addCookie(cookie);
//!!注意:sendRedirect是response的方法!!以响应的方式通知浏览器重定向!!浏览器访问
//需要加上应用的路径!!
//这里重定向访问SessionCookieServlet页面后则又创建了一个Cookie,见上方SessionCookieServlet代码
response.sendRedirect("/practice_servlet/servlet/SessionCookieServlet");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
用户数据传递过程:(第一次访问服务器会为用户创建一个Session,同一次会话再次访问就会使用同一个Session保存用户数据)
Session创建时间:并不是浏览器一访问服务器某个资源就创建Session,是第-一-次-访-问request.getSession代码时才创建!!
Session摧毁:由服务器管理,Session对象30分钟没人用了才会摧毁
Session属于Web资源,可以在web.xml中配置失效时间,单位是分钟
代码中可以用request.getSession().invalidate()摧毁
request.getSession(false):不创建只获取Session,查看购物车时会用到
示例:
<a href="/practice_servlet/servlet/BuyServlet">购买</a><a href="/practice_servlet/servlet/PayServlet">结账</a> <br>
<a href="/practice_servlet/servlet/ResponseDemo">查看图书</a>
购买Servlet:
request.getSession().setAttribute("book", "您购买了电视机");
结账Servlet:
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//同一次会话
String value=(String) request.getSession().getAttribute("book");
PrintWriter writer=response.getWriter();
writer.write(value);
回写名为JSESSIONID的Cookie覆盖服务器回写的Cookie,下一次访问服务器根据这个Cookie设置的id和有效期找到上一次的Session(默认最多30分钟有效):
禁用Cookie的情况下(这时用ip地址访问来看效果!)使用Session:(浏览器不接受Cookie,也不会带Cookie给服务器,同一次会话中,这一次用Session保存数据,下一次访问创建新的Session,丢失上次数据)
解决方式:URL重写的方式将url后面带上session id.
getSession首先判断session id是否以Cookie带过来,再判断是否以url带过来,如果都没带过来则创建Session.
示例:Servlet模拟首页,访问首页时即创建Session,重写每个可能的超链接,附上session id,点击购买向同一个Session中存入数据(因为是同一次会话,首页已经创建Session,购买页面getSession()不会重新创建,根据url重写传过来的id找到同一个Session),点击结账时,因为是同一个session id,getSession()会根据这个url重写传过来的id找到同一个Session,获取到数据!
细节:如果此时Cookie解禁,第一次访问时服务器不知Cookie是否禁用,会重写url带上session id,并以Cookie回写session id给浏览器,第二次访问因为用户带Cookie过来,那么不会再重写url(getSession()方法内部机制判断)
如果禁用Cookie用url重写的方式实现Session,那么关了浏览器再开,Session数据不再的问题无法再解决,因为这一次重写一个新的session id,无法找到上次数据!!
重开选项卡,或基于同一窗口打开的超链接窗口,都共享同一Session,但不同浏览器有差别!!IE8:多个独立开启的浏览器窗口共享同一个Session