2010-04-16 69 views
1

嗨任何一个可以请告诉我这是学习会话管理这是学习java会话管理

+0

试着看一下Google,你会发现更好的一个,你可以从roseIndia学习一些, – gmhk 2010-06-18 05:45:39

回答

3

也许你会发现这个articleguide有帮助的最佳方式的最佳途径。

编辑

从文章由布赖恩·罗素以上:

会话跟踪维护信息或状态,有关网站访问者,因为他们从页面移动到页面的过程。由于没有内置的机制,它需要Web开发人员进行一些工作。从浏览器到Web服务器的连接发生在无状态超文本传输​​协议(HTTP)上。

有很多方法可以处理会话跟踪,但我们的重点是Java Servlet规范提供的易用但功能强大的HttpSession接口。在进入HttpSession接口之前,让我们看看维护状态的其他方法。

会话跟踪技术
在一次Web开发人员使用的网站访问者的IP地址来跟踪会话。这种方法不灵活,有许多缺陷。主要问题是代理服务器不使用单独的IP地址。用户不再有独特的地址,所以这种技术无法正常工作。处理会话跟踪的另一种方法是使用HTML隐藏字段:

<INPUT TYPE="hidden" NAME="user"VALUE="Jennifer"> 

这种技术所需的服务器端脚本,将动态生成包含“用户”字段中的HTML代码。服务器端代码也需要读取该字段并将其与服务器上关于此用户的信息进行匹配。

另一个会话跟踪技术是URL重写。在这种方法中,标识字段被附加到网站每个URL的末尾。以下HTML代码演示了此方法:

<A HREF="/orderform.htm?user=Jennifer">Order Now!</A> 

此方法类似于隐藏字段。区别在于隐藏字段只能用于表单。

会话跟踪的常用方法是使用cookie。 Cookie是存储为名称/值对并从服务器传输到浏览器的信息。包含唯一用户信息的Cookie可用于将特定访问者与服务器上的信息绑定。 Java Servlet规范提供了一个简单的Cookie API,允许您编写和检索Cookie。完整的API可以在Sun的Java Web站点http://java.sun.com上找到。下面的代码演示如何创建一个新的Cookie:

Cookie user = new Cookie("user","Jennifer"); 
user.setMaxAge(3600); 
response.addCookie(user); 

这段代码创建“用户”和“珍妮”的值的名字的cookie。从浏览器接收cookie的时间起,cookie的截止日期通过setMaxAge()方法设置为3,600秒。下面的代码演示了如何检索值对于特定的Cookie:

String user = ""; 
Cookie[] cookies = request.getCookies(); 
if (cookies != null) { 
for (int i = 0; i < cookies.length; i++) { 
    if (cookies[i].getName().equals("user")) user = cookies[i].getValue(); 
    } 
} 

在此代码,饼干的阵列从使用的getCookies()方法HttpServletRequest对象检索。该数组遍历,直到名称为“user”的cookie由getName()方法返回。一旦找到cookie,就会调用getValue()方法来检索cookie的值。

Cookie的使用为处理会话跟踪提供了灵活而简单的选项;但是,它确实存在一些问题。 Cookie中的信息以文本文件的形式存储在客户端的浏览器中,可以很容易地读取和操作,并且这些信息在互联网上不安全地传输。但主要问题是可以通过Web浏览器中的设置禁用它们。依靠Cookie进行会话跟踪的网站将无法跟踪已禁用Cookie的用户。

会议在Java中
我们已经看过了迄今所有的会话管理技术有一个共同的安全问题:他们以纯文本形式传输数据。需要功能强大的会话跟踪解决方案,这更加安全灵活。这就是Java HttpSession API的来源.HttpSession API提供了一种简单的机制,用于在应用程序服务器上存储有关各个用户的信息。该API提供对可用于存储其他对象的会话对象的访问。在面向对象的环境中工作时,将对象绑定到特定用户的能力非常重要。它使您可以快速有效地保存和检索JavaBeans,以便识别您网站的访问者,保存产品信息以显示在您的网上商店中,或追踪潜在客户放入购物车的产品。

