JSF Problem wenn Session abgelaufen ist

Taste

Bekanntes Mitglied
Hallo zusammen,
ich habe folgendes Problem mit meiner Anwendung (JSF 1.2, Tomcat 5.5, Java 1.6):

Ich habe eine login.jsp, welche (unter anderem) einen Button enthält. Habe ich diese Seite nun im Browser aufgerufen und betätige die Schaltfläche, werden in der Bean die Logindaten geprüft und dann ein entsprechender Wert zurückgeliefert, der gemäß faces-config.xml eine Weiterleitung auslöst. So weit so gut.

Wenn nun aber die Seite länger ungenutzt geöffnet bleibt, und ich betätige dann den Button, dann wird die Seite scheinbar refresht, aber die Methode in der Bean wird nicht aufgerufen. Erst bei erneutem Betätigen passiert das oben Beschriebene.

Hat jemand eine Idee, wo mein Problem liegt? Was muss ich tun, damit die Methode sofort aufgerufen wird und nicht erst beim zweiten Versuch? Ich verzweifle gerade, denn ich finde die Ursache nicht...
Gruß, Nick
 

gp

Aktives Mitglied
Vielleicht einen Hellseher fragen :)
Ein paar Infos mehr sollten es schon sein...

Gesendet von meinem GT-P7501 mit Tapatalk 2
 
N

nillehammer

Gast
Wenn nun aber die Seite länger ungenutzt geöffnet bleibt, und ich betätige dann den Button, dann wird die Seite scheinbar refresht, aber die Methode in der Bean wird nicht aufgerufen. Erst bei erneutem Betätigen passiert das oben Beschriebene.

Hat jemand eine Idee, wo mein Problem liegt? Was muss ich tun, damit die Methode sofort aufgerufen wird und nicht erst beim zweiten Versuch? Ich verzweifle gerade, denn ich finde die Ursache nicht...
Kann man nur raten. Ich tippe mal darauf, dass Du die Seite im Browsercache hast und der Browser sie deswegen von dort lädt, anstatt den Request zum Server zu senden.
 

Taste

Bekanntes Mitglied
Hallo zusammen,

dann versuche ich mal mehr Infos zu geben...

Meine login.jsp:
Code:
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://facestrace.sourceforge.net" prefix="ft"%>

<%        
    response.setHeader("Pragma", "No-cache");
    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    response.setDateHeader("Expires", -1);
%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Cp1252" />
<link href="styles.css" rel="stylesheet" type="text/css" />
<title>FooBar</title>
</head>

<body>
	<f:view>
		<f:loadBundle basename="de.foo.bar.messageresource.messages"
			var="msgs" />
		<h:form>
			<h:panelGrid columns="1" styleClass="loginPage"
				rowClasses="navigationRow">
				<f:facet name="header">
					<f:subview id="state">
						<jsp:include page="stateArea.jsp" />
					</f:subview>
				</f:facet>
				
				<h:outputText id="a01" styleClass="label" value="" />
				
				<h:panelGrid columns="1" styleClass="loginGrid">

					<h:panelGrid columns="2" styleClass="whole"
						columnClasses="rightAligned, leftAligned" rowClasses="standardRow">
						<h:outputText styleClass="loginLabel"
							value="Username" />
						<h:selectOneMenu value="#{arcLoginManager.userID}"
							styleClass="loginMenuLabel" onchange="submit()"
							valueChangeListener="#{arcLoginManager.valueChange1}"
							immediate="true">
							<f:selectItems value="#{arcLoginManager.userRoleItems}" />
						</h:selectOneMenu>

					</h:panelGrid>
					<h:outputText value=" " />
					<h:commandButton styleClass="button"
						actionListener="#{arcLoginManager.actionListened1}"
						value="Login"
						action="#{arcLoginManager.loginAction1}" />

					<h:outputText id="a111" styleClass="loginErrorLabel"
						value="#{arcLoginManager.loginMessage}" />
				</h:panelGrid>
			</h:panelGrid>
		</h:form>
		<ft:trace />
	</f:view>
</body>

Meine stateArea.jsp:
Code:
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://facestrace.sourceforge.net" prefix="ft"%>

<h:panelGrid columns="3"  width="100%" styleClass="stateArea" columnClasses="leftAligned, centerAligned, rightAligned" rowClasses="stateRow">
	
	<h:graphicImage value="/foo.jpg" />
	
	<h:panelGrid columns="1">
		<h:outputText id="bigTitleLabel" styleClass="bigTitleLabel" value="FooBar" />
	</h:panelGrid>
	
	<h:graphicImage value="/bar.jpg" />
	
