2012-07-05 17 views
14

Eh ben ... Bu bitirdim ise çalışır JsessionId - nasıl engellenir? Bir sayfaya ilk çağrıda jsessionid = XXX? ilk sayfa jsp

ben iframe bir <iframe></iframe> içeriği ile karşılama sayfalık index.jsp kullanan bir uygulama, bir jsf sayfası var. Ben index.jsp erişmek ben kundakçı ilk get bir çerez zaten bkz:

Set-Cookie JSESSIONID=C615DA89B6EF73F801973EA3DCD3B226; Path=/ 

kalıtılır.Kalıtılan jsessionid sayfa. AMA: <iframe/> sayfasının sayfasına doğrudan eriştiğimde, jsessionId bir çerez içermeyen tüm URL'lere yeniden yazılır - ilk istekte. Daha sonra çerez kullanılır. Her şey yolunda - eğer: Güvenlik sistemi, URL yeniden yazmalarını gerçekleştirmeme izin verir.

ben index.jsp ile olduğu gibi aynı davranışı elde etmek istediğiniz JBoss 4.2.2

çalıştırmak - örneğin her zaman kurabiyeleri kullanın ve her zaman http yeniden yazmaktan kaçının.

sayesinde ben yazdım balusc cevabı [DÜZENLE]:

public class JsessionIdAvoiderFilter implements Filter { 

      public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, 
        ServletException { 
       boolean allowFilterChain = redirectToAvoidJsessionId((HttpServletRequest) req, (HttpServletResponse)res); 

         //I'm doing this because if I execute the request completely, it will perform a pretty heavy lookup operation. No need to do it twice. 
       if(allowFilterChain) 
        chain.doFilter(req, res); 
      } 


      public static boolean redirectToAvoidJsessionId(HttpServletRequest req, HttpServletResponse res) { 
       HttpSession s = req.getSession(); 
       if(s.isNew()) { 

//after the redirect we don't want to redirect again. 
if(!(req.isRequestedSessionIdFromCookie()&&req.isRequestedSessionIdFromURL())) 
        { 
           //yeah we have request parameters actually on that request.   
         String qs = req.getQueryString(); 

         String requestURI = req.getRequestURI(); 
         try { 
          res.sendRedirect(requestURI+"?"+qs); 
          return false; 
         } catch (IOException e) { 
          logger.error("Error sending redirect. " + e.getMessage()); 
         } 
        } 
       } 
       return true; 
      } 
} 

için <tracking-mode>COOKIE</tracking-mode> kullanabilirsiniz web.xml

<filter> 
    <display-name>JsessionId Filter</display-name> 
    <filter-name>jsessionIdAvoiderFilter</filter-name> 
    <filter-class>my.namespace.JsessionIdAvoiderFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>jsessionIdAvoiderFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
<filter> 

cevap

12

Servlet 3.0 olduğunuz için eklemek unutmayın bu. Ancak JBoss 4.2.2, Servlet 3.0 ile uyumlu değil, bu bir seçenek değil.

HttpSession#isNew(), true döndüğünde HttpServletRequest#getRequestURI() adresine bir yönlendirme gönderen bir sunucu filtresi oluşturmak daha kolay olurdu. İstemci çerezleri desteklemediğinde sonsuz bir yönlendirme döngüsünü önlemek için HttpServletRequest#isRequestedSessionIdFromCookie()'u kontrol etmeyi unutmayın.

+1

teşekkürler. Web sitenizde bir yerde 'hayırseverlik için bağış yapın' var mı? Pizza sipariş edebilir miyim? – Toskan

+0

Rica ederim. Web sitem/blogumun sağ sütununda paypal bağış butonunu bulabilirsiniz. Şimdiye kadar tek yol bu. – BalusC

+0

size kişisel bir mesaj gönderemediğim anlaşılıyor. Paypal'ı nasıl ingilizceye zorlayacağınızı öğrenmelisiniz. Bu Hollandaca biraz kafa karıştırıcı :-) "Snel doneren": -D – Toskan

2

Bu, isteği HttpServletRequest.encodeURL ve HttpServletRequest.encodeRedirectURL geçersiz kılan bir HttpServletRequest ile saran basit bir Filtreyle yapılabilir. Sadece kendisine iletilen String argümanını döndürün ve URL yeniden yazmayı devre dışı bırakacaksınız. Bu, yalnızca conf/web.xml'da (önerilmez) yapılandırmak ya da ayrı webapps'inizde yapılandırmak istemediğiniz sürece tek bir webapp için çalışacağını unutmayın.

Bu teknik, sorunuzu daha sonra gönderdiğinden daha üstündür, çünkü isteklerinizi yavaşlatabilecek yeniden yönlendirme gerektirmez. IMO, aynı zamanda daha temiz.

+0

En kısa zamanda ona bir göz atacağım. "Tek" webapp ile ne demek istiyorsun? Ne demek istediğimi tam olarak anlamadım – Toskan

+0

Filtreler, "WEB-INF/web.xml" dosyasında yapılandırılmıştır. –

+0

balusc cevabını kabul etmemin sebebi, benim uygulamış olduğum budur ve tanımlanan probleme çok yakışıyor. - Çözümü denemek için zamanım yok ama iyi geliyor – Toskan

3

Christopher Schultz tavsiyesine dayanarak bunu denedim ve işe yarıyor.

package com.rama.test.jsessionfilter 

    public class JsessionIdAvoiderFilter implements Filter { 

     protected static final Logger LOGGER = LogManager.getLogger(JsessionIdAvoiderFilter.class); 

     public void doFilter(ServletRequest req, ServletResponse res, 
       FilterChain chain) throws IOException, ServletException { 

      if (!(req instanceof HttpServletRequest)) { 
       chain.doFilter(req, res); 
       return; 
      } 

      HttpServletRequest request = (HttpServletRequest) req; 
      HttpServletResponse response = (HttpServletResponse) res; 

     // Redirect requests with JSESSIONID in URL to clean old links 
     /* If you really want clean up some old links which have Jsession id bookmarked clean it. If its new app 
      this below check is not required. */ 
      if (request.isRequestedSessionIdFromURL()) { 
       String url = request.getRequestURL().append(request.getQueryString() != null ? "?" 
           + request.getQueryString() : "").toString(); 
       response.setHeader("Location", url); 
       response.sendError(HttpServletResponse.SC_MOVED_PERMANENTLY); 
       LOGGER.info(" Found url with jsession id in it:"+ request.getRequestURL() +": url="+url); 
       return; 
      } 

      // Prevent rendering of JSESSIONID in URLs for all outgoing links 
      HttpServletResponseWrapper wrappedResponse = new HttpServletResponseWrapper(
        response) { 
       @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; 
       } 
      }; 
      chain.doFilter(req, wrappedResponse); 

     } 

     public void destroy() { 
     } 

     public void init(FilterConfig arg0) throws ServletException { 
     } 
    } 

ve

<filter> 
     <display-name>JsessionId Filter</display-name> 
     <filter-name>jsessionIdAvoiderFilter</filter-name> 
     <filter-class>com.rama.test.jsessionfilter.JsessionIdAvoiderFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>jsessionIdAvoiderFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>REQUEST</dispatcher> 
    </filter-mapping> 

büyük İşleri web.xml''deki şu giriş !!!.

+0

Çerezler devre dışı bırakılmışsa, kodunuzu daha iyi kontrol edip uyarı. Varsayım, müşteri tarafında çerezin etkinleştirilmesidir. – Reddymails

İlgili konular