JavaWeb Session 会话管理实例详解
session会话简介
会话是指在一段时间内,用户使用同一个浏览器进程与web应用之间的交互过程。
会话(session)通常用来跟踪用户的状态,缓存用户在此浏览器进程中的信息。
当用户关闭浏览器,上一个session也就无法再次获得了(cookie的maxage为-1的情况)。再次打开新的浏览器,将开始一个新的会话。
类javax.servlet.http.httpsession。每一个httpsession代表用户的一个会话。
每一个session的过期时间默认为30分钟。
当浏览器第一次访问服务器时,无论先访问哪一个页面,服务器就会给用户分配一个唯一的会话标识,即jsessionid然后以cookie的形式返回给用户。
下图是一个响应头(下图是基于servlet3.0的,在servlet2.5中没有httponly属性)
服务器给每个用户创建一个会话,即httpsession对象,保存在服务器端。
那么,当用户再次访问服务器时,服务器是如何知道还是当前用户呢?
当浏览器再次访问服务器时,会携带包含了jsessionid的cookie访问服务器。服务器根据此id返回此用户的httpsession对象,就保持了会话。
( 那么,是否可以在不同的浏览器上实现同一个同一个会话呢?
下面是一个典型的url,它带有一定的欺骗作用,可以在不同的浏览器上实现同一个会话:
http://localhost:8080/day07_2/cncookieservlet;jsessionid=f8692d61cd46d094dbb7a8fc7387649c )
浏览器和服务器的关系如下两图:
httpsession:
在servlet中,通过httpservletrequest.getsession方法获取会话对像。
httpsession接口的以下方法用于向会话范围内共享数据:
getattribute(“name”) setattribute(“name”,object); getattributenames() removeattrubute(“name”)
invalidate(); - 此方法强力删除服务器缓存的session.
示例:
在一个servlet的向httpsession中setattribute设置某些值。
通过超连接,或其他方式转到其他servlet并通过getattribute显示信息。
在任意servlet中调用getattribute显示信息。
关闭此浏览器,重新访问获取信息的servlet,你会发现已经没有信息了。
如下:
string name=request.getparameter("name"); request.setattribute("name", "request---"+name); request.getsession().setattribute("name", "session---"+name); getservletcontext().setattribute("name", "application---"+name);
session的唯一标识id:
每一个session都一个唯一标识,即id。
当浏览器获取一个新的session时,用户即可以通过session.geid();打印出id的值 。
在不关闭浏览器的情况下,在多个页面上跳转,使用的是同一个session。
如:
request.getsession().getid()
何为安全退出:
用户退出时,应该当将自己的信息从session中清除-即安全退出。
安全退出是为了将自己在服务器上留下的信息清除干净,以防被黑
session.invalidate();
1、request.getsession().invalidate();
如此可将session池中的相对应的对象删除
2、session.removeattribute(…)
如:
request.getsession().removeattribute("realcode");
用于删除session对象中的属性
通过重写url来跟踪会话:
前面已经说过,servlet容器先在客户端保存一个sessionid,以后,在浏览器发出http请求时,都会包含这个sessionid.servlet容器读取http请求中的这个sessionid,根据这个sessionid从容器中取出httpsession对像,以便于跟踪http请求属于哪一个会话,这一过程称为会话的跟踪。
如果浏览器支持cookie,servlet容器就将sessionid作为cookie保存在浏览器的客户端。但如果出于安全的考虑,用户禁用了cookie,那么servlet容器又如何来跟踪会话呢?
首先让我们在ie中禁用cookie(注意:对于某些ghost的系统不起作用)。
ie>工具>internet选项>隐私>高级,然后禁用cookie:
我们可以在主页加上这样的超链接:(与下面代码中相关的saveservlet.java getservlet.java logoutservlet.java的代码我放在最后面贴)
<h2>演示重写url技术---破解用户禁用cookie之后,我们session无效的问题</h2> <form action="<%=response.encodeurl("saveservlet") %>" method="post"> name:<input type="text" name="name"/><br/> <input type="submit"/> </form> <a href="<%=response.encodeurl("getservlet") %>">重写url-读取几个容器中的数据</a><br/> <a href="<%=response.encodeurl("logoutservlet") %>">重写url-安全退出</a>
这句<form action=“<%=response.encodeurl(“/aa”)%>”>就可以实现这一功能
在这里禁用了cookie以后,浏览器仍然能够接收到服务器发送过来的cookie,但是浏览器只能接受不能发送出去给服务器,不能发送cookie的话也就不能够去session池中去取相应的对象了。
上面的代码在表单里面输入想要的值之后,再到下面的getservlet这里的超链接处访问看是不是仍然能够显示出输入的值,答案是肯定的。这里的访问路径就相当于类似
http://localhost:8080/day07_2/cncookieservlet;jsessionid=f8692d61cd46d094dbb7a8fc7387649c 的,后面带的jsessionid=f8692d61cd46d094dbb7a8fc7387649c就是其id,如此,你到另一个浏览器中去输入这个网址也能够访问的到。
这里我要补充一下:(以下情况是在我将session池中httpsession对象将对应session的jsessionid值和value值写入cookie中,这个cookie会覆盖系统造的那个,就相当于是我自己造的,我将存在时间设置成了十分钟,如果不覆盖的话,cookie在浏览器关闭时就会消亡,下面的现象也就不会出现了)
在是否禁用了cookie这两种情况下在session池中新建的对象的id是不一样的,即假如你在禁用了cookie时在表单中输入了一个name的值,查询结果如下:
并且jsessionid为2bb51ebdeaaf14d19656c71e1b6f9ff6
然后马上换成不禁用cookie模式,输入另一个名字如tom,查询结果自然会是两个tom,jsessionid为
203f9e4db5d874476b81daf350661b6a,与禁用是不一样,这就使出现下面的结果了
然后此时我们将浏览器关闭,再次进入浏览器,在不禁用cookie模式下查看访问结果,如下:
下面我将主要的代码贴上来:
saveservlet.java
package cn.hncu.servlets.session; import java.io.ioexception; import java.io.printwriter; import javax.servlet.servletexception; import javax.servlet.http.cookie; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class saveservlet extends httpservlet { public void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { dopost(request, response); } public void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { response.setcontenttype("text/html;charset=utf-8"); printwriter out = response.getwriter(); request.setcharacterencoding("utf-8"); string name=request.getparameter("name"); request.setattribute("name", "request---"+name); request.getsession().setattribute("name", "session---"+name); getservletcontext().setattribute("name", "application---"+name); //把cookie技术和session技术联合起来做应用的一个例子---※功能:让用户在关闭浏览器之后,如果10分钟之内能够登录本站,还能访问到session中的信息 //向客户端写一个key为"jsessionid"用value为sessionid的cookie, cookie c=new cookie("jsessionid", request.getsession().getid()); c.setmaxage(60*10);//上面的现象就是这一句造成的,没有这一句的话就不会有上面说的现象了 c.setpath(request.getcontextpath()); response.addcookie(c); out.println("保存成功..."); out.flush(); out.close(); } }
getservlet.java
package cn.hncu.servlets.session; import java.io.ioexception; import java.io.printwriter; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class getservlet extends httpservlet { public void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { response.setcontenttype("text/html;charset=utf-8"); printwriter out = response.getwriter(); out.println("<!doctype html public \"-//w3c//dtd html 4.01 transitional//en\">"); out.println("<html>"); out.println(" <head><title>a servlet</title></head>"); out.println(" <body>"); string reqname=(string) request.getattribute("name"); string sename=(string) request.getsession().getattribute("name"); string appname=(string) getservletcontext().getattribute("name"); out.println(reqname+"<br/>"); out.println(sename+"<br/>"); out.println(appname+"<br/>"); out.println(" </body>"); out.println("</html>"); out.flush(); out.close(); } }
logoutservlet.java
package cn.hncu.servlets.session; import java.io.ioexception; import java.io.printwriter; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class logoutservlet extends httpservlet { public void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { response.setcontenttype("text/html;charset=utf-8"); printwriter out = response.getwriter(); //安全退出---只要让session对象无效就可以了 request.getsession().invalidate(); out.println("已安全退出..."); } }
以上所述是小编给大家介绍的javaweb session 会话管理,希望对大家有所帮助