</h:panelGrid>

<h:panelGrid columns="2"  width="100%" styleClass="stateAreaBorder" columnClasses="stateRowSpacer, stateRowSpacer" rowClasses="">
	<h:outputLabel id="state04" value="" />
	
	<h:panelGrid columns="4" columnClasses="statesColumn, statesColumn" rowClasses="stateLabel, stateLabel, stateLabel">
		<h:outputLabel id="state02" value="Version" />
		<h:outputText id="labelStateArcMan" value="#{arcLoginManager.softwareVersion}" />
		<h:outputLabel id="state03" value="Angemeldet: " />
		<h:outputText id="labelStateLogin" value="#{arcLoginManager.activeUser}" />
	</h:panelGrid>
</h:panelGrid>

Meine Bean dahinter:
Java:
package de.foo.bar;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.faces.application.ViewHandler;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

public class LoginManager
{
   private static final String VERSION_NUMBER = "1.5.0";
   private String softwareVersion = "";

   Logger logger = Logger.getLogger( "LoginManager" );

   private String _uid = "Info";
   private String _pwd;

   private boolean admin = false;
   private boolean system = false;
   private boolean externOk = false;

   private boolean mayChangeProjectIdent = false;

   private String stateDb = "/rot.gif";
   private String stateArcMan = "/rot.gif";

   private String loginMessage = "";
   private String loginPreparationMessage = "";

   public CopyOfLoginManager( )
   {
      logger.info( "LoginManager() initialized!" );
   }

   public void refreshCurrentPage( )
   {
      FacesContext context = FacesContext.getCurrentInstance();
      String viewId = context.getViewRoot().getViewId();
      ViewHandler handler = context.getApplication().getViewHandler();
      UIViewRoot root = handler.createView( context, viewId );
      root.setViewId( viewId );
      context.setViewRoot( root );
   }

   public String getUserID( )
   {
      logger.debug( "getUserID() called" );
      return _uid;
   }

   public void setUserID( String uid )
   {
      logger.info( "setUserID: " + uid );
      _uid = uid;
   }

   public synchronized String getPassword( )
   {
      logger.debug( "getPassword() called" );
      return _pwd;
   }

   public synchronized void setPassword( String pwd )
   {
      logger.debug( "setPassword() called" );
      _pwd = pwd;
   }

   public String getStateArcMan( )
   {
      logger.debug( "getStateArcMan() called" );
      this.stateArcMan = "/gruen.gif";
      return stateArcMan;
   }

   public void setStateArcMan( String stateArcMan )
   {
      logger.debug( "setStateArcMan() called" );
      this.stateArcMan = stateArcMan;
   }

   public String getStateDb( )
   {
      logger.debug( "getStateDb() called" );
      stateDb = "/rot.gif";
      return stateDb;
   }

   public void setStateDb( String stateDb )
   {
      logger.debug( "setStateDb() called" );
      this.stateDb = stateDb;
   }

   public synchronized String loginAction1( )
   {
      FacesContext.getCurrentInstance().getExternalContext().getSession( true );
      logger.info( "loginAction1() called" );
      String action = "loginPass";
      return action;
   }

   public synchronized String valueChange1( ValueChangeEvent event )
   {
      logger.info( "valueChange1() called" );
      logger.info( "valueChange1 -> userID: " + getUserID() );
      logger.info( "valueChange1 -> userID_neu: " + event.getNewValue() );

      String action = "loginForward";

      setUserID( ( String ) event.getNewValue() );

      if( !"Info".equalsIgnoreCase( getUserID() ) )
      {
         FacesContext.getCurrentInstance().getApplication().getNavigationHandler()
               .handleNavigation( FacesContext.getCurrentInstance(), null, "loginForward" );
      }
      logger.info( "valueChange1 -> Action: " + action );
      return action;
   }

   public synchronized void actionListened1( ActionEvent event )
   {
      logger.info( "actionListened1() called" );
   }

   public synchronized String loginAction2( )
   {
      FacesContext.getCurrentInstance().getExternalContext().getSession( true );
      logger.info( "loginAction1() called" );
      String action = "loginPass";
      return action;
   }

   public String getActiveUser( )
   {
      Map sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
      logger.debug( "Active User: " + sessionMap.get( "activeUser" ) );
      return ( String ) sessionMap.get( "activeUser" );
   }

   public String logoutAction( )
   {
      logger.info( "logoutAction() called" );
      // ...
      return "loadLoginPage";
   }

   public boolean isAdmin( )
   {
      logger.debug( "isAdmin() called" );
      admin = false;
      if( getActiveUser().equals( "Administrator" ) )
      {
         admin = true;
      }
      return admin;
   }

