Gae + struts2 + printemps3 + hibernate4 + mySQL dans localhost ne crée pas la session HTTP et le magasin de données est toujours vide

StackOverflow https://stackoverflow.com//questions/23015761

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);
        }
    }
}

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top