当前位置: 移动技术网 > IT编程>开发语言>Java > JavaWeb Session 会话管理实例详解

JavaWeb Session 会话管理实例详解

2019年07月22日  | 移动技术网IT编程  | 我要评论
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 )

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


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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网