   public void setAdmin( boolean admin )
   {
      logger.debug( "setAdmin() called" );
      this.admin = admin;
   }

   public String getSoftwareVersion( )
   {
      HttpSession session =
            ( HttpSession ) FacesContext.getCurrentInstance().getExternalContext()
                  .getSession( true );
      logger.debug( "getSoftwareVersion() called" );
      return VERSION_NUMBER;
   }

   public void setSoftwareVersion( String softwareVersion )
   {
      logger.debug( "setSoftwareVersion() called" );
      this.softwareVersion = softwareVersion;
   }

   public boolean isSystem( )
   {
      logger.debug( "isSystem() called" );
      system = false;
      if( getActiveUser().equals( "System" ) )
      {
         system = true;
      }
      return system;
   }

   public void setSystem( boolean system )
   {
      logger.debug( "setSystem() called" );
      this.system = system;
   }

   private static SelectItem[] userRoleItems = null;

   public SelectItem[] getUserRoleItems( )
   {
      logger.info( "getUserRoleItems() called" );
      if( userRoleItems == null )
      {
         List<String> userRolesList = new ArrayList<String>();
         userRolesList.add( "Info" );
         // ...
         userRoleItems = new SelectItem[ userRolesList.size() ];
         for( int i = 0; i < userRolesList.size(); i++ )
         {
            userRoleItems[ i ] = new SelectItem( userRolesList.get( i ) );
         }
      }
      return userRoleItems;
   }

   public boolean isExternOk( )
   {
      logger.debug( "isExternOk() called" );
      if( getActiveUser().equalsIgnoreCase( "System" )
            || getActiveUser().equalsIgnoreCase( "Administrator" ) )
      {
         externOk = true;
      }
      else
      {
         externOk = false;
      }
      return externOk;
   }

   public void setExternOk( boolean externOk )
   {
      logger.debug( "setExternOk() called" );
      this.externOk = externOk;
   }

   public String getLoginMessage( )
   {
      return loginMessage;
   }

   public void setLoginMessage( String loginMessage )
   {
      this.loginMessage = loginMessage;
   }

   public String getLoginPreparationMessage( )
   {
      return loginPreparationMessage;
   }

   public void setLoginPreparationMessage( String loginPreparationMessage )
   {
      this.loginPreparationMessage = loginPreparationMessage;
   }
}

Meine faces-config.xml:
[XML]<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<application>
<locale-config>
<default-locale>de</default-locale>
<supported-locale>de</supported-locale>
</locale-config>
<message-bundle>
de.foo.bar.messageresource.messages
</message-bundle>
</application>

<managed-bean>
<managed-bean-name>arcLoginManager</managed-bean-name>
<managed-bean-class>de.werum.archive.LoginManager</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>

<navigation-rule>
<navigation-case>
<from-outcome>loginPass</from-outcome>
<to-view-id>/pages/facilityPage.jsp</to-view-id>
<redirect />
</navigation-case>
<navigation-case>
<from-outcome>loginForward</from-outcome>
<to-view-id>/pages/loginPage2.jsp</to-view-id>
<redirect />
</navigation-case>
<navigation-case>
<from-outcome>loginFail</from-outcome>
<to-view-id>/pages/loginPage.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>

<navigation-rule>
<navigation-case>
<from-outcome>loadLoginPage</from-outcome>
<to-view-id>/pages/loginPage.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>

<navigation-rule>
<navigation-case>
<from-outcome>loadLogoutPage</from-outcome>
<to-view-id>/logout.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>

</faces-config>[/XML]

Mir ist aufgefallen, dass bei diesem "Reload" meiner Loginseite (wie oben beschrieben) die Methoden
Code:
getActiveUser( )
und
Code:
getSoftwareVersion()
aufgerufen werden, und auch das SelectOneMenu lädt seine Werte, nur der Button scheint "funktionslos" zu sein.

Ich hoffe, dies sind die gewünschten Mehrinfos, ansonsten bitte einfach fragen.

@nillehammer: Meine Vermutung ist auch, dass es ein Caching-Problem sein könnte, daher habe ich auf Deinen Hinweis hin die Zeilen bezüglich "caching" in meine Login.jsp eingefügt (s.o.), allerdings besteht das Problem immer noch...

Gruß, Nick
 

JimPanse

Bekanntes Mitglied
Mit dem Cache hat das nichts zu tun, wenn die Seite das längeren nicht mehr benutzt wurde, ist die Session abgelaufen und damit sind auch die Information über den Komponentenbaum/ Status verloren d.h. müssen diese Informationen erstmal neu erstellt werden - war eine unschönheit mit JSF 1.2 das man darauf schlecht reagieren konnte.

