JSP会话跟踪学习
先开门见山~本文将解决以下三个问题:
1.什么是会话跟踪?
2.举例阐述四种会话跟踪技术的特点,应用场景
3.Cookie与Session的区别
问题一:
首先,我们要明确一下会话的概念,什么是会话?客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话。那么显而易见,会话跟踪便是对此过程进行跟踪(监听),对同一个用户对服务器的连续的请求和接受响应所进行的监视 。
然后,我们为什么需要会话跟踪技术呢?因为http协议是无状态协议,不能保存用户信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,这样就需要判断是否是同一个用户,为了防止这种情况的发生,我们需要用到会话跟踪技术。
会话跟踪的过程可以这样描述:
当服务器响应客户端的第一次请求时,将会自动创建一个新的session对象(该对象实现了HttpSession接口)和一个唯一的ID分配给该请求, 通过临时Cookie的方式响应给浏览器, 浏览器在以后的请求过程中,都会先获取临时Cookie中的SessionID,在请求过程中,会带上SessionID一起发送给服务器。服务器收到请求后,会先判断SessionID是否存在,如果不存在,说明是第一次请求;如果存在,证明这次请求和上次请求是同一个浏览器发送的;如果有多个浏览器同时请求服务器,服务器会根据SessionID找到对应的浏览器。
问题二:
四种常用的会话跟踪方法有:隐藏表单域,URL重写,Cookie,Session
1:隐藏表单域
是指在表单form内声明一个type类型为hidden的input标签,用来传递数据(可以在页面内先用JQuery获取要传递的值存入这个input标签的value中)和做一些其它的功能。它的优点是提供了一种往form中存取数据的方法。
测试页面:page1.html,page2.jsp
由page1向page2提交表单,并通过隐藏表单域的方式提交page1的ID
page1.html关键代码:
<form action="page2.jsp" method="post"> <input type="hidden" name="id" value="1"> 帐号:<input type="text" name="username" value="nangua" /><br /> <input type="submit" value="我要登录" /><br /> </form>
page2.jsp关键代码:
<% String id = request.getParameter("id"); %> <h1>收到id:<%=id%></h1>
2:URL重写
URL重写的目的是为了防止用户(浏览器)禁用cookie。
测试页面:page1.jsp ,page2.jsp
这里先写一个小例子:
page1.jsp关键代码:
<% String url = "page2.jsp?id=1"; %> <a href='<%=response.encodeUrl(url)%>'>page2.jsp</a>
page2.jsp关键代码:
<% String id = request.getParameter("id"); %> <%=id %>
通过在url后面直接追加参数的方式可以将id传给page2,因此,如果把会话id编写在URL中,即使浏览器关闭了或不支持cookie,也能够实现会话跟踪。
弊端:这意味着应用程序中的所有页面(至少是那些带有对其他页面引用的页面)都必须是JSP页面,这样页面引用才能以动态方式进行编码,如果遗漏了一个ur,那么服务就会失去对会话的跟踪。
因此,我们可以通过以下方式实现通过对URL重写实现会话跟踪:
page1.jsp关键代码:
<%=session.getId()%> <% String url = "page2.jsp?id=1"; String a = response.encodeURL("page2.jsp"); %> <a href='<%=a%>'>page2.jsp</a>
page2.jsp关键代码:
<% String id = request.getParameter("id"); %> <%=id %>
运行效果:
可以看到,page2的URL后边增加一个JSESSIONID 即当前会话的sessionID。这样便可实现在无cookie的情况下实现会话跟踪了。
3.Cookie
使用原理:
服务器默认创建一个Cookie回传给用户:(Cookie cookie = new Cookie("JSESSIONID",session.getId());response.addCookie(cookie);)此cookie的默认生命周期为关闭浏览器cookie即销毁,所以当浏览器关闭后,使用cookie实现的回话跟踪应用(如购物)将会失效。一般大型网站都是使用cookie来进行会话跟踪,以大幅减轻服务器的压力。
这里还要提一下会话cookie和持久cookie的区别 :
如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。
测试程序:
同样是page1.jsp和page2.jsp
page1.jsp关键代码:
<% Cookie cookie = new Cookie("ID", "jiangzhengnan"); cookie.setMaxAge(30*60);//设置放置sessionId的cookie的生命周期为30分钟 response.addCookie(cookie); %> <a href='page2.jsp'>page2.jsp</a>
page2.jsp关键代码:
<% Cookie cookies[]=request.getCookies(); Cookie sCookie=null; String svalue=null; String sname=null; for(int i=0;i<cookies.length;i++){ sCookie=cookies[i]; svalue=sCookie.getValue(); sname=sCookie.getName(); out.write("name:["+sname + "] value:["+svalue + "]"); } %>
运行图示:
可以看到最后是我自己设置的cookieid
4.Session
session的生命周期和原理在文章开头已经详述过了,这里就不再赘述。
= =这个就比较容易实现,直接上代码吧
page1.jsp:
<% session = request.getSession(); session.setAttribute("username","nangua"); %> <a href='page2.jsp'>page2.jsp</a>
page2.jsp:
<%session = request.getSession(); %> <%=session.getAttribute("username")%><br>
问题三:Cookie和Session的区别
1:位置:
Cookie是存在浏览器中的,Session是存在服务器中的。
2:安全性:
Cookie的安全性要低于Session,因为Cookie可能会被用户禁用,而且黑客可以分析存放在本地的Cookie并进行Cookie欺骗。
3:数据存储方式:
Session的数据是存在服务器内存中,关掉浏览器,会清空Session。
临时性Cookie存在浏览器的缓存中,关掉浏览器,会清空
永久性Cookie是存在临时文件中,到达有效期前,一直存在
4:存取方式比较(摘自网络):
Cookie中只能保存ASCII字符串,如果需要存取Unicode字符或者二进制数据,需要进行UTF-8、GBK或者BASE64等方式的编码。Cookie中也不能直接存取Java对象,若要存储稍微复杂的信息,使用Cookie是比较困难的。
而Session中可以存取任何类型的数据,包括String、Integer、List、Map等。Session中也可以直接保存JavaBean及至任何Java对象等,使用起来非常方便,可把Session看做是一个Java容器类。
5:对服务器的负担比较:
因为Session是保存在服务端的,如果用户数量极多,对服务器负担较大。
而Cookie是保存在客户端,不占用服务器资源,所以适合于大多数网站。
这里要注意:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
6:有效期比较(摘自网络):
要达到长久地记录用户的登录信息的效果,使用Cookie会是比较好的选择。只需要设置Cookie的maxAge属性为一个很大很大的数据字或者Integer.MAX_VALUE就可以了。Cookie的maxAge属性支持这样的效果。
使用Session理论上也能实现这种效果。只要调用方法setMaxInactiveInterval(Integer.MAX_VALUE)不就可以了么。但是由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的maxAge默认为-1,关闭了浏览器该Session就会失效,因此Session不能实现信息永久有效的效果。使用URL地址重写也不能实现。
而且如果设置Session的超时时间过长,服务器累计的Session就会越多,越容易导致内存溢出。
7:跨域名比较:
Cookie支持跨域名访问,例如将domain属性设置为“.helloweenvsfei.com”,则以它为后缀的所有域名均可以访问该Cookie。而Session则不会支持跨域名访问,仅在它所在的域名内有效。
写完发现不知不觉已经快1点半了= =本来想写点什么留给未来の自己看的感慨的话,然而现在应该做的就是滚上床睡觉吧2333333333
继续努力~
不要懈怠~
上一篇: 自定义标签库函数
下一篇: css优化篇 - beidan