码迷,mamicode.com
首页 > 其他好文 > 详细

Cookie与Session

时间:2014-11-17 17:36:52      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:http   io   ar   使用   sp   java   for   数据   div   

Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。

Session,它和Cookie的作用几乎是相同的,最大的区别是Session是放在服务器端的,而Cookie是在客户端的。

一、cookie的作用 

在我们平常写的B/S程序中主要有以下作用: 

1、 记录用户名和密码 

以及该用户需要保存的一些信息,如购物购站,使用cookie,可以让用户自动登录到站点等。 

2、 定制站点 

可以使用cookie来记录用户的偏好。 

3、 定向广告 

可以使用cookie来记录用记经常访问的主题,并向他们显示与这些主题相关的广告。 

二、向客户程序发送cookie 

1、 创建cookie对象 

Cookie c = new Cookie(“userId”,”landril”); 

2、 设置最大时效,默认该cookie是存储在浏览器的内在中,用户关闭浏览器则被删除,下面的方法是将cookie存储在硬盘上。 

// 如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。
这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
 
// 如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
 
// cookie.setmaxage设置为0时,会马上在浏览器上删除指定的cookie
 
// cookie.setmaxage设置为-1时,代表关闭当前浏览器即失效。
 
c.setMaxAge(60);// 60秒的意思
 
c.setMaxAge(60 * 60);// 一小时
 
c.setMaxAge(365 * 24 * 60 * 60);// 一年

3、 将cookie放入到HTTP响应报头,可以使用HttpServletResponse的addCookie方法,此方法不修改之前指定的Set-Cookie报头,而是创建新的报头。 

response.addCookie(c); 

       注意:设置cookie的步骤为创建cookie对象,设置最大时效,将cookie放入响应报头,即发送到客户程序,记住一定要将cookie发送到客户程序 

三、从客户端读取cookie 

1、 调用HttpServletRequest的getCookies得到一个Cookie对象的数组 

2、 对数组进行循环,调用cookie的getName方法,获取具体的cookie的值 

Cookie[] cookies = request.getCookies(); 

if(cookies != null){ 

for(int i=0;i<cookies.length;i++){ 

        Cookie c = cookies[i]; 

        if(“userId”.equals(c.getName())){ 

        System.out.println(c.getValue()); 





}
四、删除Cookie里的数据 
Cookie deleteCookie = new Cookie("cookie",null); 
deleteCookie.setMaxAge(0); 
deleteCookie.setPath("/"); 
response.addCookie(deleteCookie); 

五、JS使用Cookie
//存储Cookie
function setCookie(c_name,value,expiredays)
{
var exdate=new Date()
exdate.setDate(exdate.getDate()+expiredays) 
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
}  
//检查是否已配置Cookie
function getCookie(c_name)
{
if (document.cookie.length>0)
  {
  c_start=document.cookie.indexOf(c_name + "=")
  if (c_start!=-1)
    { 
    c_start=c_start + c_name.length+1 
    c_end=document.cookie.indexOf(";",c_start)
    if (c_end==-1) c_end=document.cookie.length
    return unescape(document.cookie.substring(c_start,c_end))
    } 
  }
return ""

//使用Cookie
function checkCookie()
{
username=getCookie(‘username‘)
if (username!=null && username!="")
  {alert(‘Welcome again ‘+username+‘!‘)}
else 
  {
  username=prompt(‘Please enter your name:‘,"")
  if (username!=null && username!="")
    {
    setCookie(‘username‘,username,365)
    }
  }
 
Session存储在服务器端,在用户访问第一次访问服务器时创建,只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。
Session什么时候失效?
 
  1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。
 
  2. 调用Session的invalidate方法。
 Session对浏览器的要求:
 
  虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。
 
  该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。
 
  注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择"在新窗口中打开"时,子窗口便可以访问父窗口的Session。
 
如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。
 
  URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。
 
  注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。
 
session的工作原理如下:
1.客户首次访问服务器的一个页面时,服务器就会为该客户分配一个session对象,同时为该session对象指定一个唯一的ID,并且将该ID号发送到客户端并写入到cookie中,使得客户端与服务器端的session建立一一对应关系。
2.当客户继续访问服务器上的其他资源时,服务器不再为该客户分配新的session对象,直到客户端浏览器关闭、超时或调用session的invalidate()方法使其失效,客户端与服务器的会话结束。
3.当客户重新打开浏览器访问网站时,服务器会重新为客户分配一个session对象,并重新分配sessionID。
session对象主要用于属性操作和会话管理,常用方法如下:
1.public void setAttribute(Sting name, Object value),设定指定名字的属性的值,并将它添加到session会话范围内,如果这个属性是会话范围内存在,则更改该属性的值。
2.public Object getAttribute(String name),在会话范围内获取指定名字的属性的值,返回值类型为object,如果该属性不存在,则返回null。
3.public void removeAttribute(String name),删除指定名字的session属性,若该属性不存在,则出现异常。
4.public void invalidate(),使session失效。可以立即使当前会话失效,原来会话中存储的所有对象都不能再被访问。
5.public String getId( ),获取当前的会话ID。每个会话在服务器端都存在一个唯一的标示sessionID,session对象发送到浏览器的唯一数据就是sessionID,它一般存储在cookie中。
6.public void setMaxInactiveInterval(int interval),设置会话的最大持续时间,单位是秒,负数表明会话永不失效。
7.public int getMaxInActiveInterval(),获取会话的最大持续时间。
8.使用session对象的getCreationTime()和getLastAccessedTime()方法可以获取会话创建的时间和最后访问的时间,但其返回值是毫秒,一般需要使用下面的转换来获取具体日期和时间。
     Date creationTime = new Date(session.getCreationTime());
    Date accessedTime = new Date(session.getLastAccessedTime());
 
 
例子:
 
 
public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    String option = request.getParameter("option");
    if ("create".equals(option)) {
        //获得HttpSession对象
        HttpSession session = request.getSession();
        //设置会话的最大持续时间
        session.setMaxInactiveInterval(30);
        //获取Session中的数据
        List list = (List) session.getAttribute("list");
        if (list == null) {
            list = new ArrayList();
            list.add("hey");
            //向Session中添加数据
            session.setAttribute("list", list);
        } else {
        list.add("hey");
    }
     out.println(list);
   }elseif ("invalidate".equals(option)) {
       HttpSession session = request.getSession(false);
       if (session != null) {
//仅清空session中名称为xName的变量值,整个session其它不受影响;  
request.getSession().removeAttribute("xName"); 
       //使Session对象失效
       session.invalidate();
   }
}
当浏览器请求地址“.../tst/testSession?option=create”时,Servlet调用request的getSession方法获得Session对象,如果此时服务器端存在与请求信息中SessionID(作为Cookie信息携带)对应的Session对象,则返回这个Session对象,否则将会创建一个新的Session对象并将其产生的SessionID以Cookie的形式通过响应信息送回。
当浏览器请求“.../tst/testSession?option=invalidate”时,Servlet会调用Session对象的invalidate方法用于使该Session对象失效。 
 
 

Cookie与Session

标签:http   io   ar   使用   sp   java   for   数据   div   

原文地址:http://www.cnblogs.com/chengsy/p/4103913.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!