Oturumu kapattıktan sonra kullanıcının daha önce ziyaret edilen güvenli sayfayı görmesini engelleyin


99

Son kullanıcının oturumu kapattıktan / kapattıktan sonra kısıtlanmış sayfaya geri dönememesine ihtiyacım var. Ancak şu anda son kullanıcı bunu tarayıcı geri düğmesiyle, tarayıcı geçmişini ziyaret ederek ve hatta tarayıcının adres çubuğuna URL'yi yeniden girerek yapabilir.

Temel olarak, son kullanıcının oturumu kapattıktan sonra kısıtlanmış sayfaya hiçbir şekilde erişememesini istiyorum. Bunu en iyi şekilde nasıl başarabilirim? Geri düğmesini JavaScript ile devre dışı bırakabilir miyim?


7
İstek sonrası alma kalıbını kullanın. Google it.

Yanıtlar:


137

Sen ve olmamalıdır olabilir tarayıcı geri düğmesine veya geçmiş devre dışı bırakın. Bu, kullanıcı deneyimi için kötü. JavaScript hack'leri vardır, ancak bunlar güvenilir değildir ve istemci JS'yi devre dışı bıraktığında da çalışmazlar.

Somut sorununuz, istenen sayfanın doğrudan sunucudan değil tarayıcı önbelleğinden yüklenmesidir. Bu aslında zararsızdır, ancak son kullanıcı için gerçekten kafa karıştırıcıdır, çünkü yanlış bir şekilde sunucudan geldiğini düşünür.

Tarayıcıya tüm kısıtlanmış JSP sayfalarını önbelleğe almaması talimatını vermeniz yeterlidir (dolayısıyla sadece çıkış sayfasını / eylemini değil!). Bu şekilde tarayıcı, sayfayı önbellek yerine sunucudan istemeye zorlanır ve bu nedenle sunucudaki tüm oturum açma kontrolleri yürütülür. Bir kullanarak yapabilirsiniz Filtre setleri gerekli yanıt başlıklarını içinde yöntemle:doFilter()

@WebFilter
public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;

        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
        response.setDateHeader("Expires", 0); // Proxies.

        chain.doFilter(req, res);
    }

    // ...
}

Örneğin, bunu Filterbir url-patternilgi alanına göre eşleştirin *.jsp.

@WebFilter("*.jsp")

Veya bu kısıtlamayı yalnızca güvenli sayfalara koymak istiyorsanız, o zaman tüm bu güvenli sayfaları kapsayan bir URL modeli belirtmelisiniz. Örneğin, hepsi klasörün içindeyken /appURL modelini belirtmeniz gerekir /app/*.

@WebFilter("/app/*")

Dahası, bu işi Filter, oturum açmış kullanıcının varlığını kontrol ettiğiniz yerle aynı şekilde yapabilirsiniz .

Test etmeden önce tarayıcı önbelleğini temizlemeyi unutmayın! ;)

Ayrıca bakınız:


2
Bazen bu yeterli olmuyor, böyle bir sorun yaşadığımı hatırlıyorum. Tarayıcı sadece son sayfayı hatırlar. Ama IE6 olabilirdi, hatırlayamıyorum :)
Bozho

3
@Bozho: Ya tamamlanmamış bir başlık kümesi sağladınız ya da tarayıcının sayfa hala önbelleğinde bulunuyor.
BalusC

1
@Chris: Firefox ve diğer tüm tarayıcılarda benim için çalışıyor. Sorunun başka yerden kaynaklanıyor. Belki bazı önbelleği temizlemeyi unuttunuz? Veya bu başlıklar yanlış yanıtlara mı ayarlanmış?
BalusC

@BalusC doFilter()Yöntemi geçersiz kılmak için ayrı bir Filtre sınıfı oluşturdum . Oturum kapatma düğmesine bastığımda, oturumu geçersiz kıldığım bir sunucu uygulamasına yönlendiriliyor. doFilter()Yöntemin burada nasıl devreye girdiğinden emin değilim . Lütfen bunu nasıl uygulayacağımı söyler misin? Olduğu gibi, izlenecek doğru adımlar. Teşekkürler.
Anjan Baradwaj

Benim için iyi çalıştı. Hem sonra test sendRedirect(...)ve forward().
Hal50000

5

* URL Kalıpındaki .jsp, bir sayfayı iletirseniz çalışmaz. Sunucu uygulamanızı da dahil etmeye çalışın .. bu, uygulamanızı bu geri düğmesi sorunundan koruyacaktır.


2

Tarayıcı geri düğmesini devre dışı bırakmadan bunu yapmanın en basit yolu page_load, kullanıcının oturumu kapattıktan sonra geri dönmesini istemediğiniz sayfanın etkinliğine bu kodu eklemektir :

if (!IsPostBack)
    {
        if (Session["userId"] == null)
        {
            Response.Redirect("Login.aspx");
        }
        else
        {
        Response.ClearHeaders();
        Response.ClearContent();
        Response.Clear();
        Session.Abandon();
        Session.Remove("\\w+");
        Response.AddHeader("Cache-Control", "no-cache, no-store, max-age = 0, must-revalidate");
        Response.AddHeader("Pragma", "no-cache");
        Response.AddHeader("Expires", "0");
        }
    }

6
Cevabınız yararlı olsa da, lütfen OP'nin tercih edilen programlama diliyle ilgili cevabı gönderin. C # çözümünüz, OP'nin Java EE projesine yardımcı olmayacaktır.
Buhake Sindi

0

Tarayıcıya ana sayfayı önbelleğe almamasını söylemeyi deneyebilirsiniz (uygun başlıkları kullanarak - Expires, Cache-Control, Pragma). Ancak çalışması garanti edilmez. Yapabileceğiniz şey, sayfanın yüklenmesinde kullanıcının oturum açıp açmadığını kontrol etmek için sunucuya bir ajax çağrısı yapmak ve değilse yeniden yönlendirmektir.


13
Ancak kötü bir zihin JavaScript'i devre dışı bırakırsa, bu çalışmaz ve yine de sayfayı görecektir.
acme

0

Bunu yapmanın doğru yolu,

Vary: Cookie

güvenli sayfalarda başlık. Kullanıcı oturumu kapattığında, oturum tanımlama bilgisini temizleyin. Ardından, oturumu kapattıktan sonra geri döndüklerinde, tarayıcı önbelleği kaybolur. Bu aynı zamanda önbelleğe almayı tamamen engellememe avantajına da sahiptir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.