※ 会话追踪技术 session cookie
http协议的访问是无状态的访问,就是说当前这次访问是不会知道之前访问的状态的.(http协议的访问是不会帮我们保存访问的记录/痕迹的).
有些我们的访问是不需要知道之前访问的状态的.比如我们访问一些静态的页面,在访问一个校园网站的时候,第一次访问点击了页面中的校园风采,第二次访问点击了学生作品,这俩次访问完全可以没有任何关系,也不需要知道各自访问的状态.
但是有些访问我们是一定要知道之前几次访问的状态的.比如在购物网站的时候,第一次访问点击购买了一个手机,第二次访问点击购买了一个电脑,第三次访问点击购物车结算,这个时候我们就必须知道前俩次访问的时候购买了什么,要不然就没有方法去结算。
所以我们就有了会话追踪技术来解决这个访问无状态的问题。
※ session和cookie
- session是保存在服务器端的一个对象.客户端是没有session的.
- cookie在客户端和服务器端都会有。但是存在的形式不一样.在客户端cookie是以本地文件(浏览器管理的文件)的形式存在的,在服务器端是以java对象的形式存在.
cookie的作用:
和session一样,是用来保存用户访问的信息数据的。但是session是把数据保存在服务器端的内存里面,cookie是把数据保存在客户端的文件里面.
客户端访问服务器的时候,服务器会给这个客户端创建一个会话,也就是一个session对象,服务器端的内存里面同时可能有好多个session对象,分别对应的不同的客户端,每一个session对象都有一个唯一的id值,叫做JSESSIONID。服务器端给客户端产生一个session对象后,会通过这次访问的response对象把这个session的JSESSIONID的值返回给浏览器,浏览器接收到后会把这个值以一个cookie文件的形式保存起来。之后,这个浏览器再发生请求到服务器的时候,就会把之前保存在cookie文件中的JSESSIONID的值传给服务器,服务器通过这个JESSIONID的值就能够知道服务器内存中是哪一个session对象和当前这个客户端对应。这样以来,最后就能到达一个效果,我们客户端的每一次访问,在服务器端都能够拿到相同的一个session对象,从而实现不同请求之间通过相同的session对象进行数据的共享。
※ 如何从服务器端向浏览器写回cookie
//创建cookie对象
Cookie c1 = new Cookie("name","tom");
Cookie c2 = new Cookie("msg","hello");
//设置cookie的有效时间
c1.setMaxAge(60*60*24*365);
c2.setMaxAge(60*60*24*365*10);
//把cookie放到response里面
resp.addCookie(c1);
resp.addCookie(c2);
package com.briup.web.Servelt;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CookieTest
*/
@WebServlet("/cook")
public class CookieTest extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
for(int i=0;i<100;i++) {
//给浏览器中的cookie写内容,cookie不能带中文
Cookie cookie=new Cookie("name"+i,"tom");
//参数类型是时间,单位秒,表示多久让浏览器删除该cookie(过期时间)
cookie.setMaxAge(60*60*24*365*6);
Cookie cookie1=new Cookie("passwd"+i,"111");
cookie1.setMaxAge(60*60*24*365*6);
response.addCookie(cookie);
response.addCookie(cookie1);
request.getRequestDispatcher("test.jsp").forward(request, response);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
最后response对象会把cookie带回到浏览器,并又浏览器把cookie对象中的内容保存到对应的一个cookie的文件中。
注意:如果没有设置cookie生效的时间,那么这个cookie就是会话cookie,当会话结束(关闭浏览器)的时候cookie就是失效了。
※ 如何在servlet中拿到从浏览器发送过来的cookie文件中的数据
//从request中拿到一个cookie数组
//如果没任何cookie数据则返回null
Cookie[] cookies = req.getCookies();
//遍历数组 拿出key和value
for(Cookie c:cookies){
String key = c.getName();
String value = c.getValue();
}
package com.briup.web.Servelt;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CookieGet
*/
@WebServlet("/getc")
public class CookieGet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
Cookie[] cookies=request.getCookies();
for(Cookie c:cookies) {
System.out.println(c.getName()+"--"+c.getValue());
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
注意:session对象的创建时间。
Cookie保存服务器端的信息(用户名,密码)
浏览器cookie是以文件的方式呈现
注意:cookie是response带给浏览器的
浏览器接收的站点是有限的,每一个站点可以写入的cookie也是有限的。
(eg:火狐每个站点最多维护180多个cookie)
每一个cookie的值最多4096b(4kb)
服务器写回cookie本地存在key,覆盖value值。
如果浏览器cookie维护到达最大值,服务器再次写回cookie对象,浏览器移除最早写入的。