1、会话技术:
就是相当于打电话. 这个电话包含了多个请求和响应。
解决了一个在多个请求中共享数据的问题。
解决方案:
a.Cookie技术:数据存在本地
浏览器发送购买“篮球”给服务器的servlet ---- 服务器发送set-cookie给客户端,在客户端浏览器保存 --- 下次结账的时候,将本地的cookie携带给服务器。这个就是一个简单的cookie技术。
b.Session技术:数据存在服务器
浏览器发送购买“篮球”给服务器的servlet --- 服务器servlet会产生一个Session对象(session=request.getSession();) ---
下一次结账的时候,服务器会取出对应的Session数据。
注意:不同的浏览器服务器会创建不同的session对象。
2、Cookie属性:
Cookie只是保存一些重要的信息,每个网站20个,每个cookie最大4K。
一下4个属性比较重要
a.name: Cookie的名字
b.value: Cookie的值
c.path : 可选的,Cookie的存储路径 默认情况下存储的路径是访问的Servlet所在的路径
d.MaxAge: 可选,最大的存活时间 ,默认情况下是存放在缓存区中的.,生命周期就是一个会话。
不是很重要的属性
version: Cookie的版本
domain: 域名(那个网站)
Comment: 备注。
3、一个简单的示例演示下:
//演示记录上次访问的时间
public class ServletCookie extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8") ;
response.setContentType("text/html;charset=UTF-8") ;
PrintWriter out = response.getWriter() ;
out.write("您上次访问的时间是: ") ;
//拿到客户端携带的记录上次访问时间的Cookie : 假设Cookie的名字是lastaccesstime , 值是一个long类型的数字
//拿到客户端携带的所有的Cookie
Cookie[] cs = request.getCookies() ;
//循环判断拿到我们需要的Cookie,如果是第一次访问,那么cs肯定是null,所以需要一个判null处理
for (int i = 0; cs!=null && i < cs.length; i++) {
Cookie c = cs[i] ;
if(c.getName().equals("lastaccesstime")){
//说明找到了需要的Cookie
String time = c.getValue() ;
//将time转换成long类型的值
long t = Long.parseLong(time) ;
//格式化为我们需要的格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss") ;
//创建一个date对象
Date d = new Date(t) ;
//将数据输出到页面上
out.write(sdf.format(d) + " <a href = '"+ request.getContextPath()+"/servlet/ServletCookieDelete'>清除Cookie</a>") ;
}
}
//向客户端发送Cookie
Cookie c = new Cookie("lastaccesstime",new Date().getTime() + "") ;
//发送到客户端
response.addCookie(c) ;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
部署之后在浏览器中输入servlet的访问网址,在浏览器中第一次访问可以看到(chrome浏览器,开发者工具-Network-Headers 查看)
请求头信息:没有携带cookie
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Connection:keep-alive
Cookie:_pk_id.15.1fff=736d748c4f13a259.1474984763.1.1474984763.1474984763.
Host:localhost:8080
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36
响应头信息:返回了一个cookie
Content-Length:31
Content-Type:text/html;charset=UTF-8
Date:Mon, 10 Jul 2017 13:20:54 GMT
Server:Apache-Coyote/1.1
Set-Cookie:lastaccesstime=1499692854500; Expires=Sat, 28-Jul-2085 16:35:01 GMT; Path=/day10_00_cookie
第二次访问,请求头信息:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Cookie:lastaccesstime=1499692854500; _pk_id.15.1fff=736d748c4f13a259.1474984763.1.1474984763.1474984763.(携带了cookie)
Host:localhost:8080
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36
4、Cookie到底存在哪?
默认存在浏览器缓存里面。
如果需要设置到硬盘上,可以设置setMaxAge
c.setMaxAge(Integer.MAX_VALUE) ;
//设置Cookie的存活时间(只要设置了存活时间,那么此Cookie就将存储到客户端的硬盘上,不会在缓存中存储)
查看cookie的文件
打开IE-Internet选项-常规-设置-查看文件
例如打开一个cookie文件:
lastaccesstime(名称)
1499693767047(值)
localhost/day10_00_cookie(域名/资源地址,下面的不用管,注意这个资源地址是servlet设置了path之后的,如果不设置就是day10_00_cookie/servlet/ServletCookie)
1536
2066736896
35603649
2077214625
30603649
*
所以存在客户端上cookie是不安全的,因为可以手动删除。
5、服务器上怎么删除本地的cookie呢?
创建同名的Cookie,设置存活时间c.setMaxAge(0) ;
例如:我们在另外一个Servlet编写删除“ServletCookieDelete”
public class ServletCookieDelete extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//要想删除客户端存储的Cookie,sun公司没有提供相应的删除方法,
//所以采用的办法就是创建一个同名的cookie,将存活时间设置为0,然后覆盖客户端存储的Cookie
Cookie c = new Cookie("lastaccesstime","") ;
c.setMaxAge(0) ;
//设置为工程路径
c.setPath(request.getContextPath()) ;
//发送到客户端
response.addCookie(c) ;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
6、客户端是否携带Cookie,有什么决定呢?
是由浏览器来决定的。
默认情况下,客户端存储cookie的路径就是发送cookie的servlet路径,例如:
http://localhost:8080/day10_00_cookie/servlet/ServletCookie
这地址存储的cookie文件是这样的
localhost/day10_00_cookie/servlet/(域名/资源地址)
如果servlet设置了path,例如:
c.setPath(request.getContextPath()) ;
那么存储的cookie文件是这样的
localhost/day10_00_cookie(域名/资源地址)
浏览器判断的依据:
url.startWith(path),如果为true就携带。
这里的url是:你在地址栏中敲入的资源地址(http://localhost:8080/day10_00_cookie/servlet/ServletCookie中的day10_00_cookie/servlet/ServletCookie)
path是:cookie文件中,localhost/后面的资源地址
例如,你cookie里面地址是localhost/day10_00_cookie
你在浏览器中输入:
http://localhost:8080/day10_00_cookie/servlet/ServletCookie
http://localhost:8080/day10_00_cookie/servlet/ServletCookie1
http://localhost:8080/day10_00_cookie/ServletCookie2
都会携带
所以设置path也很重要
c.setPath(request.getContextPath()) ;//设置为工程路径
c.setPath("/") ;//设置路径是服务器的根路径 协议 + 主机名 + 端口号,访问服务器上的任意工程资源都会携带此Cookie
7、怎么确定一个Cookie呢?
域名+ 访问路径 + Cookie的名字
例如:
localhost/day10_00_cookie(域名/访问路径)
cookie文件中的:lastaccesstime(名称)
使用5里面的删除方法删除cookie是无效的,因为没有设置path,默认的cookie路径不是day10_00_cookie,所以找不到这个cookie。
8、session技术:
session和cookie其实是同一个技术,只是存储数据的地方不同。
cookie存储数据大小有限,session可以存储更多的数据。
每一个浏览器独占一个session。
session是第三个域对象(其他两个:全局对象context,request对象)。
9、创建session:
a.request.getSession() ;
此方法做了2件事:
1. 先看浏览器是否携带了一个名字叫JSESSIONiD的Cookie,如果没有,则直接创建一个新的session。存储在客户端的缓存中。
2. 如果有,则根据Cookie的值去服务端的内存中寻找id的值是此值的session.并且返回,找不到,创建新的返回。
b.request.getSession(boolean flag) ;
如果flag为true,则相当于情况a
如果flag为false,则只查不创建。
10、session存活时间:
服务端发送的JSESSIONID默认情况下存储在客户端的缓存中,所以关闭浏览器,session的生命就结束了。
要想多个关闭后还能用,那么必须创建一个新的Cookie,名字也是JSESSIONID,设置存活时间,
此时cookie存储在客户端的硬盘上,下次打开新的浏览器访问,浏览器会携带此Cookie,也就达到了关闭浏览器
还能使用此Session的效果了。
服务器的内存是有限的,如果不设置存活时间,那服务器内存肯帝存不了这么多。tomcat默认30min
可以查看配置文件:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
11、一个简单的session示例:
ServletSession1.java:
public class ServletSession1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession() ;
String id = session.getId() ;
System.out.println("id:" + id);
session.setAttribute("name", "hello") ;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
ServletSession2.java:
public class ServletSession2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取session对象
HttpSession session = request.getSession() ;
System.out.println("id2:" + session.getId());
String name = (String) session.getAttribute("name") ;
System.out.println(name);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
在浏览器中输入:
http://localhost:8080/session/servlet/ServletSession1
控制台输出:id:3423BB77C41914BD7C6500366A74E5CF
chrome中可以看到
请求头信息:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Connection:keep-alive
Host:localhost:8080
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36
响应头:
Content-Length:0
Date:Mon, 10 Jul 2017 15:12:24 GMT
Server:Apache-Coyote/1.1
Set-Cookie:JSESSIONID=3423BB77C41914BD7C6500366A74E5CF; Path=/day10_01_session; HttpOnly(set了cookie)
在浏览器中输入:http://localhost:8080/session/servlet/ServletSession2
控制台输出:id2:3423BB77C41914BD7C6500366A74E5CF
请求头信息:(携带了cookie)
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Connection:keep-alive
Cookie:JSESSIONID=3423BB77C41914BD7C6500366A74E5CF(携带了cookie)
Host:localhost:8080
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36
响应头信息:(没有set-cookie了)
Content-Length:0
Date:Mon, 10 Jul 2017 15:17:12 GMT
Server:Apache-Coyote/1.1