Cookie & Session
一.Cookie
举个例子:当你打开一次浏览器,访问 jd 买了点啥东西放到购物车(注意,你的这些操作并没有登录你的jd账号!)
然后把浏览器完全关闭,再次访问jd页面,发现购物车里面的东西还在。则可以判断你前一次会话的状态信息,不可能保留在缓存,因为浏览器关闭过。想象一下,如果你用别人的电脑打开未登录的jd购物车,肯定不会有刚刚你用自己电脑放到jd购物车里的东西。所以我们判断这些状态信息保存在了你的硬盘上。这种对会话信息的保存不在服务器上,而在你的硬盘上。当然也有cookie是保存在浏览器缓存上的。
- Cookie可以保存会话状态,但是这个会话状态会保存在客户端上(可以是浏览器缓存,也可以是硬盘),只要Cookie清楚或Cookie失效,状态就没有了。
- 只要是Web开发,不管是不是javaweb,只要是B/S架构系统,只要基于HTTP协议,就有Cookie存在
- Cookie这种机制是HTTP协议规定的,用来解决其无状态特性的一种方式
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 clasee 类名 extends HttpServlet{
protected void doGet(HttpServletRequest request,HttpServletResponse,response) throws ServletException,IOException{
//创建cookie对象 name,value
Cookie cookie1 = new Cookie("username","zhangsan");
Cookie cookie2 = new Cookie("password","123");
//发送给客户端
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
默认情况,cookie被保存在缓存中,浏览器关闭就失效,cookie的保存跟路径有关,浏览器会不会发送cookie给服务器,与路径有关
假如路径是/prj-servlet-11/a 发送cookie给浏览器,则默认cookie和/prj-servlet-11/ 路径绑定
如果执行cookie.setPath(request.getContextPath()+"123");
设置cookie有效时长cookie.setMaxAge(60*60);
按秒算
值为0则直接删除,>0则保存在硬盘,默认-1
public void ReicieveCookiesServlet extends HttpServlet
{
protected doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
{
cookie[] cookies = request.getCookies();//但是这个方法可能返回null
if(cookies != null){
for(Cookie cookie:cookies){
String cookieName = cookie.getName();
String cookieValue = cookie.getValue();
System.out.println(cookieName+"="+cookieValue);
}
}
}
}
从request对象中获取所有cookiecookie[] cookies = request.getCookies();
浏览器可以禁用cookie
二.Session
只要是Web开发,就会有session,不限于JavaWeb.
在Java中,类型为javax.servlet.http.Httpsession
Httpsession可以将会话状态保存在服务器端,保存的是当前用户的会话状态
在浏览器打开,第一次访问服务器,服务器返回创建一个HttpSession对象,并且生成对应cookie对象,此cookie 的name 是JSESSIONID,cookie的value是32位字符串
此cookie value和httpsession对象绑定到session列表中
服务器将cookie发送给浏览器客户端
客户端再次访问,首先确定cookie的name是不是JSESSIONID,然后获取cookie的value去检索session列表中对应的HttpSession对象
此cookie是保存在浏览器缓存中的,重新打开浏览器,服务器会返回一个新的sessionid给cookie保存
禁用cookie后,每一次的会话都是新的,需要重写URL,在本来的URL后面加 :jsessionid=32位字符串
浏览器关闭,并不会销毁原来的session对象,因为http协议是无状态的,只有请求瞬间,会连接服务器,你即使关了浏览器,服务器也不知道你关了,这样做是为了降低服务器压力
什么时候销毁session?
web服务器引用超时概念,当超时后,session销毁 默认30min
所以session存储少量的内容,一般是用户的登录成功信息
<session-config>
<session-timeout>120</session-timeout>
</session-config>
什么是一次会话?
一般大多数,是用户在浏览器上进行一些操作,然后关闭浏览器,是一次会话。
但本质上,是直到服务器中的session对象被销毁,才算一次会话结束
public void AccessMyselfSessionServlet extends HttpServlet
{
protected doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
String ip = request.getRemoteAddr();
HttpSession session = request.getSession();
System.out.println(ip+"'s session = "+session);
}
}
javax.servlet.http.HttpSession接口常用方法
- void setAttribute(String name , Object value)
- Object getAtttibute(String name)
- void remoteAttribute(String name)
- void invalidate()
三个接口
- ServletContext application : 应用范围
- HttpSession session: 会话范围
- HttpServletRequest request: 请求范围
Servlet接口下有HttpServlet实现了Servlet接口的所有方法
包括 public service,protected service. 二者区别是参数request和response前者是ServletRequest和ServletResponse. 后者是HttpServletRequest和HttpServletResponse
还有 doPost和doGet方法和维护Servlet生命周期的方法
我们写的Servlet一般只要继承HttpServlet,重写doPost或者doGet即可。
具体调用创建Servlet对象并且调用service方法,以调用doGet和doPost方法为终点,都由Tomcat完成,这里好像是一种设计模式,还运用了反射机制啥的,暂时还不太明白。
参考:cookie和session(https://www.cnblogs.com/l199616j/p/11195667.html)