对于session,request,cookie的理解

session和request的生命周期

首先是session,比如我们在实现一个购物车功能时,在某一页面(这里称为页面A)选择了一些购物的商品,添加到购物车。那么当我们选择完成后点击我的购物车时会跳转到一个购物车页面(这里称为页面B),这和页面A是两个不同的页面,那么怎么讲页面A选取的商品添加到页面B呢。这里一种解决方案就是session。直接上一个demo了:

A.jsp页面:

<body>
    <h1>A界面</h1>
    <%
        session.setAttribute("name","苹果");//这是jsp文件,如果是Servlet的话,先得获得Session,HttpSession hs=request.getSession(true);
    %>
</body>

B.jsp页面:

<body>
    <h1>B界面</h1>
    <%
        String name = (String) session.getAttribute("name");
    %>
    <p>Session的值为:<%=name%></p>
</body>

上面就达到了一个传值的目的,当然,我们谈的是session的生命周期,Tomcat里,默认的session生命周期是30min,也就是你不操作界面的时间,你一刷新界面的话,session会重新计时的,那么session的默认时间可以改么,答案是肯定的。可以在Tomcat目录下的conf文件下的web.xml进行修改,如下图所示,默认是30min,修改的话改个数值就行了:

当然我们每个应用程序的session可以自己设置生命周期,比如在A.jsp界面加句话就行了。

A.jsp页面:

<body>
    <h1>A界面</h1>
    <%
        session.setAttribute("name", "苹果");//这是jsp文件,如果是Servlet的话,先得获得Session,HttpSession hs=request.getSession(true);
        session.setMaxInactiveInterval(5);
    %>
</body>

这里session.setMaxInactiveInterval(5);设置的是有效时间5秒,这里是以秒为单位的。

那么比如我从A界面跳转到B界面,B界面会显示Asession传过来的session内容,但是如果我5秒内没有动过B界面,那么再次刷新A界面时, 将不会再获得session内的值了,因为这个session失效了。

 

下面是request,request有两个方法:getParameter()和getAttribute()

现在有两个界面test1.jsp,test2.jsp,当我们在浏览器中输入http://127.0.0.1:8080/AA/test2.jsp时,一个request就产生了,也就是生命周期的开始。test1.jsp的request中,我们可以设置一些值,比如我在test1.jsp是这样设置的:

<body>
    <h1>test1界面</h1>
    <%
        request.setAttribute("name", "hello");
    %>
    <a href="test2.jsp"></a>
</body>

上面setAttribue是在request中设置值的。那么问题来了,我们需要从test1.jsp界面跳转访问test2.jsp界面,是否test2.jsp界面中的request也保存test1.jsp中的request值呢?

一般来说有两种处理方式实现跳转,一种是response.sendRedirect,另一种是request.getRequestDispatcher("xxx.jsp").forward(request,response);

用第一种方法,那么test1.jsp中的request不会传递到test2.jsp。

用第二种方法,request的生命周期将延续下去,当采用forward如果到达JSP页面,那么之前从第一个JSP页面中发送出来的request的消息将仍然存在,新的页面同样能够取得该request里所包含的一些信息,比如之前的JSP发送request中所包含的参数信息。事实上,它们是同一个request

这里注意一下:第二种方法中,如果在页面中通过setAttribute()设置一个Object值到request中,那么在另一个页面中可以通过getAttribute()来获得值,这里值是Object类型的。

下面是test1.jsp和test2.jsp页面的代码:

test1.jsp

<body>
<h1>test1界面</h1>
<%
request.setAttribute("name", "hello");
request.getRequestDispatcher("test2.jsp").forward(request, response);
%>
<a href="test2.jsp"></a>
</body>

test2.jsp

<body>
    <h1>test2界面</h1>
    <%
        String name = (String) request.getAttribute("name");
    %>
    <p>值为:<%=name%></p>
</body>

 

 

 

session和cookie的区别

session是存储服务器端,cookie是存储在客户端,所以session的安全性比cookie高。

也因此关了浏览器session当然仍然存在,因为session是储存在服务器端的,而服务器是不知道你有没有关掉浏览器的。

获取session里的信息是通过存放在会话cookie里的session id获取的。

session是存放在服务器的内存中里,而session里的数据不断增加会造成服务器的负担,所以会把很重要的信息存储在session中,而把一些次要东西存储在客户端的cookie里。

cookie确切的说分为两大类:会话cookie和持久化cookie。

会话cookie是存放在客户端浏览器的内存中,他的生命周期和浏览器是一致的,当浏览器关闭会话cookie也就消失了。

而持久化cookie是存放在客户端硬盘中,持久化cookie的生命周期(session-timeout)是我们在设置cookie时候设置的那个保存时间,

session的信息是通过session id获取的,而session id是存放在会话cookie当中的,当浏览器关闭的时候会话cookie消失,所以session id也就消失了,

但是session的信息还存在服务器端,并没有消失,只是查不到session但它并不是不存在。同时由于关闭浏览器不会导致session被删除,所以迫使服务器为seesion设置了一个失效时间(session-timeout),当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。 

 

 

 

对于“只要关闭浏览器,session就消失了”误解的解释

在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序(相当于客户)通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。浏览器从来不会在关闭之前主动通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器是否关闭。之所以会有这种错觉,是因为大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,即持久化cookie,则再次打开浏览器仍然能够找到原来的session。 


posted @ 2018-05-23 10:46  despair_ghost  阅读(4823)  评论(0编辑  收藏  举报