Lösung wäre:

1. Entweder State Saving von server auf client setzen [XML]
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
[/XML]

Die ViewState Informationen werden dann in der Seite in einem hidden field gespeichert und bei jedem request mit gesendet - ist aber nur für kleinere Anwendung ratsam.

2. Wenn ich mich noch erinnern kann - einen Phaselistener zu erstellen - ungefähr so:
Java:
public class MyPhaseListener implements PhaseListener {
public void afterPhase(PhaseEvent arg0) {
		final FacesContext facescontext = arg0.getFacesContext();
		if (facescontext.getViewRoot() == null) {
createViewRoot(facescontext,  "/pages/loginPage.jsp");
}

}
	public void beforePhase(PhaseEvent arg0) {
		// nothing to do
	}
	public PhaseId getPhaseId() {
	
		return PhaseId.RESTORE_VIEW;
	}
}
private void createViewRoot(FacesContext context, String viewId) {
		UIViewRoot view = context.getApplication().getViewHandler().createView(
				context, viewId);
		context.setViewRoot(view);
	}

Programmatisch die Seite neu erstellen - aber ist schon ein wenig her d.h. musst du ein wenig probieren.
 

Taste

Bekanntes Mitglied
Verflixt,

also ich habe beide von JimPanse vorgeschlagenen Wege ausprobiert und es hilft auch tatsächlich wenn ich mich auf der Loginseite befinde und diese längere Zeit ruhen lasse und so die Session abläuft.

Wenn ich mich aber irgendwo anders in meiner Anwendung befinde, und dann die Session abläuft, dann bleibt das Problem bestehen.

Ich habe in der web.xml Folgendes konfiguriert:

[XML] <error-page>
<error-code>500</error-code>
<location>/index.jsp</location>
</error-page>[/XML]

Ist dies vielleicht ein Fehler? Ich werde immer wenn die Session abläuft auf diese Seite geleitet, die wiederum einfach nur Folgendes enthält:
Code:
<html>
    <body>
        <jsp:forward page="faces/pages/loginPage.jsp" />
    </body>
</html>

Allerdings scheint der "Zustand" nicht der Gleiche zu sein, wie wenn ich die Seite "ordnungsgemäß" aufrufe...

