Gae + struts2 + printemps3 + hibernate4 + mySQL dans localhost ne crée pas la session HTTP et le magasin de données est toujours vide
-
21-12-2019 - |
Question
J'ai un problème avec DataStore et Hibernate, j'ai pu intégrer Gae + Struts2 + Spring3 + Hibernate4 + MySQL dans localhost et tout semble fonctionner, mais lorsque j'essaie de créer une session à HTTP, la session n'est pascréé ou session.getlastapessedTime () est toujours 1970-01-01 (valeur par défaut).Lorsque je vais à DataStore Link in http: localhost: 8080 / _ah / admin Il n'y a pas de session créée.
J'utilise ESAPI pour la sécurité et cette méthode:
public boolean isSessionTimeout() {
HttpSession session = ESAPI.httpUtilities().getCurrentRequest().getSession(false);
if (session == null)
return true;
Date deadline = new Date(session.getLastAccessedTime() + IDLE_TIMEOUT_LENGTH);
Date now = new Date();
return now.after(deadline);
}
retourne toujours vrai.
J'ai activé des sessions dans Appengine-web.xml et je ne comprends pas le problème tant que ce type de configuration fonctionne dans Tomcat, mais dans l'appengine version 1.9.2, il existe une sorte de problème.
Je construis le projet dans Maven comme ceci:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<version>2.5.1</version>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<archiveClasses>true</archiveClasses>
<webResources>
<!-- in order to interpolate version from pom into appengine-web.xml -->
<resource>
<directory>${basedir}/src/main/webapp/WEB-INF</directory>
<filtering>true</filtering>
<targetPath>WEB-INF</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
<plugin>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>${appengine.app.version}</version>
<configuration>
<jvmFlags>
<jvmFlag>-Dappengine.generated.dir=${project.basedir}/appengine</jvmFlag>
<jvmFlag>-Ddatastore.backing_store=${project.basedir}/local_db.bin</jvmFlag>
</jvmFlags>
</configuration>
</plugin>
</plugins>
</build>
J'ai comme premier filtre dans ma web.xml, eSapifilter qui contient:
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
try {
ESAPI.httpUtilities().setCurrentHTTP(request, response);
} catch (Exception e) {
logger.error(Logger.SECURITY_FAILURE, "Error in ESAPI security filter: " + e.getMessage(), e);
}
try {
// figure out who the current user is
try {
ESAPI.authenticator().login();
} catch (AuthenticationException e) {
request.setAttribute("message", "Unauthorized");
}
// log this request, obfuscating any parameter named password
ESAPI.httpUtilities().logHTTPRequest(request, logger, Arrays.asList(obfuscate));
// check access to this URL
if (!ESAPI.accessController().isAuthorizedForURL(request.getRequestURI())) {
request.setAttribute("message", "Unauthorized");
}
// check for CSRF attacks
//ESAPI.httpUtilities().verifyCSRFToken(request);
// forward this request on to the web application
chain.doFilter(request, response);
// set up response with content type
ESAPI.httpUtilities().setContentType(response);
// set no-cache headers on every response
// only do this if the entire site should not be cached
// otherwise you should do this strategically in your controller or actions
ESAPI.httpUtilities().setNoCacheHeaders(response);
} catch (Exception e) {
logger.error(Logger.SECURITY_FAILURE, "Error in ESAPI security filter: " + e.getMessage(), e);
request.setAttribute("message", e.getMessage());
} finally {
// VERY IMPORTANT
// clear out the ThreadLocal variables in the authenticator
// some containers could possibly reuse this thread without clearing the User
try {
ESAPI.clearCurrent();
} catch (Exception e) {
logger.error(Logger.SECURITY_FAILURE, "Error in ESAPI security filter: " + e.getMessage(), e);
}
}
}
La solution
Enfin, j'ai trouvé le problème de la session a été créé avec la session par défaut.getlastapessedTime ()= 0 et j'ai défini cette valeur avec l'heure actuelle comme ceci:
public boolean isSessionTimeout() {
HttpSession session = ESAPI.httpUtilities().getCurrentRequest().getSession(false);
if (session == null)
return true;
long lastAccessedTime=System.currentTimeMillis();
if(session.getLastAccessedTime()!=0){
lastAccessedTime=session.getLastAccessedTime();
}
Date deadline = new Date(lastAccessedTime + IDLE_TIMEOUT_LENGTH);
Date now = new Date();
return now.after(deadline);
}
Enfin, tout fonctionne maintenant et je peux créer localement une session, je n'ai pas essayé de la production.