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.364、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("/") ;//设置路径是服务器的根路径 协议 + 主机名 + 端口号,访问服务器上的任意工程资源都会携带此Cookie7、怎么确定一个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