java中的cookie和session

2012/03/19 2210点热度 0人点赞 0条评论

request 请求的特点:只存在一次请求中

   http协议是一个无状态的协议【对事物的处理没有记忆能力】所以产生了会话

web应用中的会话及管理

一,会话cookie,

  临时cookie存在于浏览器进程中,

  创建一个cookie

Cookie usercookie=new Cookie("username","鱼翔空");

 持久cookie

    //设置在客户端的时间,保存7天  

usercookie.setMaxAge(7*24*60*60);

    //放置cookie到应答头,从服务端存放到客户端

response.addCookie(usercookie);

 读取cookie  

Cookie[] cookies=Cookie.getCookies();
if(cookies!=null&&cookies.length>0)
{
     for(Cookie cookie:cookies)
        cookie.getName();
}

 设置cookie能返回给服务器的路径,将cookie保存在web应用程序的根目录,这样这个web应用中都可以使用到该cookie  

usercookie.setPath(request.getContextPath());

   设置cookie读取路径的原因

      a) 默认cookie写入的读取路径是当前操作的目录下

      b) 只有当前目录下的web程序才可以去访问当前的cookie

      c) 如果网站的上级目录程序要访问当前的cookie会访问不到

      d) 所以要设置读取cookie的路径为网站的根目录

 

 用cookie记录访问时间,将时间已字符串的形式保存在cookies中

    在cookie中设置时间时,在时间的字符串中不能出现空格" "或":"等特殊的符号,但"-"可以

 案例使用cookie记住用户名和密码

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
                                                                                                                      
    //获取用户名和密码
    String username=request.getParameter("username");
    String psw=request.getParameter("psw");
                                                                                                                          
    Cookie userCookie=null;
    Cookie pswCookie=null;
                                                                                                                          
    //创建Cookie
    if(username!=null&&!"".equals(username.trim())){
        userCookie=new Cookie("username",java.net.URLEncoder.encode(username, "utf-8"));
    }
    if(psw!=null&&!"".equals(psw.trim())){
        pswCookie=new Cookie("psw",java.net.URLEncoder.encode(psw,"utf-8"));
    }
                                                                                                                      
    //保存用户名和密码:<input type='checkbox' name='save' value='yes' ><br>
    String save=request.getParameter("save");
    if(save!=null){   //表示复选框被选中
        if(userCookie!=null&&pswCookie!=null){
              //设置Cookie的保存时间  //将最大时效设为0则是命令浏览器删除该cookie。
              userCookie.setMaxAge(7*24*60*60);
              pswCookie.setMaxAge(7*24*60*60);
        }
                                                                                                                              
    }else{ //save==null:表示复选框没有被选中,用户名和密码在客户端的浏览器中不被保存
        if(userCookie!=null&&pswCookie!=null){
              //设置Cookie的保存时间  //将最大时效设为0则是命令浏览器删除该cookie。
              userCookie.setMaxAge(0);
              pswCookie.setMaxAge(0);
            }
    }
                                                                                                                      
    if(userCookie!=null&&pswCookie!=null){
      //加入Cookie到应答头
      response.addCookie(userCookie);
      response.addCookie(pswCookie);
    }
                                                                                                                          
}

   字符编码问题

     编码java.net.URLEnconder.encode("用户名","utf-8")

     解码java.net.URLDeconder.decode("用户名","utf-8")

二,会话session  

 获取session的三种方法

HttpSession session=request.getSession(true);
HttpSession session=request.getSession(false);
HttpSession session=request.getSession();

    true  如果和request关联的session存在,获取已存在的session

          如果和request关联的session不存在,创建一个新的session

    false 如果和request关联的session存在,获取已存在的session

          如果和request关联的session不存在,不会创建新的session

   request.getSession();取出的结果和getSession(true)相同

 

  Sessionid的存储方式:

     采用cookie存储,称之为session cookie

     如果cookie在客户端被禁止,则采用url重写

        一种是作为URL路径的附加信息,http://www.yxkong.com:Jsessionid=内容?参数

