25@JSP_day07

一、Cookie

  a,创建cookie
    Cookie cookie = new Cookie(String name,String value);
    response.addCookie(cookie);
  b,查询cookie
    //如果没有cookie,返回null
    Cookie[] cookies = request.getCookies();
    String name = cookie.getName()
    String value = cookie.getValue();
  c, cookie的编码问题
    cookie的值只能是ascii字符,如果是非ascii字符(比如中文),需要编码。
    String URLEncoder.encode(String str,String code);
    String URLDecoder.decode(String str,String code);
  d, cookie的生存时间
    默认情况下,浏览器会将cookie保存在内存里面,只要浏览器关闭,cookie就会被销毁。
    cookie.setMaxAge(int seconds);
      seconds > 0 : 浏览器会将cookie保存在硬盘上,如果超过指定的时间(seconds),浏览器会删除该cookie。
      seconds < 0 : (默认值),浏览器会将cookie保存在内存里面。
      seconds = 0 : 删除cookie。
      比如,要删除一个名叫"userprofile"的cookie:
        Cookie c = new Cookie("userprofile","");
        c.setMaxAge(0);
        response.addCookie(c);
  e, cookie的路径问题
    浏览器在向服务器发请求时,会先比较cookie的路径与要访问的服务器的地址,只有匹配条件的cookie,才会发送给服务器。
    匹配条件:
      只有要访问的服务器的地址是cookie的路径或者其子路径时,才会将cookie发送给服务器。
      e1, cookie有一个默认的路径,等于添加该cookie的组件的路径。
        比如 addCookie.jsp创建了一个cookie,addCookie.jsp通过 /web06_3/jsp01/addCookie.jsp来访问,则该cookie的路径就是 /web06_3/jsp01
      e2, 可以调用 cookie.setPath(String path)来修改cookie的路径。
        cookie.setPath("/appname"); 即appname这个应用下的所有组件都可以访问该cookie。


练习:

  写一个Find_Add_CookieServlet,该servlet先查询有没有一个名叫"userprofile"的cookie,如果有,则显示该cookie的值,否则(即找不到该cookie),则创建该cookie( new Cookie("userprofile","user123")。


  f, cookie的限制
    cookie可以被禁止,也就是说,服务器发送set-cookie消息头,浏览器不保存set-cookie消息头中设置的任何数据。
    cookie不安全。
    cookie保存的数据量大小有限制(大约4k)。
    浏览器在本地大约能保存约300个cookie。
    cookie只能保存字符串值。


 二、session(会话)

  1、什么是session?
    浏览器访问服务器时,服务器会创建一个对象(该对象称为session对象,有一个唯一的标识,称为sessionId),接下来,服务器会将sessionId以set-cookie消息头的方式发送给浏览器,浏览器会将这个sessionId保存(内存里)下来。
    这样,但浏览器再次访问服务器,会将sessionId发送给服务器,服务器通过sessionId就可以找到之前创建的session对象。
  2、获得session对象
    方式一:HttpSession  session = request.getSession();
      request.getSession()等价于request.getSession(true);
    方式二:HttpSession session = request.getSession(boolean flag);
      当flag = true时:
        服务器检查请求中是否包含有sessionId,
          如果没有,则创建一个session对象。
          如果有,服务器会依据sessionId查找之前创建的session对象,如果找到了,则返回;如果找不到,则创建一个新的session对象。
      当flag = false时:
        服务器检查请求中是否包含有sessionId,
          如果没有,返回null。
          如果有,服务器会依据sessionId查找之前创建的session对象,如果找到了,则返回;如果找不到,返回null。
  3、session的常用方法
    //绑订
    session.setAttribute(String name,Object obj);    
    //依据绑订名,返回绑订值。如果name对应的值不存在,返回null。    
    Object obj = session.getAttribute(String name);
    //解除绑订。
    session.removeAttribute(String name);
    //返回session对象的sessionId。
    String session.getId();
  4、session的超时
    服务器会将空闲时间过长的session对象删除掉(一般的服务器默认的空闲时间是30分钟)。
    1) session.setMaxInactiveInterval(int seconds);
      单位是秒。
    2)或者也可以通过修改服务器的配置文件来设置超时限制:
      tomcat_home/conf/web.xml
        <session-config>
          <session-timeout>30</session-timeout>
        </session-config>
      改为配置之后,要重新启动服务器。
      建议不要修改,因为修改之后,会影响到所以部署在该服务器上的应用。
  5、立即删除session
    session.invalidate();


session相关的案例

  session验证
    对于需要保护的资源(比如main.jsp),添加session.getAttribute(),如果能够取到值(该值是登录成功之后绑订的),则允许访问,否则,重定向到登录页面。
    编程:
      step1 在登录成功,绑订数据到session:
        session.setAttribute("user",user);
      step2 在需要受保护的资源当中,添加:

View Code
1 Object obj = session.getAttribute("user");
2 if(obj == null){
3     response.sendRedirect("login.jsp");
4 }
posted @ 2012-05-31 20:37  笑仁术Rex  阅读(133)  评论(0编辑  收藏  举报