Session&&Cookie的详细介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZJ_2420441444/article/details/79951304
前言: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,并获取时间,显示给用户。
public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")
				.format(new Date());
		Cookie currentTime = new Cookie("lastAccessTime", sdf);
		currentTime.setMaxAge(10 * 60);

		response.addCookie(currentTime);

		// 获得客户端携带的信息
		String lastAccessTime=null;
		Cookie[] cookies = request.getCookies();
		if (cookies != null) {
			for (Cookie cookie : cookies) {
                if(cookie.getName().equals("lastAccessTime")){
                	lastAccessTime=cookie.getValue();
                }
			}
		}
		
		response.setContentType("text/html;charset=utf-8");
		if(lastAccessTime==null){
			response.getWriter().write("您是第一次访问");
		}else{
			response.getWriter().write("您上次访问的时间是"+lastAccessTime);
		}
		
	}
 
三、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对象的生命周期(面试题和笔试题)
 创建:Session存储在服务器端,一般放置在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。
销毁: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值一样。

总结:
会话技术:
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的持久化。
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页