我正在尝试在我的应用程序中实现注销,因此我做了以下操作:
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;
}
在注销方法中使用这段代码:
HttpSession oldsession = (HttpSession) FacesContext
.getCurrentInstance().getExternalContext().getSession(false);
oldsession.invalidate();
这会奏效的。如果对你有帮助,请告诉我。
会话在当前请求-响应中仍然可用。在下一个请求中不再可用。您需要在无效后发送重定向,以便浏览器将被指示在给定的网址上发送新请求。
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);浏览器显示: 重要数据丢失阵列([名字]= 如何修复此错误?????