2012-07-04 2 views
20

Я работаю над проектом с использованием следующих технологий:Удалить JSESSIONID из URL

  • Spring
  • ShiroFilter
  • PrettyFaces
  • Tomcat сервер

В то время как я развертывания он на сервере tomcat, я получаю "JSESSIONID 456jghd787aa", добавленный в конце URL-адреса.

Я пытался решить это, но я не могу этого сделать.

ответ

34

Для кота-добавьте в web.xml

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

На самом деле я добавил это в web.xml, но он еще не решен ... Есть ли какие-либо другие варианты :( – Cijo

+0

@Cijo Может быть, вы используете старый контейнер или тот, который не поддерживает эту опцию? –

+0

@NimChimpsky Спасибо, что работает для меня. –

6

Следующий фильтр может решить вашу проблему (от 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

Это также может быть достигнуто с помощью PrettyFaces rewrite Правило: http://ocpsoft.org/support/topic/url-rewrite-removing-the-jsessionid-from-the-url#post-410 – Lincoln

1

Если вы не используете Servlet 3.0, вы можете также достичь это с помощью PrettyFaces Rewrite Rule: http://ocpsoft.org/support/topic/url-rewrite-removing-the-jsessionid-from-the-url#post-410

+0

На самом деле я также добавил это в мой файл конфиденций, но все же появляется идентификатор jsession в первом запросе – Cijo

3
  • Tomcat 6, добавить disableURLRewriting = "истина" в вашем context.xml

  • Tomcat 7 и ServletFilter уже обсуждались

  • Или программно:

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

3

Вы можете добавить, что параметры в ваш HTTP тег следующим образом:

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

Вы хотите, чтобы вывести его из Tomcat, как и другие предложили, но вы все еще будете иметь проблемы с Shiro добавив его до конца при переадресации, если у вас еще нет набора файлов cookie. Есть два открытых билетов по проблеме:

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

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

я пытался получить Таки в URL переписывает работать и преуспевшие (Сорт) через некоторое время. Проблема заключается в том, что Shiro не вызывает response.encodeURL() и поэтому отключает исходящие правила. Я был в состоянии перенаправить входящие запросы, чтобы удалить идентификатор сессии с этими двумя правилами:

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

что, по крайней мере делает это не отображается в браузере, но это не решает полностью проблему, поскольку идентификатор сеанса был отправлен по URL-адресу и перенаправлен в местоположение без него. Было бы лучше, если бы он вообще не появился.

UPDATE:

SHIRO-360 и SHIRO-361 были установлены и исправление в Shiro 1.3.0.По словам Брайана Демерса в SHIRO-361:

Установить sessionManager.sessionIdUrlRewritingEnabled = false, чтобы отключить добавление JSESSIONID к URL-адресу.

ПРИМЕЧАНИЕ. Если пользователь отключил файлы cookie, они не смогут войти в систему, если это отключено.

0

Jetty WebappContext:

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