码迷,mamicode.com
首页 > 编程语言 > 详细

2018年5月9日JAVA-servlet02

时间:2018-05-18 11:42:41      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:request   art   关系   oca   ack   数据结构   decode   --   sch   

  1. session对象用于在会话范围内,记录每个客户端的访问状态,以便于跟踪每个客户端的操作状态,在会话存储的信息,在浏览器发出后续请求时可以获取这些会话的有效数据。  
  2. 在jsp页面中可以直接使用session对象(jsp的内置对象),也可以通过pageContext.getSession()或者request.getSession重新回去session对象。  
  3. session可以保存用户的信息和实现购物车等功能。  
  4. HTTP协议是一种无状态协议,客户向服务器发出的请求request,然后服务器返回响应response,连接就被关闭了,在服务器不保存连接的有关信息,因此在下一次连接时,服务器已经没有以前的连接信息了,无法判断这一次连接和上一次连接时同一个客户信息,因此,必须使用会话记录有关连接的信息。  
  5. 从客户打开浏览器连接到服务器,到客户关闭浏览器离开这个服务器,称做一个会话。当客户访问服务器是,可能会反复连接这个服务器上的几个页面、反复刷新一个页面或不断地向一个页面提交信息等,服务器应当通过某种方法知道这是同一个客户,这时就需要session对象。  
  6. session的工作原理如下:  
  7. 1、客户首次访问服务器的一个页面时,服务器就会为该用户分配一个session对象,同时为这个session指定唯一的ID,并且将该ID发送到客户端并写入到cookie中,使得客户端与服务器的session建立一一对应的关系;  
  8. 2、当客户端继续访问服务器端的其它资源时,服务器不再为该客户分配新的session对象,直到客户端浏览器关闭、超时或调用session的invalidate()方法使其失效,客户端与服务器的会话结束。  
  9. 3、当客户重新打开浏览器访问网站时,服务器会重新为客户分配一个session对象,并重新分配sessionID。  
  10. session对象主要用于属性操作和会话管理,常用方法如下:  
  11. 1、public void setAttribute(String name,String value)设定指定名字的属性的值,并将它添加到session会话范围内,如果这个属性是会话范围内存在,则更改该属性的值。  
  12. 2、public Object getAttribute(String name)在会话范围内获取指定名字的属性的值,返回值类型为object,如果该属性不存在,则返回null。  
  13. 3、public void removeAttribute(String name),删除指定名字的session属性,若该属性不存在,则出现异常。  
  14. 4、public void invalidate(),使session失效。可以立即使当前会话失效,原来会话中存储的所有对象都不能再被访问。  
  15. 5、public String getId( ),获取当前的会话ID。每个会话在服务器端都存在一个唯一的标示sessionID,session对象发送到浏览器的唯一数据就是sessionID,它一般存储在cookie中。  
  16. 6、public void setMaxInactiveInterval(int interval) 设置会话的最大持续时间,单位是秒,负数表明会话永不失效。  
  17. 7、public int getMaxInActiveInterval(),获取会话的最大持续时间。  
  18. 8、使用session对象的getCreationTime()和getLastAccessedTime()方法可以获取会话创建的时间和最后访问的时间,但其返回值是毫秒,一般需要使用下面的转换来获取具体日期和时间。  
  19.      Date creationTime = new Date(session.getCreationTime());  
  20.     Date accessedTime = new Date(session.getLastAccessedTime());  
  21. <%@ page language="java" import="java.util.*" contentType="text/html;charset=GBK"%>  
    <%  
    String path = request.getContextPath();  
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
    %>  
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    <html>  
      <head>  
        <base href="<%=basePath%>">  
         
        <title>session对象方法</title>  
         
     <meta http-equiv="pragma" content="no-cache">  
     <meta http-equiv="cache-control" content="no-cache">  
     <meta http-equiv="expires" content="0">     
     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
     <meta http-equiv="description" content="This is my page">  
     <!--  
     <link rel="stylesheet" type="text/css" href="styles.css">  
     -->  
      </head>  
       
      <body>  
        <b>  
        会话ID:<%=session.getId() %> <br>  
        是否新会话:<%=session.isNew() %><br>  
        设置和获取属性对象:用户名 =  
        <%session.setAttribute("用户名","bing"); %>  
        <%=session.getAttribute("用户名") %><br>  
        <%  
        Date creationTime = new Date(session.getCreationTime());  
        Date accessedTime = new Date(session.getLastAccessedTime());  
         %>  
         会话创建时间:<%=creationTime %><br>  
         上次访问时间:<%=accessedTime %><br>  
         会话持续时间(s):<%=session.getMaxInactiveInterval() %><br>  
         <%session.setMaxInactiveInterval(12); %>  
         修改后的会话持续时间(s):<%=session.getMaxInactiveInterval() %><br>  
         <%session.invalidate(); %>  
         </b>  
      </body>  
    </html>  
  22. 浏览器在访问服务器时,服务器将一些数据以 set-cookie 消息头的形式发送给浏览器。浏览器会将这些数据保存起来。当浏览器再次访问服务器时,会将这些数据以 cookie 消息头的形式发送给服务器。

    2、创建 cookie

    Cookie cookie = new Cookie(String name,String value);
    response.addCookie(cookie);

    cookie的name不可以重复,和Map集合类似,当有重复的name的时候,会替代。

    3、查询cookie

    //如果没有 cookie,则返回 null。
    Cookie[] cookies = request.getCookies();
    String name = cookie.getName();
    String value = cookie.getValue();

    4、cookie 保存时的编码问题

    cookie 的值叧能是ascii 字符,如果是中文,需要将中文转换成 ascii 字符形式。可以使用 URLEncoder.encode()方法和 URLDecoder.decode()方法来进行这种转换。

    5、cookie 的保存时间

    cookie.setMaxAge(int seconds);//单位为秒 
    ? seconds > 0 
    浏览器会将 cookie 以文件的方式保存在硬盘上。在超过指定的时间以后,会删除该文件。 
    ? seconds < 0 
    默认值,浏览器会将 cookie 保存在内存里面。叧有当浏览器关闭以后,才会删除。 
    ? seconds = 0 
    立即删除该 Cookie

    6、删除 cookie

    比如要删除一个 name 为”username”的 cookie。 
    Cookie c = new Cookie(“username”,”“); 
    c.setMaxAge(0); 
    cookie.setPath(request.getContextPath());//路径 
    response.addCookie(c);

    7、cookie 的限制

    ? cookie 可以禁止 
    ? cookie 的大小有限制(4k 左右) 
    ? cookie 的数量也有限制(浏览器大约能保存 300 个) 
    ? cookie 的值叧能是字符串,要考虑编码问题。 
    ? cookie 不安全

    8、cookie 的路径问题

    浏览器在向服务器上的某个地址发送请求时,会先比较 cookie 的路径不向访问的路径(地址)是否匹配, 叧有匹配的 cookie, 才会发送。 
    cookie 的路径可以通过 cookie.setPath(String path)方法来设置。如果没有设置, 则有一个缺省的路径,缺省的路径是生成该 cookie 的组件的路径。 
    比如: /appname/addCookie 保存了一个 cookie,则该 cookie 的路径就是/appname/addCookie。 
    规则: 
    cookie 的路径必须是要访问的路径的上层目录戒者是不要访问的路径相等, 浏览器才会将 cookie 发送给服务器。一般可以设置 setPath(“/appname”),表示访问该应用下的所有地址,均会发送

  23.    服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了,注意,第一次请求时,请求头中是没有Cookie的,响应头中会Set-Cookie。
    第一次请求时,响应头中Set-Cookie:
    技术分享图片
    Session利用Cookie的实现机制:
    技术分享图片
     
    技术分享图片
     
    有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 jsessionid 这样的参数,服务端据此来识别用户。
    <a href="<%=response.encodeURL("getSession.jsp")%>">跳转到获取session的页面</a>
    技术分享图片
    Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。
    Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
    Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
    Cookie发送:
    技术分享图片
    <%
        Cookie c = new Cookie("name","Gareen");//键值对
        c.setMaxAge(60*60*24);//有效期24小时,本地持久化
        c.setPath("127.0.0.1");//Path表示服务器的主机名,只有浏览器通过这个主机名访问服务器的时候,才会提交这个cookie到服务端
        response.addCookie(c);//发送生成的Cookie
    %>
    <a href="getCookie.jsp">跳转到获取cookie的页面</a>
    技术分享图片

     注意path的问题:

    path表示cookie所在的目录。”/”表示根目录,所有页面都能访问根目录下面的cookie。如果cookie的path为test,那么只test目录下或者是test下的子目录的页面和代码才获取到这个cookie。 

    例如http://localhost:8080/Web02/test

    当URL的path值是以“/”结尾的时候,直接设置为cookie的path值

    当URL的path值不是以“/”结尾的时候,查看path里面是否有“/” 

    例:http://localhost:8080/Web02/test/testServlet

    如果有“/”的话,直接截取到最后一个“/”,然后设置为cookie的path值。

    如果没有“/”的话,将cookie的path设置为”/”。

    Cookie读取

    Cookie[] cookies = request.getCookies();
       if(cookies != null)
         for(int i=0;i<cookies.length;i++){
            response.getWriter().print(cookies[i].getName()+":"+cookies[i].getValue());
         }

     Cookie删除

    技术分享图片
    Cookie c = new Cookie("name","peter");
    c.setMaxAge(24*60*60);  
    c.setPath("/");
    response.addCookie(c);
    
    Cookie cookie = new Cookie("username","peter");// 新建Cookie
    cookie.setMaxAge(0);                           // 设置生命周期为0,表示将要删除
    response.addCookie(cookie);     
    技术分享图片

     

2018年5月9日JAVA-servlet02

标签:request   art   关系   oca   ack   数据结构   decode   --   sch   

原文地址:https://www.cnblogs.com/jason111/p/9054702.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
分享档案
周排行
mamicode.com排行更多图片
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!