Struts2通过session暂存登录信息

来源:互联网 发布:绿色 视力 知乎 编辑:程序博客网 时间:2024/05/21 11:37
在互联网发展的初期阶段,网站都是由静态页面组成,主要是文字,图片等内容,用户只能下载查看网页信息,不能和网站服务器交互。所以HTTP协议被设计成了一种无状态协议,也就是说,服务器不保存页面的状态,后访问的页面不知道前面访问的页面的信息。 
  
随着互联网的发展,电子商务,电子政务等基于互联网的应用程序逐渐的多了起来,很多时候,这种基于无状态的HTTP协议已不能满足需求。举一个很简单的例子,比如网上购物,浏览选择商品和结算页面一般不是同一个页面,结算页面需要知道之前选择了那些商品。我们的例子也存在这样的问题,登陆成功页面需要知道登陆页面登陆的用户信息,才能根据不同的用户不同的权限控制他们可以访问哪些页面。 
  
为了解决这个问题,就需要把登陆信息保存在服务器的内存中,供多个页面共享。这片服务器的内存在JSP和Servlet里就是Session对象。我们只要在用户登陆成功后把用户信息保存在Session对象中就可以了。那么怎么在Action中访问Session对象呢?在Struts1.x中,Action中execute的方法的参数包含代表当前请求的Request对象,可以从Requset对象中取得Session对象。在Struts2中,Action已经不包含Request等信息,Action完全可以不继承任何类,虽然说这样做肯定有它的好处,但确实给我们带来了麻烦,怎么办呢? 
  
其实很简单,查找一下Struts2的帮助我们就可以找到答案(struts-2.0.6\docs\docs\how-do-we-get-access-to-the-session.html)。有两种方法,我们才用比较简单的,通过ActionContext类的静态方法getContext().getSession();取得Session对象。和ActionSupport一样,我们需要先导入com.opensymphony.xwork2包下的ActionContext类:
在Login.java的import com.opensymphony.xwork2.ActionSupport;上面添加:
import com.opensymphony.xwork2.ActionContext;导入包。 
  
然后在execute()方法的return SUCCESS;代码前加入如下代码:
Map attibutes = ActionContext.getContext().getSession();
   
attibutes.put("username", username);
attibutes.put("password", password); 
  
这样我们就把登陆的用户名和密码保存在了Session对象中。 
  
为了测试,可以在Success.jsp中添加如下代码:
<br>登陆用户名:<s:property value="#session.username"/>
<br>登陆密  码:<s:property value="#session.password"/> 
  
部署项目,启动Tomcat,然后在浏览器中输入:
http://localhost:8080/tutorial/Login!input.action 
分别输入用户名和密码为scott和tiger,单击Submit提交网页,如果在Success.jsp中显示如下信息: 

登录成功..................... 
登陆用户名:scott 
登陆密 码:tiger 
原创粉丝点击