一种是作为查询字符串附加在URL后面,com?jsessionid=内容

     response.encodeURL("url路径地址")

 服务器会根据客户端的游览器是否支持cookie来处理是否重写url

   encodeRddirectURL("url地址")用法同上

     表单隐藏字段,使用隐藏域来保存

 

session中的常用方法

  session.geid()返回SessionID

  session.getLastAccessedTime()//获得session的最后访问时间

  session.setAttribute("属性key",属性名);

  session.getAttribute("属性key");获得session值

  session.removeAttribute("属性key"),删除属性

  session.getCreationTime() 获得session对象的创建时间

  session.getMaxInactiveInteral()//获得session的最大超时时间秒

  isNew(),判断session判断是否是新创建的Session

  session.getLastAccessedTime()最后一次操作时间

   request.getHttpSession(boolean) 获得HttpSession对象

   setAttribute(String,Object)将一对属性保存在httpSession对象中

   getAttribute(String)根据name返回httpSession对象中所有的属性值

   removeAttribute(String)

   getAttributeNames()  返回http对象中所有的属性名

   session.invalidate()//注销session

   setMaxInactiveInterval();设置最大超时时间

 

  设置session的过期时间

    直接在读写session时,配置session的超时时间,优先级最高

     setMaxInactiveInterval(5)

   可以在服务器中的web.xml中配置整个服务器中的session超时时间,

   也可以在web项目下配置该项目的session超时时间,一般用这个

<session-config>
       <sesstion-time>10</sesstion-time>
</session-config>

  sessionid 不能实现跨游览器共享

  ie6下session不共享每次开启一个ie6窗口都会创建一个新的session

  //在ie6下实现跨窗口共享,是将sessionid保存到持久cookie中

Cookie cookie=new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(24*60*60);
response.addCookie(cookie);

  当游览器不支持cookie的时候,可以通过url重写解决

   response.encodeURL("url路径地址")

   服务器会根据客户端的游览器是否支持cookie来处理是否重写url

   encodeRddirectURL("url地址")用法同上

Session存放数据应注意:

  session存放的对象时,是对象的引用,当修改过对象的值以后不需要再存入到session对象中

  session中尽量少的存放数据,如果能放到request中的尽量放入request

  session中存放的数据量应该尽可能的减小,防止session过大,给服务器增加压力,也会减少session丢失

Session清空的方法:

 1)  人为的使用代码清空session

 2)  过了session的保存时间

 3)  Session是浏览器/服务器进程,关闭浏览器以后服务器将清空session(两端之间没有不间断的http通信,没有联系等到session的过期时间就会清空).

浏览器访问服务器端使用同一个session是由两端的sessionid来维系的

当访问服务器的时候,服务器会返回一个sessionid当浏览器得到这个 sessionid会将它放在自己的进程内存里,这里不同的浏览器会有所不同,IE6进程间不能共享这个sessionid,也就是新开一个IE将不能共享这个sessionid;而Firefox进程间可以共享.然后你继续发请求给这个网站的时候,浏览器就会把这个sessionid放在请求头里发送给该服务器了,这样服务器得到sessionid后再和自己内存里存放的sessionid对比锁定客户端,从而区分不同客户端,完成会话.
  可以看出如果用这种方式,当用户在会话的过程中关闭浏览器结束进程,则这个sessionid将消失,如果用户又打开浏览器想继续这次会话的时候,就会因为发送的请求中没有这个sessionid而使服务器无法辨别该把那个session信息给他,注意(这个时候服务器端的sessionid和 sessionid所指向的session都还存在,只是没有正确的sessionid和它匹配而占用服务器内存,只有session过期或服务器重启才释放内存).
  上面这种方式叫会话cookie,把cookie放在浏览器内存里,只能在这个浏览器的内存范围里完成会话,是一种不长久的方式,为了能长久会话,就出现了持久化cookie,把cookie固化在用户的计算机上,现在的cookie不单单能存放sessionid,还能放用户信息,样式表信息等.
  如果用户禁止了所有cookie的使用,那么会话cookie和持久化cookie都不能用了,有个方案也可以解决问题,就是URL重写,这里要说下的就是URL重写只能实现会话cookie的效果,持久会话实现不了.

 

yxkong

这个人很懒,什么都没留下

文章评论