会话对象是在应用程序服务器上创建的,通常在Java servlet或JavaServer Page中创建。该对象存储在应用程序服务器上,并为其分配一个称为会话ID的唯一标识符。会话对象和会话ID由应用程序服务器上的会话管理器处理。图1说明了这种关系。由应用程序服务器分配的每个会话ID都有零个或多个与其关联的键/值对。这些值是您在会话中放置的对象。为每个对象分配一个名称,并且每个名称都必须包含一个对象,因为不允许使用null。

要使会话跟踪技术发挥作用,会话ID必须发送到客户端计算机。 Cookie用于在网站访问者的计算机上存储会话ID。这由应用程序服务器自动处理。只需创建会话对象并开始使用它。默认情况下,应用程序服务器将创建会话ID并将其存储在cookie中。每次请求页面时,浏览器都会将cookie发送回服务器。应用程序服务器通过服务器的会话管理器将会话cookie中的会话ID与会话对象进行匹配。然后将会话对象放置在HttpServletRequest对象中,并使用getSession()方法检索它。 CIO,首席技术官&开发人员资源

正如我们前面所讨论的,一些网站访问者将在其浏览器中禁用Cookie。要解决此问题并继续使用会话,请在代码中使用URL重写。 URL重写会将会话ID附加到请求的每个页面的URL。这里唯一的问题是您必须重写HTML代码中的每个链接以及从servlet到servlet或从servlet到JSP的链接。

URL重写的过程非常简单,只需要使用HttpServletResponse接口中的两个方法。这两个方法encodeURL()和encodeRedirectURL()用于将会话ID附加到URL。这允许服务器在用户浏览网页时跟踪用户,但需要重写每个URL。只有当服务器确定它是必需的时,方法返回的字符串才会将会话ID附加到它。如果用户的浏览器支持cookie,则返回的URL不会被更改。另外,如果应用程序服务器配置为不使用URL重写,则返回的URL将不会更改。被更改的URL的格式将根据不同的应用程序服务器实现而有所不同;然而,通用格式将是一个参数的添加,例如“sessionID = uniqueIDnumber”。参数名称(在本例中为“sessionID”)通常通过服务器上的配置设置进行控制。参数的值(在本例中为“uniqueIDnumber”)是服务器会话管理器分配的唯一会话ID,是一系列字母和数字。从一个JSP的HTML代码下面的行创建一个链接到另一个JSP:

<A HREF="/products/product.jsp">Product Listing</A> 

点击此链接将用户发送到product.jsp页面。使用URL重写,相同的代码将写入如下:

<A HREF="<%= response.encodeURL("/products/product.jsp") 
%>">Product Listing</A> 

encodeURL()方法返回的字符串将包含会话ID。上一个Tomcat 3.2应用服务器,这行代码的结果将是:

<A HREF="http://www.yourservername.com/products/ 
product.jsp;$sessionid$xxxx">Product Listing</A> 

的XXXX实际上是由所述服务器产生的唯一的会话ID。另一种可用于重写URL的方法是encodeRedirectURL()。它仅用于调用HttpServlet-Response接口的sendRedirect()方法的servlet或JSP中。下面的代码是一个标准的重定向声明:

response.sendRedirect("http://www.yourservername.com/products/sale.jsp"); 

使用URL重写,代码为:

response.sendRedirect(response.encodeRedirectURL("http://www.yourservername.com/products/sale.jsp")); 

应用程序服务器处理的encodeRedirectURL()方法比encodeURL有点不同()方法;但是,每种方法都会产生相同的结果。

您现在应该很好地了解如何跟踪会话ID并将其与服务器上的会话对象进行匹配。使用会话对象的第一步是创建它。方法getSession()用于创建一个新的会话对象并检索一个已经存在的会话对象。 getSession()方法传递一个布尔标志true或false。假参数表示您要检索已存在的会话对象。一个真实的参数让会话管理器知道如果一个会话对象不存在,就需要创建一个会话对象。以下代码行演示如何使用getSession():