Ganz schön mühsam, mangelndes Verständnis von Webanwendungen zu kompensieren ;-)
Gruß, Nick
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S AJAX/RestController Post Problem Web Tier 18
pkm Problem beim Import eines dynamischen Webprojekts als .zip Web Tier 2
O JSF Java Unsigned Applet PrivilegedActionException Problem Web Tier 2
F JSF preRenderView Problem Web Tier 0
J Funktion für AJAX - Problem mit Return Web Tier 14
S Problem mit Checkboxen im Servlet erkennen Web Tier 3
N JSF JSF Selected Item & GesBetrag Problem Web Tier 1
Shams Problem mit der verwirklichung einer Readmethode in einer Chatapplikation Web Tier 3
F JSF Problem mit Primefaces Web Tier 7
F JSF Problem mit Primefaces Web Tier 4
F JSP Problem mit Property Web Tier 0
D Java EE Servlet login Problem Web Tier 1
L java.io.NotSerializableException für domain Objekte - Design Problem? Web Tier 12
T JSF Character Encoding Problem Web Tier 2
T JSF Problem mit JSF und Foreign Key Tabellen Web Tier 8
H JSF Problem mit Converter Web Tier 2
M Zeichensatz Problem? Web Tier 3
K JSF websphere application server 8 tomahawk problem Unable to find resource Web Tier 3
D JSF RichFaces Tree-Beispiel Problem Web Tier 2
J JSF Problem mit Bearbeiten von Datensätzen Web Tier 7
M JSF Problem mit CSS und Unterverzeichnissen Web Tier 2
M JSP Problem beim deployen auf Tomcat Web Tier 2
P Servlet getWidth(); - getHight(); Problem Web Tier 3
J JSP Problem bei Hibernate mit JSP Web Tier 2
M JSF mit Tobago Problem: ServletContextListener Web Tier 5
J Facelets javascript compiler problem Web Tier 3
T Tomcat mit Servlets Problem Web Tier 7
T Servlet Problem bei gwt rpc Web Tier 7
S Servlet Problem mit Tomcat Web Tier 3
J JSF Kein Methodenaufruf mit Button möglich durch PhaseListener (redirect) Problem? Web Tier 2
P rich:panelMenuGroup --> expanded Parameter Problem Web Tier 3
F.S.WhiTeY Tmplating/CSS Problem bei JSF Web Tier 7
A ice:inputText Converter Problem Web Tier 2
B JSF Tomcat Windows Linux equals Problem Web Tier 3
R JSF JSF Composite Components: Problem mit Attributliste und Referenzierung Web Tier 2
M Problem mit Hibernate und GWT Web Tier 6
O JSP struts2 tag: Problem mit Dezimalzahlen Web Tier 2
P Struts Struts2 if tag Problem mit getText() Web Tier 3
B Java EE 6 Problem (EL) Web Tier 4
ruutaiokwu beanshell scope problem... Web Tier 7
P Problem mit HTML.Tag.OPTION Web Tier 3
N Problem mit Datei Streaming Web Tier 2
M Problem mit Verlinkung JSP Dynamische Tabelle Web Tier 7
S Architektur-Problem? 2 Servlets, ein Objekt Web Tier 4
F.S.WhiTeY JSF:org.apache.jasper.JasperException Problem Web Tier 2
H Richfaces - Taglib Problem gelb unterstrichen Ajax Output Web Tier 6
N Servlet: Problem mit getParameterValues Web Tier 4
7 Struts und Ajax. Problem mit Actions Web Tier 2
J GWT - RPC Problem Web Tier 6
F Problem mit JSF Anwendung Web Tier 9
I Logout - Problem => Bei Zurück Web Tier 2
I AJAX - Problem Web Tier 18
F Problem mit Struts Web Tier 2
I selectOneMenu - Problem Web Tier 6
H Firefox Background-Image Problem Web Tier 4
E GWT Server-Client Problem Web Tier 3
J Log4j problem Web Tier 7
F Problem mit der Methode request.getRemotePort() Web Tier 2
S GWT Problem Web Tier 4
M Problem mit Velocity Web Tier 2
S OSGi Bundle Problem - ClassNotFound Web Tier 4
J JSF Locales Problem Web Tier 3
J Problem mit Login Web Tier 4
MQue jsp- Problem Web Tier 4
P Problem der Parameterübergabe aus Iframe Web Tier 15
A Tomcat: beim Start des Servers einmalige Aktion aufrufen (Problem gelöst) Web Tier 2
R JSF <rich:datatable> problem Web Tier 4
S JSF Problem - Terminverwaltung - Ändern eines vorhandenen Termins Web Tier 2
S Filter Problem? Web Tier 6
E Problem mit t:saveState Web Tier 7
S Problem mit Anzeige zweier JSP's Web Tier 4
M Problem mit JSP und Bean Web Tier 2
F RichFaces, Problem mit PickList Web Tier 2
S Problem mit Servlet und Zugriff auf Orace XE Datenbank Web Tier 2
E Problem mit request.getParameter Web Tier 5
B getServletContext.getRealPath("/") Problem Web Tier 6
C Problem mit Hibernate und IceFaces Web Tier 2
S Problem mit Session - Übergabe von Kontext zu Kontext Web Tier 2
H problem bei Parameterübergabe mit beans Web Tier 3
U JSP form-Daten (ohne name-Attribut) an Servlet = Problem Web Tier 6
S jsf: übles problem mit <f:convertDateTime> Hilfe! Web Tier 2
A Selectbox Problem in JSP Web Tier 12
T Problem bei Session-Timeout Web Tier 3
S problem mit resultset Web Tier 6
U Problem bei Validierung mit Struts 2 Web Tier 1
A JSF-Ctrl h:inputText Problem mit Umlauten Web Tier 4
A Dojo: Tab deaktivieren wenn in einem Listenfeld ein bestimmter Wert steht Web Tier 3
M JSP PrimeFaces LayoutUnits <- breite lässt sich nicht erzwingen wenn 'center' Web Tier 0
M fileUploadListener geht nicht wenn Element zur Laufzeit gerendert wird Web Tier 2
S Weiterleitung, wenn angemeldet Web Tier 8
I JSF: String abschneiden, wenn zu lang Web Tier 2
G JSP/JSF Inputtext rerender wenn Value geändert wird Web Tier 2
I Gleiche Session von EJB Container in JSF Container verwenden? Web Tier 21
R Session löschen Web Tier 3
J Session ist nach Klick auf Zurück-Button wieder aktiv Web Tier 3
jann Servlet Bei jedem Request wird eine neue Session erstellt. Web Tier 6
J Session Servlet - JavaScript Web Tier 6
M Session closed - und nun? Web Tier 1
F JSF synchronized(session) Frage ? Web Tier 1
F JSF p:selectOneMenu Session Web Tier 10

Ähnliche Java Themen

Neue Themen


Oben