当前位置: 首页 > 知识库问答 >
问题:

在Shiro注销期间销毁SessionScoped CDI bean

易星纬
2023-03-14

问题是在达到会话超时之前不会销毁会话范围的bean。

因此,对于以下注销程序,我有两个问题:

  1. 这是使用shiro注销的正确方法吗(请参阅下面的logout())
  2. 注销期间销毁CDI会话范围bean的正确方法是什么。

page.xhtml:

<p:commandLink ajax="false" actionListener="#{myOtherBean.logout}" />

null

豆类:

@Named
@SessionScoped
public class mySessionBean implements Serializable {
}

@Named
@SessionScoped
public class myOtherBean extends Observable implements Serializable {
    @Inject
    private Subject subject;

    public void logout(){

      subject.logout();

// this line throws the exception
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();

      FacesContext.getCurrentInstance().getExternalContext()
            .redirect(servlet.getContextPath() + "/logout");
    }
}

shiro.ini:

[main]
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
securityManager.sessionManager = $sessionManager
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
securityManager.sessionManager.sessionDAO = $sessionDAO
....
logout=org.apache.shiro.web.filter.authc.LogoutFilter
logout.redirectUrl = /login.xhtml

....
[urls]
/logout = logout

例外情况:

调用FacesContext.GetCurrentInstance().GetExternalContext().InvalidateSession();时引发以下异常

 java.lang.IllegalStateException:
 org.apache.shiro.session.UnknownSessionException:
 There is no session with id [e5939658-c033-4e67-984f-23cadfbc06fb]

附加信息:我正在运行WildFly8.2.0.final。

多谢了。

共有1个答案

司徒嘉祥
2023-03-14

下面是我在项目中使用的代码,也许是因为您的bean是SessionScoped,而我的bean是viewscoped?:

@Named
@ViewScoped
public class Authenticator implements Serializable {

    public void logout() {
        SecurityUtils.getSubject().logout();
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        FacesContext.getCurrentInstance().getExternalContext().redirect(LOGIN_URL);
    }
}
 类似资料:
  • 问题内容: 我在hapijs中使用jwt插件和策略。 我可以在登录用户时创建jwt令牌,并通过’jwt’策略使用同一令牌对其他API进行身份验证。 我将令牌设置为cookie,其中是令牌名称。另外,我没有将这些令牌保存在数据库中。 但是,注销时如何销毁jwt令牌? 请提出一种方法。 问题答案: JWT存储在浏览器中,因此删除令牌以删除客户端的cookie 如果您还需要在令牌到期之前从服务器端使令牌

  • 销毁 Destroy 在不需要使用iScoll的时候调用iScroll实例的公共方法destroy()可以释放一些内存。 myScroll.destroy(); myScroll = null;

  • 问题内容: 我正在使用Cookies模块来设置cookie。这是我的代码: 但是在文档中,我还没有找到如何 销毁 该Cookie的方法。 任何建议,将不胜感激。 问题答案: 无法根据HTTP规范删除cookie。为了有效地“删除” cookie,您可以将过期日期设置为过去的某个日期。本质上,这将为您带来以下收益(根据Cookies模块文档): 或根据HTTP规范: 两者都应该起作用。您可以替换与一

  • 对象使用完之后需要对其进行清除。对象的清除是指释放对象占用的内存。在创建对象时,用户必须使用 new 操作符为对象分配内存。不过, 在清除对象时,由系统自动进行内存回收,不需要用户额外处理。这也是 Java 语言的一大特色,某种程度上方便了程序员对内存的管理。 Java 语言的内存自动回收称为 垃圾回收(Garbage Collection)机制,简称 GC。垃圾回收机制是指 JVM 用于释放那些

  • 问题内容: 据我所知(很少),给出了两种方法: 然后: 其他更好的方法?我在这里劈头发吗? 问题答案: 您正在寻找。 但是要考虑到 您不能显式销毁对象。 它会保留在那里,但是如果您取消设置对象,并且脚本将PHP推入内存限制,则不需要的对象将被垃圾回收。我会选择(而不是将其设置为null),因为它似乎具有更好的性能(未经测试,但已记录在PHP官方手册的注释中)。 也就是说,请记住,PHP总是在页面被

  • 如果一个具有静态存储持续时间的对象的构造函数的完成或动态初始化在另一个对象的完成之前被排序,则第二个对象的析构函数的完成将在第一个对象的析构函数的启动之前被排序。[注:此定义允许并发销毁。-结束注] 第二个和第一个的完成析构函数可能在不同的线程中吗?