web-dev-qa-db-fra.com

Supprimer jsessionid de l'URL

Je travaille sur un projet avec les technologies suivantes:

  • Printemps
  • ShiroFilter
  • PrettyFaces
  • Serveur Tomcat

Pendant que je le déploie sur le serveur Tomcat, un "JSESSIONID 456jghd787aa" est ajouté à la fin de l'URL.

J'essayais de résoudre ceci mais je ne suis pas capable de le faire.

20
Cijo

Pour Tomcat 7, ajoutez ceci au fichier web.xml. 

<session-config>
  <!-- Disables URL-based sessions (no more 'jsessionid' in the URL using Tomcat) -->
  <tracking-mode>COOKIE</tracking-mode>
</session-config>
34
NimChimpsky

Le filtre suivant peut résoudre votre problème (from http://randomcoder.org/maven/site/randomcoder-website/cobertura/org.randomcoder.security.DisableUrlSessionFilter.html )

package com.companyname.projectname.web.filter;

import Java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.http.HttpSession;

/**
 * Servlet filter which disables URL-encoded session identifiers.
 * 
 * <pre>
 * Copyright (c) 2006, Craig Condit. All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 *   * Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * </pre>
 */
public class DisableUrlSessionFilter implements Filter {

/*    private static Log logger = LogFactory.getLog(DisableUrlSessionFilter.class);
*/
    /**
     * Filters requests to disable URL-based session identifiers.
     */
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // skip non-http requests
        if (!(request instanceof HttpServletRequest)) {
            chain.doFilter(request, response);
            return;
        }

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // clear session if session id in URL
        if (httpRequest.isRequestedSessionIdFromURL()) {
            HttpSession session = httpRequest.getSession();
            if (session != null) {
                session.invalidate();
            }
        }

        // wrap response to remove URL encoding
        HttpServletResponseWrapper wrappedResponse = new HttpServletResponseWrapper(
                httpResponse) {
            @Override
            public String encodeRedirectUrl(String url) {
                return url;
            }

            @Override
            public String encodeRedirectURL(String url) {
                return url;
            }

            @Override
            public String encodeUrl(String url) {
                return url;
            }

            @Override
            public String encodeURL(String url) {
                return url;
            }
        };

        // process next request in chain
        chain.doFilter(request, wrappedResponse);
    }

    /**
     * Unused.
     */
    public void init(FilterConfig config) throws ServletException {
    }

    /**
     * Unused.
     */
    public void destroy() {
    }
}
6
veman
  • Tomcat 6, ajoutez disableURLRewriting = "true" dans votre fichier context.xml

  • Tomcat 7 et ServletFilter ont déjà été discutés

  • Ou par programme: 

servletContext.setSessionTrackingModes (EnumSet.of (SessionTrackingMode.COOKIE));

3
Pras

Vous pouvez ajouter ces paramètres à votre balise http comme suit:

<http auto-config="false" disable-url-rewriting="true">
3
kamaci

Vous voudrez le supprimer de Tomcat, comme d'autres l'ont suggéré, mais vous aurez toujours des problèmes avec l'ajout de Shiro à la fin des redirections si vous n'avez pas encore défini de cookie. Il y a deux tickets ouverts sur le problème:

https://issues.Apache.org/jira/browse/SHIRO-360

https://issues.Apache.org/jira/browse/SHIRO-361

J'ai essayé d'obtenir l'URL de Tuckey Re-write au travail et j'ai réussi (sorta) après un moment. Le problème est que Shiro n'appelle pas response.encodeURL () et ne déclenche donc pas les règles sortantes. J'ai pu rediriger les demandes entrantes pour supprimer l'identifiant de session avec ces deux règles:

<rule>
    <note>Remove jsessionid from embedded urls - for urls WITH query parameters</note>
    <from>^/(.*);JSESSIONID=.*[?](.*)$</from>
    <to type="redirect">/$1?$2</to>
</rule>

<rule>
    <note>Remove jsessionid from embedded urls - for urls WITHOUT query parameters</note>
    <from>^/(.*);JSESSIONID=.*[^?]$</from>
    <to type="redirect">/$1</to>
</rule>

Cela permet au moins de ne pas l'afficher dans le navigateur, mais cela ne résout pas complètement le problème, car l'ID de session a été envoyé sur l'URL et redirigé vers l'emplacement qui ne le contient pas. Ce serait mieux si cela ne se présentait jamais du tout.

METTRE À JOUR:

SHIRO-360 et SHIRO-361 ont été corrigés et le correctif est dans Shiro 1.3.0. Selon Brian Demers dans SHIRO-361:

Définissez sessionManager.sessionIdUrlRewritingEnabled = false pour désactiver l’ajout de JSESSIONID à l’URL.

REMARQUE: si un utilisateur a désactivé les cookies, il ne pourra PAS se connecter s'il est désactivé.

1
Stephen M

Jetty WebappContext:

Set<SessionTrackingMode> trackingModes = new HashSet<>();
trackingModes.add(SessionTrackingMode.COOKIE);
context.getSessionHandler().getSessionManager().setSessionTrackingModes(trackingModes);
1
ThomasRS

Si vous n'utilisez pas Servlet 3.0, vous pouvez également utiliser une règle de récapitulation PrettyFaces: http://ocpsoft.org/support/topic/url-rewrite-removing-the-jsessionid-from-the-url#post -410

1
Lincoln