2013-03-22 22 views
10

Bu konuyla ilgili pek çok gönderiye bakıyorum, fakat benim durumumda çalışan bir çözüm bulamadım.HttpSession zaman aşımından sonra yönlendirme

<session-config> 
     <session-timeout>1</session-timeout> 
    </session-config> 

ve ben kullanıcı giriş sayfasına yönlendirilmesini istiyorsanız : Ben JSF 2.0 ile Java EE 6 kullanıyorum

benim web.xml yılında

(7.1 AS JBoss üzerinde dağıtılan) Ben oturum otomatik olarak zaman aşımına uğradığında.

ne denedim:

Yaklaşım 1: kullanarak filtre aşağıdaki filtreyi denedi

:

@WebFilter() 
public class TimeOutFilter implements Filter { 

     @Override 
     public void init(FilterConfig filterConfig) throws ServletException { 
     } 

     @Override 
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, 
     ServletException { 
     System.out.println("filter called"); 
     final HttpServletRequest req = (HttpServletRequest) request; 
     final HttpSession session = req.getSession(false); 
     if (session != null && !session.isNew()) { 
      chain.doFilter(request, response); 
     } else { 
      System.out.println("Has timed out"); 
      req.getRequestDispatcher("/logon.xthml").forward(request, response); 
     } 
    } 

    @Override 
    public void destroy() { 
    } 
} 

denedim web.xml yılında

<filter-mapping> 
    <filter-name>TimeOutFilter</filter-name> 
    <url-pattern>*.xhtml</url-pattern> 
</filter-mapping> 
o (konsolundaki "denilen fiter" nin günlüğü) her isteği üzerine çağrılır olarak
<filter-mapping> 
    <filter-name>TimeOutFilter</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
</filter-mapping> 

filtreve

çalışır. Ancak, oturum zaman aşımına uğramadığında çağrılmaz.

Yaklaşım 2: HttpSessionLister

Ben HttpSessionListerner kullanmaya çalıştık. Aşağıdaki imza sahip olarak adlandırılan yöntem:

Belirli bir sayfaya yönlendiremedim. Bir kullanıcıyı yeniden yönlendirmek istediğimde, genellikle FacesContext'dan NavigationHandler'u kullanırım ancak bu durumda FacesContext (FacesContext.getCurrentInstance() döndürür null). Bu post numaralı telefona göre, HttpListener kullanıcıyı yönlendiremez çünkü bir isteğin parçası değildir.

Soru

bu sorunu çözmek için en iyi yol nedir? Yukarıda bahsedilen iki yaklaşımdan birini yapmak için ne yapabilirim?

+1

İlgili: http://stackoverflow.com/q/ Web soket şartname linki aşağıda bulunduğundan 4992526/1065197 –

+0

@LuiggiMendoza: İlginç teşekkürler. ViewExpiredException'ı hiç görmemiş olmama rağmen, mümkünse, kullanıcının herhangi bir şeyi tıklamak zorunda kalmadan giriş sayfasına yönlendirmesini istiyorum. – phoenix7360

+0

İstemci tarafında, sunucu tarafındaki 302'yi tetiklemek için bazı yoklama türlerine ihtiyacınız vardır. Bir kalp atışı ... –

cevap

15

İstemci bir HTTP isteği göndermediği sürece bir HTTP yanıtı gönderemezsiniz. Bu kadar basit. Bu sadece HTTP nasıl çalışır. Internet, aksi takdirde, herhangi bir web sitesinin istemciyi istemeden bir HTTP yanıtını istemeden zorlayabilmesi durumunda çok farklı görünüyordu.

A JavaScript tabanlı kalp atışı here veya dolayısıyla (temelde tek sayfalık webapp yasiyorsaniz çözüm olurdu here cevap olarak böyle bir meta refresh başlık cevap olarak böyle müşterinin klavye/fare etkinliği temelinde, etkili konum oturum kapsamını kullanmıyor, ancak görünüm kapsamını kullanmıyoruz, ancak sayfa aynı oturumda birden fazla sekme/pencere açmışsanız, bu hoş bir şekilde çalışmayacaktır.Websockets teorik olarak müşteriye bir şeyleri itmek için doğru çözümdür, ancak bu da aktif bir oturum gerektirir. Tavuk-Yumurta problemi. Ayrıca, şu anda hala yaygın olarak kullanılmakta olan eski tarayıcılarda işe yaramaz, bu nedenle şu anda sadece aşamalı geliştirme için kullanılmalıdır.

En iyi seçeneğiniz, son kullanıcının oturumun süresi dolduğunda bir eylem başlatması durumunda durumla ilgili bir hata sayfası tanımlamaktır. Ayrıca bkz. javax.faces.application.ViewExpiredException: View could not be restored.

+1

çalışmayacak Şimdi yanlış anlamalarımı görüyorum. Kullanıcıyı otomatik olarak yönlendirmekten ziyade, oturumun zaman aşımına uğradıktan sonra bir işlem yapıp yapmadığını kullanıcıya bildirmek için bir şeye ihtiyacım var. – phoenix7360

-1

java-EE6 ve JSF kullandığınızı anlıyorum, ancak JSP kodunu kullanmayı deneyebilir veya bir servlet içinde çalışmak için bu kodu aşağıya çevirebilirsiniz. Web.xml dosyasında oturum zaman aşımını ayarladıktan sonra, oturumu kontrol etmek için kullanıcı adını kullandığınızı varsayalım. JSP kodu ve sunucu kodunun benzer olduğunu lütfen unutmayın. Oturumun doğrulanması için kodunuz şöyle görünebilir: (JSP Biçimi) Kullanıcı adı veritabanınızda birincil anahtar olarak hizmet veriyorsa.

<% 
    String un = (String)session.getAttribute("un"); 

    if(un == null){ 
    response.sendRedirect(login page); 
    return; 
}else{ 
     code to process login form 
} 
    %> 

Servlet kodu Kullanıcı herhangi bir yanıt gönderemez HttpSessionListerner bu

String un = (String)session.getAttribute("un"); 
if(un == null){ 
    response.sendRedirect(loginPage); 
} 
0

gibi görünebilir. Bunu başarmanın iyi bir yolu yoklama ile yapılır, tarayıcı düzenli aralıklarla HTTP istekleri gönderir ve hemen bir yanıt alır.

  1. Sen yoklamaya düz eski javascript kullanabilirsiniz::
    Bunu yapmanın pek çok yolu vardır Bu çapraz tarayıcı ortamında çalışır.

    fonksiyonu yenileme() {

    // make Ajax call here, inside the callback call: 
    
    setTimeout(refresh, 5000); 
    
    // ... 
    

    }

    // initial call, or just call refresh directly 
    

    setTimeout (yenileme, 5000);

  2. Web Soketlerini kullanabilirsiniz. Bir Filtre kullanmak ve aşağıdaki testi yapabileceğini

    http://dev.w3.org/html5/websockets/

-1

:

HttpSession session = request.getSession(false); 
if(session != null && !session.isNew()) { 
    chain.doFilter(request, response); 
} 
else {enter code here 
    response.sendRedirect("/login.jsp"); 
} 
İlgili konular