web-dev-qa-db-fra.com

supprimer jsessionid dans l'url réécrire au printemps mvc

J'utilise spring MVC et j'ai un problème dans jsessionid. Ce que j'ai trouvé, c'est que jsessionid est injecté dans l'URL si les cookies ne sont pas activés dans le navigateur, ce qui produit une URL de ce type:

http: // localhost/categories; jsessionid = Bsls4aQFXA5RUDcmZKV5iw? cid = 13001

En fait, les navigateurs ne posent aucun problème, mais lorsque Google explore mon site et semble ne pas avoir de cookies, il enregistre les URL de mon site sous cette forme et mon site apparaît dans les résultats de recherche.

En fait, cela fonctionne sans aucun problème, mais je préfère que les URL apparaissent clairement dans les résultats de recherche Google sans jsessionid.

De l'aide?

19
mmohab

Au fait: ne laissez simplement pas votre application créer des sessions tant que les utilisateurs ne se connectent pas ou n'exécutent aucune action POST. N'appelez pas request.getSession() ou request.getSession(true). Ne créez pas et ne gérez pas de beans de portée de session pour les utilisateurs non connectés. Assurez-vous que les frameworks que vous utilisez ne créent pas inutilement de sessions sans le dire.

Si ceci est vraiment impossible en raison de la conception de votre application ou en raison des limitations/bogues des frameworks (MVC) utilisés, il est conseillé de rediriger les demandes Googlebot vers des URL sans identifiant JSESSIONID. Vous pouvez utiliser le filtre de réécriture d'URL de Tuckey pour cela (par exemple, la variante Java du bien connu mod_rewrite de Apache HTTPD). Voici un extrait de pertinence de la page exemples de configuration .

Masquer jsessionid pour les demandes de googlebot.


<outbound-rule>
     <name>Strip URL Session ID's</name>
     <note>
         Strip ;jsession=XXX from urls passed through response.encodeURL().
         The characters ? and # are the only things we can use to find out where the jsessionid ends.
         The expression in 'from' below contains three capture groups, the last two being optional.
             1, everything before ;jesessionid
             2, everything after ;jesessionid=XXX starting with a ? (to get the query string) up to #
             3, everything ;jesessionid=XXX and optionally ?XXX starting with a # (to get the target)
         eg,
         from index.jsp;jsessionid=sss?qqq to index.jsp?qqq
         from index.jsp;jsessionid=sss?qqq#ttt to index.jsp?qqq#ttt
         from index.jsp;jsessionid=asdasdasdsadsadasd#dfds - index.jsp#dfds
         from u.jsp;jsessionid=wert.hg - u.jsp
         from /;jsessionid=tyu - /
     </note>
     <condition name="user-agent">googlebot</condition>
     <from>^(.*?)(?:\;jsessionid=[^\?#]*)?(\?[^#]*)?(#.*)?$</from>
     <to>$1$2$3</to>
 </outbound-rule>
19
BalusC

Spring peut être configuré pour ne pas le faire: Pourquoi jsessionid est-il ajouté à chaque URL?

Des applications Web peuvent être configurées pour le bloquer: http://randomcoder.org/articles/jsessionid-considered-harmful

11
ykaganovich

Si vous n'utilisez pas la balise http Spring.
Accédez au bean applicationFilterChain qui définit vos chaînes de filtres Spring.
Normalement, vous aurez un filtre appelé httpSessionContextIntegrationFilter ou quelque chose de très proche, basé sur la classe org.springframework.security.web.context.HttpSessionContextIntegrationFilter ou qui en hérite.
Ajoutez la propriété: 

<property name="securityContextRepository" ref="securityContextRepositoryNoJSession"/>

Et ajoutez le haricot:

<bean id="securityContextRepositoryNoJSession" class="org.springframework.security.web.context.HttpSessionSecurityContextRepository">
    <property name="disableUrlRewriting" value="true"/>
</bean>


Cela devrait être équivalent à définir disable-url-rewriting sur true

1
roizaig

J'insérerais un filtre qui, s'il détecte un bot (comme googlebot), utilise un HttpServletResponse personnalisé qui remplace les méthodes encodeUrl pour simplement renvoyer l'URL brute. Si le filtre ne détecte pas de bot, il laissera simplement la chaîne continuer, ce qui devrait permettre le codage d'URL, etc. comme par défaut.

0
mP.

Le moyen le plus simple de se débarrasser de jsessionid dans votre URL consiste à passer à la balise sur la page de connexion vers laquelle j_spring_security_check appelle

<c:url var="authUrl" value="/static/j_spring_security_check" />
    <form action="${authUrl}" method="post">
0
user2784713