-
Application Seam derrière un Proxy
Posté le 30 novembre 2009 Pas de commentaireVous avez peut être déjà eu le problème : vous êtes en entreprise ou dans n’importe quel lieu avec une connection partagée et vous êtes donc derrière un proxy.
La majorité du temps aucun problème pour votre application, mais parfois le proxy utilisé un cache des pages.
Dans ce cas un problème peut vite arriver : une incohérence du Session ID. En effet si le proxy a caché le cookies et/ou la page, il peut y avoir des perte de session aléatoire si le jsessionid linké n’est pas le bon.En fait il existe une technique de « sioux » pour parer à ça, jouer sur les en têtes HTTP pour forcer la réactualisation de la page et empêcher la mise en cache.
Il faut jouer sur deux en têtes : Expires, et Cache-Control.Voici une ServletFilter que vous pouvez rajouter dans votre application pour qu’elle ajoute automatiquement les en têtes qui vont bien à toutes vos pages :
package org.sweetmap.services.utils; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.annotations.Startup; import org.jboss.seam.annotations.intercept.BypassInterceptors; import org.jboss.seam.annotations.web.Filter; import org.jboss.seam.web.AbstractFilter; /** * Add the wanted filter to the http header. * @author leakim * */ @Startup @Scope(ScopeType.APPLICATION) @Name("responseHeaderFilter") @BypassInterceptors @Filter(within = "org.jboss.seam.web.ajax4jsfFilter") public class ResponseHeaderFilter extends AbstractFilter { /** * Add the http header to bypass the proxy cache. * @param req the request. * @param res the response. * @param filt the filter. * @throws IOException ex. * @throws ServletException ex2. */ public void doFilter(ServletRequest req, ServletResponse res, FilterChain filt) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; response.addHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); response.addHeader("Cache-Control", "private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); filt.doFilter(req, response); } }
Voilà, ainsi normalement cela devrait régler vos problèmes de perte de session derrière un proxy !
Grâce à l’annotation @Filter il n’est pas necessaire de l’ajouter au fichier web.xml, Seam s’en occupe pour vous.Laisser une réponse


