2012-07-04 6 views
20

Ich bin mit den folgenden Technologien an einem Projekt arbeiten:entfernen jsessionid von URL

  • Frühling
  • ShiroFilter
  • PrettyFaces
  • Tomcat-Server

Während ich die Bereitstellung von es auf tomcat server, bekomme ich eine "JSESSIONID 456jghd787aa" am ende der URL hinzugefügt.

Ich habe versucht, dies zu lösen, aber ich bin nicht in der Lage, das zu tun.

Antwort

34

für Tomcat 7 fügen Sie diese web.xml

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

Eigentlich habe ich diese auf web.xml, aber es war noch nicht gelöst ... Gibt es noch andere Optionen :( – Cijo

+0

@Cijo Vielleicht verwenden Sie einen alten Container oder eine, die diese Option nicht unterstützt? –

+0

@NimChimpsky Danke, dass es für mich funktioniert. –

6

Der folgende Filter Ihr Problem lösen kann (von 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() { 
    } 
} 
+0

Dies kann auch mit einem PrettyFaces Rewrite erreicht werden Regel: http://ocpsoft.org/support/topic/url-rewrite-removing-the-jsessionid-from-the-url#post-410 – Lincoln

3
  • Tomcat 6, fügen disableURLRewriting = "true" in Ihrem context.xml

  • Tomcat 7 und ServletFilter bereits

  • oder programmatisch diskutiert:

servletContext.setSessionTrackingModes (EnumSet.of (SessionTrackingMode .PLÄTZCHEN));

3

können Sie fügen hinzu, dass die Einstellungen in Ihrem http Tag wie folgt:

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

Sie werden es aus Tomcat nehmen wollen, wie andere vorgeschlagen haben, aber Sie werden immer noch Probleme haben mit Shiro es anhängt bis zum Ende auf Weiterleitungen, wenn Sie noch kein Cookie gesetzt haben. Es gibt zwei offene Karten auf das Problem:

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

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

Ich versuchte Tuckey URL Re-write an die Arbeit, und es gelang (sorta) nach einer Weile. Das Problem ist, Shiro ruft response.encodeURL() nicht auf und löst daher die ausgehenden Regeln aus. Ich war in der Lage eingehende Anforderungen zu umleiten, um die Session-ID mit diesen beiden Regeln zu entfernen:

<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> 

Das zumindest macht es im Browser angezeigt nicht, aber es löst nicht das Problem vollständig, weil die Session-ID wurde über die URL gesendet und ohne diesen an den Ort weitergeleitet. Es wäre besser, wenn es nie auftauchte.

UPDATE:

SHIRO-360 und SHIRO-361 behoben wurden und das Update ist in Shiro 1.3.0.Laut Brian Demers in SHIRO-361:

Legen Sie sessionManager.sessionIdUrlRewritingEnabled = false fest, um das Anhängen von JSESSIONID an die URL zu deaktivieren.

HINWEIS: Wenn ein Benutzer Cookies deaktiviert hat, können sie sich NICHT anmelden, wenn dies deaktiviert ist.

0

Jetty WebappContext:

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