HttpSession session = request.getSession(true); 

getSession()方法将返回会话对象。如果尚不存在新的会话对象,则会创建一个新的会话对象。服务器使用会话ID来查找会话对象。如果在Cookie或URL中找不到会话ID,则会创建一个新的会话对象。在Web应用程序中,您可能只使用带有true参数的getSession()方法。这可能是您的网站的起点,可能是在访问者成功登录之后。应用程序中的其他servlet应该使用getSession(false)方法。这将返回当前会话对象或null。如果不存在,它不会生成新的会话。

在Java Servlet规范中定义了许多方法。 (您可以在http://java.sun.com上找到完整的API。)您最常使用的方法以及我们将重点关注的方法如下:

setAttribute(String name,Object value):将对象绑定到此会话使用名称指定。什么都不返回(void)。 getAttribute(String name):返回在此会话中使用指定名称绑定的对象;如果在此名称下没有绑定任何对象,则返回null。 removeAttribute(String name):从此会话中删除与指定名称绑定的对象。什么都不返回(void)。 invalidate():使此会话失效并解除与其绑定的所有对象的绑定。什么都不返回(void)。 isNew():如果客户端不知道会话或者客户端选择不加入会话,则返回值为true的布尔值。

有关使用会话的示例,我们将查看可用于允许客户查看其帐户信息的在线银行应用程序的会话管理代码。应用程序的设计将遵循模型 - 视图 - 控制器(MVC)架构。模型或数据和业务逻辑将由JavaBean表示;该视图将通过JavaServer Pages;并且应用程序的控制将由servlet处理。这些示例中的想法可以轻松地在其他类型的Web应用程序中实现。

在线银行应用程序应该有一个HTML登录页面,客户可以在表单中输入登录名和密码。表单将提交(或张贴)名称和密码到登录servlet。 servlet需要做的第一件事是验证用户名和密码。要坚持主题(会话),我们只会看看处理会话所需的代码。在客户验证之后,可以创建一个Customer JavaBean。 Customer bean将包含关于此访问者的基本信息,并将存储在会话中。我们想要创建一个新的会话对象,但是我们也想让一个可能已经存在的会话失效。为此,我们需要检索现有对象(或创建一个新对象),并使用isNew()方法检查它是否为新会话。如果它不是新的会话对象,我们需要使用invalidate()方法使其失效。在servlet,我们可以用下面的代码实现这一点:

HttpSession session = request.getSession (true); 
if (session.isNew() == false) { 
    session.invalidate(); 
    session = request.getSession(true); 
} 

的代码的第一行产生一个新的会话对象,或检索现有的。第二行通过检查isNew()的值来查看会话是否是新的。一个真实的告诉你,会议刚刚创建;一个错误意味着这个用户已经有一个会话,你需要使它失效。用户有旧会话的一个可能原因是他或她有两个账户并登录到另一个账户,然后尝试登录另一个账户。

您现在可以将Customer JavaBean添加到会话以供将来使用。将对象放入会话对象的过程称为绑定。客户对象可以绑定使用setAttribute()方法如下对话:

session.setAttribute("CustomerBean", Customer); 

因为我们在银行的网站工作,安全是头等大事。为了安全起见,每个JSP和servlet都需要在显示任何信息之前验证此用户是否为授权客户。为了实现这个目的,每个servlet应该包含在会话中查找Customer对象的代码,并将任何没有此对象的客户发送到登录页面。以下代码处理此问题:

Customer customerBean = (Customer) 
session.getAttribute('CustomerBean'); 
if (customerBean == null) { 
    response.sendRedirect 
    ("https://www.yourservername.com/login.htm"); 
    return; 
} 

如果用户正确登录,客户将在会话中拥有有效的客户JavaBean。会话中不存在的名称上的getAttribute()将始终返回null。具有空值的访问者需要登录,因此我们将其重定向到登录页面。该代码应该放置在JSP的顶部,以防止未经授权使用该网站。代码也应该放在servlet中。请记住,JSP会为您创建会话变量,而在servlet中,您必须自己创建它。请记住,这只是处理网站安全性的一种方法。一些Web应用程序服务器将为您处理身份验证和授权。这个例子只是会话管理的简单演示。您的Web应用程序可能需要更高级的安全措施。

您可能已经注意到getAttribute()方法返回的对象被强制转换为Customer对象。这对绑定到会话的任何对象都是必需的。该对象作为对象类型存储在会话中。要在你的代码中使用这个对象,你必须将它转换(或转换)为它所对象的类型。

当客户在您的网站上移动时,他们可能希望检索有关其账户的各种信息。例如,他们可以通过点击菜单选项来查看他们的支票帐户余额。遵循MVC体系结构,链接会将它们发送给一个servlet来验证他们的身份,然后创建一个CheckingAccount JavaBean。然后使用setAttribute()方法将该对象存储在会话中,然后servlet将客户发送到使用CheckingAccount JavaBean的JSP来显示有关客户帐户的信息。

有时您可能需要在JavaBean以外的会话中存储某些内容,例如文本字符串或数字。您需要记住,您只能将对象绑定到会话。文本可以存储为一个String对象。您可以将一个数字作为Integer对象放入会话中。下面的代码演示如何保存文本会话中的一条线,一个数字:

session.setAttribute("text","A line of text."); 
session.setAttribute("number", new Integer(10750)); 

记住投的对象,他们被检索时:

String myText = (String) session.getAttribute("text"); 
int myNumber = ((Integer) session.getAttribute('number')).intValue(); 

由于会话是很容易使用,你可能会过度使用它。从servlet到JSP的简单消息可以作为String对象放置在会话中,但这不是最有效的方式。很快你会发现你的会话加载了消息,并且大部分都不再需要。如果你发现你在会话中来回传递简单的字符串,也许你应该考虑把这些消息包装在一个特殊的JavaBean中。这将使会议更有条理。网站的每个用户的会话对象都存储在服务器的内存中。将不必要的信息投入会话会减少服务器的内存资源。在会话中仅存储重要信息,并在完成对象后使用removeAttribute()方法清除对象。

会话的使用不仅会让您更轻松地为网站编程,还可以帮助用户更好地进行Web访问。使用bean和会话允许您编写为每个用户定制的JSP。对于我们的银行业务情景,我们可以使用Customer bean中的信息为每个访客创建个性化页面。我们也可以使用该bean为客户预先填充表单。例如,您可以使用JavaBean存储来自访问者填写的表单的结果,以请求提供有关服务的信息。如果用户忘记填写必填字段,则可以使用JavaBean存储来自servlet的错误消息,然后将其显示在JSP中。您也可以填写访问者刚刚填写的字段,而不是让访问者再次填写表单。

该会话不打算用作存储关于访问者的信息的永久性地点。每次访问者每次登录时都会分配一个新的会话。如果要存储有关个人用户的信息,则需要后端数据库。该会话应该只用于在访问您的网站期间跟踪用户。如果您拥有一个大型网站并运行多个冗余应用程序服务器,则需要一台可以处理跨服务器会话的应用程序服务器。这通常通过将会话信息放入数据库而不是本地内存来处理,以便每个应用程序服务器都可以访问信息。许多商业应用程序服务器将能够为您做到这一点。

结论
使用会话跟踪的是因为当今的Web站点的复杂性的一个重要的设计问题。作为Java开发人员,我们可以通过使用HttpSession API访问强大且健壮的会话管理器。我们在本文中介绍的会话示例涵盖了会话API的主要功能。学习Java的所有会话管理功能将使您作为Web开发人员的工作更轻松,并帮助您为Web站点访问者创建更好的体验。