लॉगआउट के बाद पहले देखे गए सुरक्षित पृष्ठ को देखने से उपयोगकर्ता को रोकें


99

मेरी आवश्यकता है कि लॉगआउट / साइन आउट करने के बाद अंतिम उपयोगकर्ता प्रतिबंधित पृष्ठ पर वापस जाने में सक्षम न हो। लेकिन वर्तमान में अंतिम उपयोगकर्ता ब्राउज़र बैक बटन, ब्राउज़र इतिहास पर जाकर या ब्राउज़र के एड्रेस बार में यूआरएल को फिर से दर्ज करके ऐसा करने में सक्षम है।

मूल रूप से, मैं चाहता हूं कि साइन आउट के बाद अंतिम उपयोगकर्ता किसी भी तरह से प्रतिबंधित पृष्ठ तक नहीं पहुंच सके। मैं इसे सर्वश्रेष्ठ कैसे प्राप्त कर सकता हूं? क्या मैं जावास्क्रिप्ट के साथ पिछला बटन अक्षम कर सकता हूं?


7
पोस्ट-रिक्वेस्ट-गेट पैटर्न का उपयोग करें। इसे हटा दें।

जवाबों:


137

आप ब्राउजर बैक बटन या हिस्ट्री को डिसेबल नहीं कर सकते हैं । उपयोगकर्ता अनुभव के लिए यह बुरा है। जावास्क्रिप्ट हैक कर रहे हैं, लेकिन वे विश्वसनीय नहीं हैं और यह भी काम नहीं करेगा जब ग्राहक जेएस अक्षम है।

आपकी ठोस समस्या यह है कि अनुरोधित पृष्ठ को सर्वर से सीधे के बजाय ब्राउज़र कैश से लोड किया गया है। यह अनिवार्य रूप से हानिरहित है, लेकिन वास्तव में एंड्यूसर को भ्रमित कर रहा है, क्योंकि s / वह गलत तरीके से सोचता है कि यह वास्तव में सर्वर से आ रहा है।

आपको बस सभी प्रतिबंधित जेएसपी पृष्ठों को कैश करने के लिए ब्राउज़र को निर्देश देने की आवश्यकता है (और इस प्रकार केवल लॉगआउट पेज / एक्शन ही नहीं!)। इस तरह से ब्राउज़र को कैश के बजाय सर्वर से पृष्ठ का अनुरोध करने के लिए मजबूर किया जाता है और इसलिए सर्वर पर सभी लॉगिन चेक निष्पादित किए जाएंगे। आप एक फ़िल्टर का उपयोग करके ऐसा कर सकते हैं जो विधि में आवश्यक प्रतिक्रिया हेडर सेट करता है :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);
    }

    // ...
}

उदाहरण के लिए, ब्याज Filterपर इसे मैप करें ।url-pattern*.jsp

@WebFilter("*.jsp")

या यदि आप केवल सुरक्षित पृष्ठों पर यह प्रतिबंध लगाना चाहते हैं, तो आपको एक URL पैटर्न निर्दिष्ट करना चाहिए जो उन सभी सुरक्षित पृष्ठों को कवर करता है। उदाहरण के लिए, जब वे सभी फ़ोल्डर में होते हैं /app, तो आपको URL पैटर्न निर्दिष्ट करने की आवश्यकता होती है /app/*

@WebFilter("/app/*")

और भी, आप यह काम उसी Filterतरह से कर सकते हैं जैसे आप लॉग-इन उपयोगकर्ता की उपस्थिति की जाँच कर रहे हैं।

परीक्षण से पहले ब्राउज़र कैश साफ़ करना न भूलें! ;)

यह सभी देखें:


2
कभी-कभी यह पर्याप्त नहीं है, मुझे याद है कि इस तरह का मुद्दा है। ब्राउज़र को केवल अंतिम पृष्ठ याद है। लेकिन यह IE6 हो सकता है, मुझे याद नहीं कर सकते :)
Bozho

3
@Bozho: या तो आपने हेडर का अधूरा सेट प्रदान किया है या ब्राउज़र के पास अभी भी अपने कैश में पेज है।
बालुसक

1
@ क्रिस: फ़ायरफ़ॉक्स और अन्य सभी ब्राउज़रों के साथ मेरे लिए काम करता है। आपकी समस्या अन्यत्र है। शायद आप कुछ कैश साफ़ करना भूल गए? या उन हेडर गलत प्रतिक्रियाओं पर सेट हैं?
बालुसक

@BalusC मैंने doFilter()विधि को ओवरराइड करने के लिए एक अलग फ़िल्टर वर्ग बनाया । जब मैं लॉगआउट बटन दबाता हूं तो इसे एक सर्वलेट पर पुनर्निर्देशित किया जाता है जहां मैं सत्र को अमान्य करता हूं। मुझे यकीन नहीं है कि कैसे doFilter()विधि यहाँ खेलने में आती है। क्या आप मुझे बता सकते हैं कि इसे कैसे लागू किया जाए? में, पालन करने के लिए सही कदम। धन्यवाद।
अंजन बरद्वाज

मेरे लिए अच्छा काम किया। दोनों के बाद परीक्षण किया sendRedirect(...)और forward()
हेल ​​50000

5

*। Url पैटर्न में .jsp काम नहीं करेगा यदि आप एक पृष्ठ को आगे बढ़ाते हैं अपने सर्वलेट को भी शामिल करने की कोशिश करें .. जो आपके एप्लिकेशन को इस बैक बटन समस्या से सुरक्षित कर देगा।


2

ब्राउज़र बैक ब्यूटेन को अक्षम किए बिना इसे करने का सबसे सरल तरीका इस कोड को page_loadउस पृष्ठ की घटना के लिए जोड़कर है जिसे आप उपयोगकर्ता को लॉग आउट करने के बाद वापस जाने के लिए नहीं चाहते हैं:

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
यद्यपि आपका उत्तर उपयोगी है, कृपया वह उत्तर पोस्ट करें जो ओपी की पसंद की प्रोग्रामिंग भाषा से संबंधित है। आपका C # समाधान ओपी के जावा ईई प्रोजेक्ट में मदद नहीं करेगा।
बुआके सिंडी

0

आप ब्राउज़र को मुखपृष्ठ को कैश नहीं करने के लिए कह सकते हैं (उपयुक्त हेडर का उपयोग करके - समाप्ति, कैश-कंट्रोल, प्रागमा)। लेकिन यह काम करने की गारंटी नहीं है। यदि आप लॉग इन करते हैं, तो उपयोगकर्ता को लॉग इन करने के लिए पेज लोड करने के लिए सर्वर पर एक अजाक्स कॉल करें, और यदि नहीं - रीडायरेक्ट।


13
लेकिन अगर कोई दुष्ट दिमाग जावास्क्रिप्ट को निष्क्रिय करता है तो यह काम नहीं करता है और वह पृष्ठ को फिर भी देखेगा।
acme

0

इसे जोड़ने का सही तरीका है

Vary: Cookie

सुरक्षित पृष्ठों पर हैडर। जब उपयोगकर्ता लॉग आउट करता है, तो अपना सत्र कुकी साफ़ करें। फिर, जब वे लॉग आउट करने के बाद वापस नेविगेट करते हैं, तो ब्राउज़र कैश याद आएगा। कैशिंग को पूरी तरह से हरा नहीं पाने का यह भी लाभ है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.