如何在struts2中设置和销毁会话变量?

如何在struts2中设置和销毁会话变量?,struts2,session-variables,destroy,Struts2,Session Variables,Destroy,我是Struts2的初学者。我在PHP中使用,在登录时将身份验证保存在会话变量中,我可以在注销后销毁该变量。我想知道如何在Struts2中执行相同的过程:在登录时设置会话变量,在注销时销毁会话变量。多谢各位 更新(附加解决方案) 除了有用的答案和评论外,我们还可以使用: session.remove("session_var_name"); // instead of session.clear(); 删除一个确切的会话变量,而不是删除所有会话变量。谢谢大家。您可以执行以下操作之一 publi

我是Struts2的初学者。我在PHP中使用,在登录时将身份验证保存在会话变量中,我可以在注销后销毁该变量。我想知道如何在Struts2中执行相同的过程:在登录时设置会话变量,在注销时销毁会话变量。多谢各位

更新(附加解决方案)

除了有用的答案和评论外,我们还可以使用:

session.remove("session_var_name"); // instead of session.clear();

删除一个确切的会话变量,而不是删除所有会话变量。谢谢大家。

您可以执行以下操作之一

public class MyAction extends ActionSupport implements ServletRequestAware
{
    private HttpServletRequest httpServletRequest;

    public void setServletRequest(HttpServletRequest request)
    {
        this.httpServletRequest = request;
    }

    public String login()
    {
        httpServletRequest.getSession(false).setAttribute("key", your_session_object);
        return SUCCESS;
    }

    public String logout()
    {
        httpServletRequest.getSession(false).removeAttribute("key");
        return SUCCESS;
    }
}

public class MyAction extends ActionSupport implements SessionAware
{
    private Map sessionMap;

    public void setSession(Map map)
    {
        this.sessionMap = map;
    }

    public String login()
    {
        sessionMap.put(key, your_session_object);
        return SUCCESS;
    }

    public String logout()
    {
        sessionMap.remove(key);
        return SUCCESS;
    }
}

第二种选择,即实现
SessionAware
,是首选,因为它保护您免受
Servlet
API的影响。

您可以执行以下操作之一

public class MyAction extends ActionSupport implements ServletRequestAware
{
    private HttpServletRequest httpServletRequest;

    public void setServletRequest(HttpServletRequest request)
    {
        this.httpServletRequest = request;
    }

    public String login()
    {
        httpServletRequest.getSession(false).setAttribute("key", your_session_object);
        return SUCCESS;
    }

    public String logout()
    {
        httpServletRequest.getSession(false).removeAttribute("key");
        return SUCCESS;
    }
}

public class MyAction extends ActionSupport implements SessionAware
{
    private Map sessionMap;

    public void setSession(Map map)
    {
        this.sessionMap = map;
    }

    public String login()
    {
        sessionMap.put(key, your_session_object);
        return SUCCESS;
    }

    public String logout()
    {
        sessionMap.remove(key);
        return SUCCESS;
    }
}

第二种选择,即实现
SessionAware
,是首选,因为它保护您不受
Servlet
API的影响。

您可以在调用注销时使用范围拦截器,并且在struts xml配置中使用“end”类型,拦截器将null设置为会话对象:

<action name="scopea" class="com.mevipro.test.action.ScopeActionA">
    <result name="success" type="dispatcher">/jsp/test.jsp</result>
    <interceptor-ref name="basicStack"/>
    <interceptor-ref name="scope">
        <param name="key">funky</param>
        <param name="session">person</param>
        <param name="type">start</param>
    </interceptor-ref>
</action>
<action name="scopeb" class="com.mevipro.test.action.ScopeActionB">
    <result name="success" type="dispatcher">/jsp/test.jsp</result>
    <interceptor-ref name="scope">
        <param name="key">funky</param>
        <param name="session">person</param>
        <param name="type">end</param>
    </interceptor-ref>
    <interceptor-ref name="basicStack"/>
</action>

您可以在调用注销时使用范围拦截器,在struts xml配置中使用“end”类型,拦截器将会话对象设置为null:

<action name="scopea" class="com.mevipro.test.action.ScopeActionA">
    <result name="success" type="dispatcher">/jsp/test.jsp</result>
    <interceptor-ref name="basicStack"/>
    <interceptor-ref name="scope">
        <param name="key">funky</param>
        <param name="session">person</param>
        <param name="type">start</param>
    </interceptor-ref>
</action>
<action name="scopeb" class="com.mevipro.test.action.ScopeActionB">
    <result name="success" type="dispatcher">/jsp/test.jsp</result>
    <interceptor-ref name="scope">
        <param name="key">funky</param>
        <param name="session">person</param>
        <param name="type">end</param>
    </interceptor-ref>
    <interceptor-ref name="basicStack"/>
</action>

如果你能自己用谷歌搜索,它只需要很少的时间。会话:
Map Session=ActionContext.getContext().getSession()
,对于
注销
,您可以执行
会话。清除()我找到了一个关于实现SessionAware类的解决方案,他们没有提到Map session=ActionContext.getContext().getSession(),这是因为实现了该接口吗?还是他们忘了你说的指示?谢谢,您不需要实现
SessionAware
,检查
ActionContext.SESSION的api文档,您可以在servlet环境中获得会话@Jaiwo99但是您应该实现
SessionAware
,出于可测试性的原因,它比
ActionContext
更受欢迎。另外,请尽量不要链接到这些文档的古老版本,尤其是当当前版本不在同一个地方时:)如果你可以自己用谷歌搜索它,它只需要很少的时间。会话:
Map Session=ActionContext.getContext().getSession()
,对于
注销
,您可以执行
会话。清除()我找到了一个关于实现SessionAware类的解决方案,他们没有提到Map session=ActionContext.getContext().getSession(),这是因为实现了该接口吗?还是他们忘了你说的指示?谢谢,您不需要实现
SessionAware
,检查
ActionContext.SESSION的api文档,您可以在servlet环境中获得会话@Jaiwo99但是您应该实现
SessionAware
,出于可测试性的原因,它比
ActionContext
更受欢迎。另外,请尽量不要链接到文档的旧版本,特别是当当前版本不在同一个位置时:)注意使用
ServletRequestAware
几乎永远不会是首选,因为它将您的操作与servlet API绑定。@DaveNewton您是对的,但是他需要知道
ServletRequestAware
,因为它也能完成任务。我会编辑这篇文章。谢谢!这正是我所需要的:)但需要注意的是,使用
ServletRequestAware
几乎永远不会是首选,因为它将您的操作与servlet API联系起来。@DaveNewton您是对的,但他需要知道
ServletRequestAware
,因为它也能完成任务。我会编辑这篇文章。谢谢!这正是我所需要的:)