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

Session&Cookie

时间:2017-09-11 10:06:45      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:invalid   div   lis   web应用   页面   tom   cookie   是否一致   磁盘   

Session&Cookie
        session和cookie的作用,存无状态的客户端的数据。session是把无状态的客户端的数据存放在服务器当中,cookie是把无状态的客户端的数据存储在客户端本地。
一、会话技术
1、存储客户端的状态
        由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术是帮助服务器记住客户端状态(区分客户端)
2、会话技术        
        从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。
会话技术分为Cookie和Session:
Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端可以清除cookie。
Session:将数据存储到服务器端,安全性相对好,增加服务器的压力。
 
二、Cookie技术
Cookie技术是将用户的数据存储到客户端的技术,
第一,服务器端怎样将一个Cookie发送到客户端?
第二,服务器端怎样接受客户端携带的Cookie?
 
1、服务器端将一个Cookies发送到客户端
a、创建Cookie(创建Cookie实例,设置Cookie的生命期限,向客户端写Cookie)
            //1、创建cookie对象
             Cookie cookie = new Cookie("name", "lisi");
             //2、设置cookie的生命其他
             cookie.setMaxAge(24*3600);
             //3、将cookie中存储的信息发送到客户端---头
             response.addCookie(cookie);
 
b、创建Cookie:
Cookie cookie = new Cookie(String cookieName,String cookieValue);
示例:Cookie cookie = new Cookie("username","zhangsan");
那么该cookie会以响应头的形式发送给客户端:
注意:Cookie中不能存储中文
 
c、设置Cookie在客户端的持久化时间:
cookie.setMaxAge(int seconds); ---时间秒
注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里。
示例:
cookie.setMaxAge(10*60);
设置cookie信息在浏览器的磁盘文件中存储的时间是10分钟,过期浏览器自动删除该cookie信息。
 
d、设置Cookie的携带路径:
cookie.setPath(String path);
注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息。
http://localhost:8888/WEB16_Session&Cookie/访问该路径下所有的资源都携带cookie信息。
示例:
cookie.setPath("/WEB16");----代表访问WEB16应用中的任何资源都携带cookie。
cookie.setPath("/WEB16/cookieServlet");---代表访问WEB16中的cookieServlet时才携带cookie信息。
cookie.setPath("/"):代表访问tomcat下所有的web应用都携带该cookie。
 
e、向客户端发送cookie:
response.addCookie(Cookie cookie);
 
f、删除客户端的cookie:
如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可。
 
2、服务器端怎么获取客户端携带的Cookie
cookie信息是以请求头的方式发送到服务器端的:
Cookie:“name=zhangsan”
 
a、通过request获得所有的Cookie
Cookie[] cookies = request.getCookies();
b、通过遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie
if(cookies!=null){
for (Cookie cookie : cookies) {
                    if(cookie.getName().equals("name")) {
                           String cookieValue = cookie.getValue();
                    }
             }
}
 
案例:显示用户上次访问的时间!
过程:
客户端---->第一次访问服务器端------->servlet (记住当前访问的时间 new Date(),把当前时间以cookie的形式写给客户端)---------->set-cookie:lastAccessTime =2016-08-08 10:22:25--------->第二次访问时,获取客户端携带名字叫lastAccessTime的之歌cookie,并获取时间,显示给用户。
 
三、Session
        Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。所以说session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID。Session技术基于Cookie---Cookie存储session编号。
        注意:发送编号和根据编号去寻找session区域位置,这些操作是客户端和服务器自动完成的,不需要手动编码。
 
Session需要学习如下三个问题:
怎样获得属于本客户端的session对象(内存区域)?
怎样向session中存取数据(session也是一个域对象)?
session对象的生命周期?
 
1、获得Session对象
  //创建属于该客户端(会话)的私有的session区域
  HttpSession session = request.getSession();
  String id = session.getId();//该session对象的id
        此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了)。
 
2、怎样向Session中存取数据(session也是一个域对象)
Session也是存储数据的区域对象,所以session对象也具有如下三个方法:
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
 
3、Session对象的生命周期(面试题和笔试题)
创建:第一次执行request.getSession()时创建
销毁:
a、服务器(非正常)关闭时
b、session过期/失效(默认30分钟)
 
问题:时间的起算点,从何时开始计算30分钟?
从不操作服务器端的资源开始计时。
 
可以在工程的web.xml中进行配置:
<session-config>
            <session-timeout>30</session-timeout>
</session-config>
 
c、手动销毁session
session.invalidate();
 
session作用范围:
        默认在一次会话中,也就是说在一次会话中任何资源公用一个session对象。
 
面试题:浏览器关闭,session就销毁了?(不对)
 
sessionOne:
//创建属于该客户端(会话)的私有的session区域
             HttpSession session = request.getSession();
             String id = session.getId();//该session对象的id
             session.setAttribute("name", "jerry");
             response.getWriter().write("JSESSIONID: "+id);
sessionTwo:
//从session中获得存储的数据
             HttpSession session = request.getSession();
             String attribute = (String) session.getAttribute("name");
             response.getWriter().write(attribute);
 
在上述代码中,依次打开,能够获取到session的值。但当关闭浏览器,再次访问sessionTwo时,显示为null。为什么?应为该次操作cookie是会话级别,需要程序修改为持久级别就ok。
 
代码修改:
sessionOne:
           //创建属于该客户端(会话)的私有的session区域
             HttpSession session = request.getSession();
             String id = session.getId();//该session对象的id
             
             //手动创建一个存储JSESSIONID的Cookie,为该cookie设置持久化时间
             Cookie cookie = new Cookie("JSESSIONID",id);
             cookie.setPath("/WEB16_Session&Cookie/");
             cookie.setMaxAge(24*3600);
             response.addCookie(cookie);
             session.setAttribute("name", "jerry");
             response.getWriter().write("JSESSIONID: "+id);
 
sessionTwo代码不用修改。如果直接访问sessionTwo,获取的sessionId值一样。
 
四、验证码校验功能实现和总结。
//设置request的编码
             request.setCharacterEncoding("UTF-8");
             response.setContentType("text/html;charset=UTF-8");
             //验证码的校验
             //1、获取输入的验证码
             String checkCode = request.getParameter("checkCode");
             //response.getWriter().write(checkCode);
             //2、获取生成图片的文字的验证码
             String checkcode_session = (String) request.getSession().getAttribute("checkcode_session");
             //response.getWriter().write(checkcode_session);
             //3、对比页面的验证码和输入的文字验证码对比是否一致
             if (!checkcode_session.equals(checkCode)) {
                    request.setAttribute("loginInfo", "您的验证码不正确");
                    request.getRequestDispatcher("/login.jsp").forward(request, response);
                    return;
             }            
             //获取页面的用户名和密码进行校验
             //......
 
总结:
会话技术:
Cookie技术:存储到客户端
1、发送cookie    
Cookie cookie = new Cookie(name,value)
cookie.setMaxAge(秒);
cookie.setPath("");
response.addCookie(cookie);
2、获得Cookie
Cookie[] cookies = request.getCookies();
cookie.getValue();
 
 
Session技术:存储到服务器端,借助Cookie存储JSESSIONID
HttpSession  session =  request.getSession();
 
setAttribute(name,value);
getAttribute(name);
 
session生命周期:
创建:第一次之多request.getSession();
销毁:服务器关闭,session 失效、过期,session.invalidate();
session作用范围:默认一次会话中。
session的持久化。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Session&Cookie

标签:invalid   div   lis   web应用   页面   tom   cookie   是否一致   磁盘   

原文地址:http://www.cnblogs.com/scalpel-ct/p/7502993.html

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