欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaWeb Session 会话管理实例详解

程序员文章站 2024-03-12 20:36:26
session会话简介 会话是指在一段时间内,用户使用同一个浏览器进程与web应用之间的交互过程。 会话(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 )

浏览器和服务器的关系如下两图:

JavaWeb Session 会话管理实例详解

JavaWeb Session 会话管理实例详解

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的值,查询结果如下:

JavaWeb Session 会话管理实例详解

并且jsessionid为2bb51ebdeaaf14d19656c71e1b6f9ff6

然后马上换成不禁用cookie模式,输入另一个名字如tom,查询结果自然会是两个tom,jsessionid为

203f9e4db5d874476b81daf350661b6a,与禁用是不一样,这就使出现下面的结果了

然后此时我们将浏览器关闭,再次进入浏览器,在不禁用cookie模式下查看访问结果,如下:

JavaWeb Session 会话管理实例详解

下面我将主要的代码贴上来:

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 会话管理,希望对大家有所帮助