struct2 问题求教 在struct2在第一个登陆action中session中放了user的信息,当我重起浏览器的时候,已不同的用户登陆,session中所取到的是前一个使用session的用户的信息,而当我刷新页面的时候又取到的是当前用户的信息,很纠结 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 缓存呀 浏览器缓存 另外像大家推荐个JAVA技术交流群8319449 1. 缓存2. 代码中session是怎么赋值的3. 后台如果是servlet,注意session不能用作全局变量。。不然容易导致session多线程共享问题 我的意思是在我使用debug调试的时候,session在不同的登录用户居然取到的是相同的值,我使用的是struct2 package com.oa.action;import java.util.List;import org.apache.struts2.ServletActionContext;import com.oa.factory.BeansFactory;import com.oa.model.Employee;import com.oa.model.Priviledge;import com.oa.service.EmployeeService;import com.oa.service.PriviledgeService;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;public class EmployeeAction extends ActionSupport { private EmployeeService employeeService; private PriviledgeService priviledgeService; private String userName; private String passWord; public EmployeeAction() { employeeService = (EmployeeService) BeansFactory.getBean("employeeService"); priviledgeService =(PriviledgeService)BeansFactory.getBean("priviledgeService"); } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } public String login() { Employee result = employeeService.getEmployee(userName, passWord); if (result != null) { ServletActionContext.getRequest().getSession().setAttribute("user", result); String roleName= result.getEmployeeRoleName(); List<Priviledge> priviledges= priviledgeService.getPriviledges(roleName); ActionContext.getContext().getSession().put("priviledges", priviledges); return ActionSupport.SUCCESS; } return ActionSupport.ERROR; }}这个是登录的action类 public MailAction() { messageService = (MessageService) BeansFactory .getBean("messageService"); employeeService = (EmployeeService) BeansFactory .getBean("employeeService"); departService = (DepartService) BeansFactory.getBean("departService"); }// 初始化通讯录 public String prepare() { Employee user = (Employee)ServletActionContext.getRequest().getSession().getAttribute("user"); List<Employee> employees = employeeService.getEmployeeTotal(user .getEmployeeID()); List<Depart> departs = departService.getDeparts(); if (employees != null) { request.put("employees", employees); request.put("departs", departs); return ActionSupport.SUCCESS; } return ActionSupport.ERROR; }这里的,prepare对应一个action的方法,但当浏览器重起,使用多个用户登录时,从session中获取user总是最先调用这个方法的那个用户的信息,而如果刷新页面又取到的数据是正确的这个问题真的很纠结 前面也实用化了实现sessionaware接口,就是因为出现上面我所说的情况,所以换成了这种方法来获取session中的值,但任然没有解决,还是出现了一样的问题 我还真没有把数据放到session中。 是可以这么做。问题不在这里。你是在getAttribute("user")后马上print出来看到值不对劲的吗?那可就奇怪了。 的确是这样的,我就是在用debug调试的时候,发现在不同的用户登陆调用这个方法时,发现取出来得到是同一个用户,很纠结,由于最近在忙着考试,所以上网时间少,所以回应的比较慢,不好意思 你说的不同用户是什么意思??????你程序里的不同用户?你要清空session..把它可以设置一下.关闭浏览器就销毁session 注意一点,session并不一定关闭浏览器就失效,默认session失效时间为30分钟 你前面贴的代码没问题的。两个Action是怎么配置的呢? <package name="EmployeeAction" namespace="/employee" extends="struts-default"> <action name="login" class="com.oa.action.EmployeeAction" method="login"> <result name="success">/MyOffice.jsp</result> <result name="error">/error.jsp</result> </action> <action name="writeMail" class="com.oa.action.MailAction" method="prepare"> <result name="success">/MyOffice.files/writeMail.jsp</result> <result name="error">/error.jsp</result> </action> <action name="write" class="com.oa.action.MailAction" method="write"> <result name="sendsuccess">/MyOffice.files/mailList.jsp</result> <result name="draftsuccess">/MyOffice.files/draftList.jsp</result> <result name="error">/error.jsp</result> </action> <action name="sendMail" class="com.oa.action.MailAction" method="send"> <result name="success">/MyOffice.files/mailList.jsp</result> <result name="error">/error.jsp</result> </action> <action name="deleteMail" class="com.oa.action.MailAction" method="senderDelete"> <result name="success">/MyOffice.files/mailList.jsp</result> <result name="error">/error.jsp</result> </action> <action name="receiveMail" class="com.oa.action.MailAction" method="receive"> <result name="success">/MyOffice.files/receiveMail.jsp</result> </action> <action name="deleteReceiveMail" class="com.oa.action.MailAction" method="receiveDelete"> <result name="success">/MyOffice.files/mailList.jsp</result> </action> <action name="recycleMail" class="com.oa.action.MailAction" method="recycle"> <result name="success">/MyOffice.files/recycleMail.jsp</result> </action> <action name="detailMail" class="com.oa.action.MailAction" method="read"> <result name="success">/MyOffice.files/viewMail.jsp</result> </action> <action name="showMail" class="com.oa.action.MailAction" method="detail"> <result name="success">/MyOffice.files/detailMail.jsp</result> </action> <action name="draftMail" class="com.oa.action.MailAction" method="draft"> <result name="success">/MyOffice.files/draftList.jsp</result> </action> <!-- ajax请求 --> <action name="unRead" class="com.oa.action.MailAction" method="getUnRead"></action> <action name="UnReadMessages" class="com.oa.action.MailAction" method="unReadMessages"> <result name="success">/MyOffice.files/receiveMail.jsp</result> </action> <action name="recycle" class="com.oa.action.MailAction" method="recycleMessage"> <result name="success">/MyOffice.files/receiveMail.jsp</result> </action> </package> 我就是搞不懂为啥,我感觉配置都没问题啊,但就是在我重起浏览器的时候,打开多个窗口以不同用户登录时,当访问同一个页面的时候,调试发现从session中取出的是同一个用户的信息,但如果我刷新页面的时候在访问那个页面从session中就取到的是不同的用户信息,所以我不知道咋改 session是服务器端缓存,如果你账户登录后退出时没有清理session就会出现这情况,或者是你多个账户同时登录 共用了一个session 一般,同一种浏览器,哪怕启动多个进程,它们也属于同一个Session。另外,可以注意/MyOffice.jsp页面中对其他页面的include逻辑是否正常。 /MyOffice.jsp页面中对其他页面的include逻辑是否正常。这个,我使用的是frame布局,MyOffice.jsp页面中包含三块,上左右<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><% String path = request.getSession().getServletContext() .getContextPath() + "/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN"><HTML> <HEAD> <TITLE>MyOffice 首页</TITLE> <META http-equiv=Content-Type content="text/html; charset=utf-8"> <META content="MSHTML 6.00.2900.5848" name=GENERATOR> </HEAD> <FRAMESET id=index border=0 frameSpacing=0 rows=120,* frameBorder=no> <FRAME id=topFrame name=topFrame src="<%=path %>MyOffice.files/Top.jsp" noResize scrolling=no> <FRAMESET border=0 frameSpacing=0 frameBorder=no cols=20%,*> <FRAME id=leftFrame name=leftFrame src="<%=path %>MyOffice.files/Left.jsp" noResize scrolling=no> <FRAME id=mainFrame name=mainFrame src="<%=path %>MyOffice.files/EmployeeMgr.htm" scrolling=auto> </FRAMESET> </FRAMESET><script type="text/javascript"> window.location.reload(); </script></HTML> 我的意思是,如果说writeMail这个Action其实是在login之前执行的,那么session取值可能是login之前的用户信息。而再刷新的话就会取到login之后的值。23楼代码看不出来明显的问题。 我的意思是,如果说writeMail这个Action其实是在login之前执行的,那么session取值可能是login之前的用户信息。而再刷新的话就会取到login之后的值。这个问题是这样的两个用户都登陆了以后,才进行对writeMail的依次请求的 同一台机器、同一种浏览器软件,无法做到两个用户同时都登陆,这种情况下你只能拥有同一个Session。 ActionContext.getContext().getSession().put("user",result);//用这个方法来释放你的session 试一下看页面获取<% session.getAttribute("user"); %> 浏览器缓存吧,<% response.setHeader("Pragma","No-cache,no-store"); response.setHeader("Cache-Control","no-cache,no-store"); response.setDateHeader("Expires", 0); %>再页面用这个试下,清除浏览器缓存 对不起没表述清楚,是这样的: 当我启动浏览器时;打开第一个窗口使用第一个用户登录,然后我又打开了一个新窗口,使用第二个用户登录,然后第一个用户去访问一个资源后,第二个用户再去访问跟第一个一样的资源时,断点发现在第二个用户的session中取到的是第一个用户的信息 这两个用户应该是同一个Session,因而这种相互之间混淆的情形是比较好理解的。你可以在页面中输出Session ID进行验证:<%out.print(session.getId());%> 1、清除缓存2、SESSION过期时间 【请教】HibernateDaoSupport与hibernateTemplate的区别 ukey在客户端加密后,服务器端怎么解密呢? myeclipse 新手求解hibernate关联映射 affuse中如何其它引用包 java初级教程,无意中看到的,初学的朋友们还是可以看看,第一课 JAVA概述述 JSP动作组件错误 ssh问题 菜鸟问题:我想学mvc模式,该学习什么框架最合适?struts还是其他什么?在线~~~ 急问:J2EE构架 图片页面显示 为什么在web.xml中给jsp配置<init-param>要添加<servlet-mapping>
2. 代码中session是怎么赋值的
3. 后台如果是servlet,注意session不能用作全局变量。。不然容易导致session多线程共享问题
import com.oa.factory.BeansFactory;
import com.oa.model.Employee;
import com.oa.model.Priviledge;
import com.oa.service.EmployeeService;
import com.oa.service.PriviledgeService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;public class EmployeeAction extends ActionSupport { private EmployeeService employeeService;
private PriviledgeService priviledgeService;
private String userName; private String passWord;
public EmployeeAction() { employeeService = (EmployeeService) BeansFactory.getBean("employeeService");
priviledgeService =(PriviledgeService)BeansFactory.getBean("priviledgeService");
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPassWord() {
return passWord;
} public void setPassWord(String passWord) {
this.passWord = passWord;
} public String login() { Employee result = employeeService.getEmployee(userName, passWord); if (result != null) {
ServletActionContext.getRequest().getSession().setAttribute("user", result);
String roleName= result.getEmployeeRoleName();
List<Priviledge> priviledges= priviledgeService.getPriviledges(roleName);
ActionContext.getContext().getSession().put("priviledges", priviledges);
return ActionSupport.SUCCESS;
}
return ActionSupport.ERROR;
}
}
这个是登录的action类
public MailAction() { messageService = (MessageService) BeansFactory
.getBean("messageService"); employeeService = (EmployeeService) BeansFactory
.getBean("employeeService"); departService = (DepartService) BeansFactory.getBean("departService");
}
// 初始化通讯录
public String prepare() { Employee user = (Employee)ServletActionContext.getRequest().getSession().getAttribute("user");
List<Employee> employees = employeeService.getEmployeeTotal(user
.getEmployeeID()); List<Depart> departs = departService.getDeparts(); if (employees != null) { request.put("employees", employees); request.put("departs", departs); return ActionSupport.SUCCESS;
}
return ActionSupport.ERROR;
}这里的,prepare对应一个action的方法,但当浏览器重起,使用多个用户登录时,从session中获取user总是最先调用这个方法的那个用户的信息,而如果刷新页面又取到的数据是正确的这个问题真的很纠结
你是在getAttribute("user")后马上print出来看到值不对劲的吗?那可就奇怪了。
你要清空session..把它可以设置一下.关闭浏览器就销毁session
两个Action是怎么配置的呢?
<action name="login" class="com.oa.action.EmployeeAction"
method="login">
<result name="success">/MyOffice.jsp</result>
<result name="error">/error.jsp</result>
</action> <action name="writeMail" class="com.oa.action.MailAction"
method="prepare">
<result name="success">/MyOffice.files/writeMail.jsp</result>
<result name="error">/error.jsp</result>
</action> <action name="write" class="com.oa.action.MailAction" method="write">
<result name="sendsuccess">/MyOffice.files/mailList.jsp</result>
<result name="draftsuccess">/MyOffice.files/draftList.jsp</result>
<result name="error">/error.jsp</result>
</action> <action name="sendMail" class="com.oa.action.MailAction"
method="send">
<result name="success">/MyOffice.files/mailList.jsp</result>
<result name="error">/error.jsp</result>
</action>
<action name="deleteMail" class="com.oa.action.MailAction"
method="senderDelete">
<result name="success">/MyOffice.files/mailList.jsp</result>
<result name="error">/error.jsp</result>
</action> <action name="receiveMail" class="com.oa.action.MailAction"
method="receive">
<result name="success">/MyOffice.files/receiveMail.jsp</result>
</action>
<action name="deleteReceiveMail" class="com.oa.action.MailAction"
method="receiveDelete">
<result name="success">/MyOffice.files/mailList.jsp</result>
</action> <action name="recycleMail" class="com.oa.action.MailAction"
method="recycle">
<result name="success">/MyOffice.files/recycleMail.jsp</result>
</action>
<action name="detailMail" class="com.oa.action.MailAction"
method="read">
<result name="success">/MyOffice.files/viewMail.jsp</result>
</action> <action name="showMail" class="com.oa.action.MailAction"
method="detail">
<result name="success">/MyOffice.files/detailMail.jsp</result>
</action>
<action name="draftMail" class="com.oa.action.MailAction"
method="draft">
<result name="success">/MyOffice.files/draftList.jsp</result>
</action>
<!-- ajax请求 -->
<action name="unRead" class="com.oa.action.MailAction" method="getUnRead"></action>
<action name="UnReadMessages" class="com.oa.action.MailAction"
method="unReadMessages">
<result name="success">/MyOffice.files/receiveMail.jsp</result>
</action>
<action name="recycle" class="com.oa.action.MailAction" method="recycleMessage">
<result name="success">/MyOffice.files/receiveMail.jsp</result>
</action>
</package>
这个,我使用的是frame布局,MyOffice.jsp页面中包含三块,上左右<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%
String path = request.getSession().getServletContext()
.getContextPath()
+ "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">
<HTML>
<HEAD>
<TITLE>MyOffice 首页</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META content="MSHTML 6.00.2900.5848" name=GENERATOR>
</HEAD>
<FRAMESET id=index border=0 frameSpacing=0 rows=120,* frameBorder=no>
<FRAME id=topFrame name=topFrame
src="<%=path %>MyOffice.files/Top.jsp" noResize scrolling=no>
<FRAMESET border=0 frameSpacing=0 frameBorder=no cols=20%,*>
<FRAME id=leftFrame name=leftFrame
src="<%=path %>MyOffice.files/Left.jsp" noResize scrolling=no>
<FRAME id=mainFrame name=mainFrame
src="<%=path %>MyOffice.files/EmployeeMgr.htm" scrolling=auto>
</FRAMESET>
</FRAMESET>
<script type="text/javascript"> window.location.reload();
</script>
</HTML>
23楼代码看不出来明显的问题。
这个问题是这样的两个用户都登陆了以后,才进行对writeMail的依次请求的
<%
session.getAttribute("user");
%>
<%
response.setHeader("Pragma","No-cache,no-store");
response.setHeader("Cache-Control","no-cache,no-store");
response.setDateHeader("Expires", 0);
%>
再页面用这个试下,清除浏览器缓存
当我启动浏览器时;打开第一个窗口使用第一个用户登录,然后我又打开了一个新窗口,使用第二个用户登录,然后第一个用户去访问一个资源后,第二个用户再去访问跟第一个一样的资源时,断点发现在第二个用户的session中取到的是第一个用户的信息
你可以在页面中输出Session ID进行验证:
<%
out.print(session.getId());
%>
2、SESSION过期时间