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

无效会话与CDI JSF不工作

竺鸿骞
2023-03-14

我正在尝试在我的应用程序中实现注销,因此我做了以下操作:

public String logout(){
    try{
        FacesContext facesContext = FacesContext.getCurrentInstance();  
        ExternalContext ex = facesContext .getExternalContext();  
        ex.invalidateSession(); 
        return "success"; 
    }catch(Exception e){
        return "error";
    }
}

但是当我检查用户是否登录时,它说是:

public class AuthenticateListener implements PhaseListener {


    @Override
    public void afterPhase(PhaseEvent event) {
        AuthorizedUser authorized = (AuthorizedUser) Util.getHandler("authorized");
        if (authorized.getUser() == null) {
            System.out.println("Not Logged");
        } else {
            System.out.println("Logged");
        }
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        // TODO Auto-generated method stub

    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }

}

我错过什么了吗?在使会话无效后,我是否应该获得一个新的AuthorizedUser实例(sessionScoped)?

编辑:如果有人需要,添加getHandler;)

public static Object getHandler(String handlerName) {

    FacesContext facesContext = FacesContext.getCurrentInstance();
    ELContext elContext = facesContext.getELContext();
    ELResolver resolver = facesContext.getApplication().getELResolver();

    Object uh = resolver.getValue(elContext, null, handlerName);
    return uh;
}

共有2个答案

单于高逸
2023-03-14

在注销方法中使用这段代码:

HttpSession oldsession = (HttpSession) FacesContext
                .getCurrentInstance().getExternalContext().getSession(false);
oldsession.invalidate();

这会奏效的。如果对你有帮助,请告诉我。

卫华奥
2023-03-14

会话在当前请求-响应中仍然可用。在下一个请求中不再可用。您需要在无效后发送重定向,以便浏览器将被指示在给定的网址上发送新请求。

return "success?faces-redirect=true"; 

或者,如果您仍在使用老式的导航案例(返回值表明,使用文件名为“success”的视图很奇怪),那么添加

如果这仍然不起作用,那么问题在于如何在会话中存储用户。例如,它实际上存储在应用程序范围中,当您将CDI@Named与JSF@SessionScoped混合使用时,或者当您将登录用户指定为静态变量而不是实例变量时,可能会发生这种情况。

  • 如何使JSF 2.0中的会话无效?
  • 使用j_security_check在JavaEE/JSF中执行用户身份验证

 类似资料:
  • 问题内容: 我在2个不同的服务器中有2个应用程序-Tomcat(基本上是.WAR文件)和jBoss中的EAR。 EAR是可重用的应用程序,在这里我将对用户进行身份验证并将控件发送回Tomcat上的应用程序。进行身份验证时,我正在jBoss应用程序上创建一个会话对象。 当我将控件发送回Tomcat上的应用程序时,我将询问用户是否要注销身份验证应用程序。如果用户按下“是”按钮,我将不得不从身份验证应用

  • 因此,我尝试使用JSF托管bean上的方法访问HttpSession的属性 但是我得到了一个 为什么啊? 在我的一个会话bean被销毁之前,我需要访问该会话打开的外部服务的连接列表,它们当然存储在会话属性对象上。 我该怎么做?

  • 问题内容: 我正在研究的一个项目使用Spring 2.5和JPA,并将Hibernate用作提供程序。 我的DAO类扩展了JpaDaoSupport,因此我使用getJpaTemplate()方法获取了JpaTemplate。 后端数据库可以通过我的应用程序或第三方应用程序进行更改。 当第三方应用程序更改数据库(主要是配置数据更改)时,我需要为应用程序的用户提供一种使所有JPA会话无效并重新加载新

  • 在我的Vaadin应用程序中,当Vaadin在“session Timeout”消息之后没有使会话无效时,我遇到了一个问题。收到此消息后,用户有时可以单击链接或刷新页面,并继续工作,就像他们仍在登录一样。我使用以下参数: Last参数(session-timeout)也在context.xml(session-timeout=900)和web.xml(session-config/session-

  • 需要一些帮助!!我对Drools中的有状态和无状态会话没有清晰的理解。我正在努力理解这一点,所以尝试了一个例子。 我在drools6.5版本上使用有状态和无状态会话测试了下面的drl,在这两种情况下都得到了相同的输出。根据我对无状态会话的理解,它应该只执行第一条规则,当应用程序对象在第一条规则中被修改时,第二条规则不应该被激活(“有效期”)。附加源代码。感谢您在这方面的帮助。

  • 我正在创建一个配置文件页面和一个登录页面,在其中存储会话id,然后在配置文件文件中检查是否设置了isset,但我遇到的问题是,系统总是显示一条错误消息,并且我使用了print\r($\u session);浏览器显示: 重要数据丢失阵列([名字]= 如何修复此错误?????