Cookie与Session

来源:互联网 发布:python2.6抓取网页数据 编辑:程序博客网 时间:2024/06/08 16:41
一、Cookie
     Cookie是客户端保存会话(会话指的打开浏览器,通过超链接访问了多个页面后,再将浏览器关闭的整个过程)数据的一种技术,它是Servlet发送到Web浏览器的少量信息,这些信息是由浏览器保存的;当用户通过浏览器访问服务器中的资源时,程序将每个用户的数据以Cookie的形式写给用户各自的浏览器,由浏览器将其保存在客户端的缓存中,当用户再次使用浏览器去访问服务器中的web资源时,浏览器就会带着各自的数据去,因此,Cookie的值可以唯一的标识一个客户端。通过这种途径,web资源处理的就是每个用户自己的数据了。
     一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(Name)和值(Value),一个web站点可以给浏览器发送多个Cookie,一个浏览器可以存储多个web站点发送来的Cookie,对于浏览器来说每个站点最多存放20个Cookie,其存放的Cookie总量不超过300个
     1、Cookie API
          javax.servlet.http.Cookie类用来创建一个Cookie,在HttpServletReponse中,定义了一个方法:addCookie(),该方法用于在响应头中增加一个Cookie,同样的,在HttpServletRequest中,定义了一个getCookies()方法,它用于获取客户端提交的Cookie
     2、Cookie属性
          ①Name 表示Cookie的名称,路径不同Name也会不同
          ②Value 表示Cookie的值
          ③MaxAge  该属性表示Cookie的最大生存时间,以秒为单位,默认情况下,该值为-1,即Cookie被缓存在浏览器中,当浏览器关闭后Cookie会被清除,若为0,表示删除Cookie,若为正数,Cookie将被还存在磁盘上,当过了该值表示的秒数后Cookie被清除,即使在这期间浏览器被关闭了,Cookie依然会在过了该秒数后被清除
          ④Path 表示Cookie保存的路径,默认为写Cookie的程序的访问路径,浏览器访问服务器时,根据path来决定是否携带Cookie来访问,如果当前访问路径以Cookie的path开头,则浏览器访问时要携带者Cookie访问,否则就不带
以上属性都有对应的getXxx()方法和setXxxx()方法来设置和获取
下面为一个Cookie的例子,显示最后的访问时间
import java.io.IOException;import java.io.PrintWriter;import java.util.Date;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 class Cookdemo1 extends HttpServlet{       @Override       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {             resp.setContentType("text/html;charset=UTF-8");             //获取客户端最后的访问时间             Cookie[] cookies = req.getCookies();//获取客户端所有cookie对象             PrintWriter out = resp.getWriter();             for (int i = 0;cookies != null && i < cookies.length; i++) {                    if("lastTime".equals(cookies[i].getName())){//判断当前cookie是否为想要的对象                           long time = Long.parseLong(cookies[i].getValue());                           out.write("你的最后访问时间为:"+ new Date(time).toLocaleString());                    }             }             //响应cookie             Cookie ck = new Cookie("lastTime", System.currentTimeMillis()+"");//构造器中传入Name和Value             resp.addCookie(ck);       }       @Override       protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {             // TODO Auto-generated method stub             doGet(req, resp);       }}
二、HttpSession
     HttpSession是服务端的技术,利用该技术,服务器在运行时为每一个用户的浏览器创建一个其独享的HttpSession对象,由于一个session只能够被一个用户的浏览器独享,所以用户在访问服务器上的web资源时,服务器将用户各自的数据放在各自的session中,当用户再去访问服务器中的其他web资源时,其他web资源将从用户各自的session中取出数据为用户服务。
     Session既然是由服务器创建的,那么它是如何将每一个Session和用户一一对应起来的呢?在用户第一次访问服务器下的servlet时,服务器会为用户创建一个Session,这个Session属性中有一个id属性,id的值是随机产生的,等这次请求完后,将id这个值保存到Cookie中然后通过response对象中响应给浏览器,等到浏览器再次访问该服务器下的资源时,Cookie会带着id去,这时服务器就可以根据这个id来找到该用户锁对应的Session了
     Cookie与Session的关系是后者依赖于前者,而二者最大的区别是,前者只能存字符串,后者还可以存对象,此外,Session与ServletContext、request一样都是域对象
     1、HttpSession的常用方法
          得到HttpSession对象需要调用HttpSerlvetRequest对象中的getSession()方法来得到,得到Session对象后,就可以对其进行操作了,下面是常用的方法
          ①serAttribute(String name , Object value);
          ②getArrtibute(String name);
          ③removeAttribute(String name);
          ④getId();得到Session的Id属性
          ⑤invalidate();使当前会话无效
          ⑥setMaxInactiveInterval(int interval) 设置Session的存活时间
     2、Session的状态
          创建:当浏览器第一次访问服务器的动态资源时Session被创建
          活着:当应用运行时,Session就活着
          死亡:当调用Invalidate()方法或者超过存活时间时,session死亡,默认的存活时间为30分钟
     这里有个问题,就是当我们重启服务器之后,先前的Session会消失,这是因为没有将Session中保存的对象序列化,只需要让该对象对应的类实现serializable接口即可,下次重启服务器后,先前的Session依然存在
原创粉丝点击