Struts2 - 会话故障

时间:2010-12-11 15:10:19

标签: session struts2 javabeans

我(通过此门户网站上的一些用户)制作实现SessionAware的应用程序。

这是我的实际代码:

public class UserManager extends ActionSupport implements SessionAware {
    private Map<String, Object> session;

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

    public void setSession(Map<String, Object> map) {
        this.session=map;
    }

    public String checkLogin() {        
        session.put("loggedOn", true);
        return SUCCESS;
    }

    public String checkLogout() {
        session.clear();
        return SUCCESS;
    }
}

我在.jsp上查看这些变量:

<s:if test="#session['loggedOn']!=true">
    DIV LOGIN
</s:if>
<s:else>
    DIV LOGOUT
</s:else>

一段简单的代码。

我想知道的是:

1 - bean是(默认情况下)请求作用域。因此,当请求完成时,它将被销毁。但是我看到,当我在Map中放置一个变量时,它仍然在服务器上存活。怎么可能?是我的Bean的变量。

2 - 谁调用了setSession方法?我认为servlet是由于我实现了这个接口的事实?

3 - 我想在会话对象上分离保存对象/ bean。我想使用Bean会话范围(对于任何类型的MVC框架)。我怎样才能在struts2上做到这一点?

希望你能说清楚这些问题:)干杯

1 个答案:

答案 0 :(得分:3)

1)你的bean是一个struts2动作,因此它是动作范围的(这是一个比请求更具限制性的范围)。我说该操作的范围较小,因为您可以将操作转发给另一个操作,在这种情况下,先前的操作超出范围,但请求范围的对象将保留在范围内,直到请求被提供。实现SessionAware时,会向您提供对SessionObject的引用,然后将对象放入Session对象中,该对象的生命周期比您的操作长得多。清除浏览器缓存将删除会话值...您也可以通过代码删除它们来实现SessionAware并从地图中删除值。

2 - 会话已存在。您可以获得会话并添加密钥,但即使您没有在其中添加任何内容,也可以使用它。

3 - 您已经有一个关于此主题的问题,请参阅我的答案。