在struct2在第一个登陆action中session中放了user的信息,当我重起浏览器的时候,已不同的用户登陆,session中所取到的是前一个使用session的用户的信息,而当我刷新页面的时候又取到的是当前用户的信息,很纠结

解决方案 »

  1.   

    缓存呀   浏览器缓存  另外像大家推荐个JAVA技术交流群8319449
      

  2.   

    1. 缓存
    2. 代码中session是怎么赋值的
    3. 后台如果是servlet,注意session不能用作全局变量。。不然容易导致session多线程共享问题
      

  3.   

    我的意思是在我使用debug调试的时候,session在不同的登录用户居然取到的是相同的值,我使用的是struct2
      

  4.   

    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类
      

  5.   


    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总是最先调用这个方法的那个用户的信息,而如果刷新页面又取到的数据是正确的这个问题真的很纠结
      

  6.   

    前面也实用化了实现sessionaware接口,就是因为出现上面我所说的情况,所以换成了这种方法来获取session中的值,但任然没有解决,还是出现了一样的问题
      

  7.   

    我还真没有把数据放到session中。
      

  8.   

    是可以这么做。问题不在这里。
    你是在getAttribute("user")后马上print出来看到值不对劲的吗?那可就奇怪了。
      

  9.   

    的确是这样的,我就是在用debug调试的时候,发现在不同的用户登陆调用这个方法时,发现取出来得到是同一个用户,很纠结,由于最近在忙着考试,所以上网时间少,所以回应的比较慢,不好意思
      

  10.   

    你说的不同用户是什么意思??????你程序里的不同用户?
    你要清空session..把它可以设置一下.关闭浏览器就销毁session
      

  11.   

    注意一点,session并不一定关闭浏览器就失效,默认session失效时间为30分钟
      

  12.   

    你前面贴的代码没问题的。
    两个Action是怎么配置的呢?
      

  13.   

    <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>
      

  14.   

    我就是搞不懂为啥,我感觉配置都没问题啊,但就是在我重起浏览器的时候,打开多个窗口以不同用户登录时,当访问同一个页面的时候,调试发现从session中取出的是同一个用户的信息,但如果我刷新页面的时候在访问那个页面从session中就取到的是不同的用户信息,所以我不知道咋改
      

  15.   

    session是服务器端缓存,如果你账户登录后退出时没有清理session就会出现这情况,或者是你多个账户同时登录 共用了一个session
      

  16.   

    一般,同一种浏览器,哪怕启动多个进程,它们也属于同一个Session。另外,可以注意/MyOffice.jsp页面中对其他页面的include逻辑是否正常。
      

  17.   

    /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>
      

  18.   

    我的意思是,如果说writeMail这个Action其实是在login之前执行的,那么session取值可能是login之前的用户信息。而再刷新的话就会取到login之后的值。
    23楼代码看不出来明显的问题。
      

  19.   

    我的意思是,如果说writeMail这个Action其实是在login之前执行的,那么session取值可能是login之前的用户信息。而再刷新的话就会取到login之后的值。
    这个问题是这样的两个用户都登陆了以后,才进行对writeMail的依次请求的
      

  20.   

    同一台机器、同一种浏览器软件,无法做到两个用户同时都登陆,这种情况下你只能拥有同一个Session。
      

  21.   

    ActionContext.getContext().getSession().put("user",result);//用这个方法来释放你的session 试一下看页面获取
    <%
    session.getAttribute("user");
     %>
      

  22.   

    浏览器缓存吧,
    <%
    response.setHeader("Pragma","No-cache,no-store"); 
    response.setHeader("Cache-Control","no-cache,no-store"); 
    response.setDateHeader("Expires", 0);  
    %>
    再页面用这个试下,清除浏览器缓存
      

  23.   

    对不起没表述清楚,是这样的:
          当我启动浏览器时;打开第一个窗口使用第一个用户登录,然后我又打开了一个新窗口,使用第二个用户登录,然后第一个用户去访问一个资源后,第二个用户再去访问跟第一个一样的资源时,断点发现在第二个用户的session中取到的是第一个用户的信息
      

  24.   

    这两个用户应该是同一个Session,因而这种相互之间混淆的情形是比较好理解的。
    你可以在页面中输出Session ID进行验证:
    <%
    out.print(session.getId());
    %>
      

  25.   

    1、清除缓存
    2、SESSION过期时间