ব্যবহারকারীকে লগআউট করার পরে পূর্বে পরিদর্শন করা সুরক্ষিত পৃষ্ঠাটি দেখতে বাধা দিন


99

আমার প্রয়োজনীয়তা রয়েছে যে লগ আউট / সাইন আউট করার পরে শেষ ব্যবহারকারী নিষিদ্ধ পৃষ্ঠায় ফিরে যেতে সক্ষম না হয়। তবে বর্তমানে শেষ ব্যবহারকারী ব্রাউজারের পিছনের বোতামটি করে, ব্রাউজারের ইতিহাস দেখতে বা এমনকি ব্রাউজারের ঠিকানা বারে ইউআরএল পুনরায় প্রবেশ করে তা করতে সক্ষম হয়।

মূলত, আমি চাই যে শেষ ব্যবহারকারী সাইন আউট করার পরে কোনওভাবেই সীমাবদ্ধ পৃষ্ঠাটি অ্যাক্সেস করতে সক্ষম হবে না। আমি কীভাবে এটি সেরা অর্জন করতে পারি? আমি জাভাস্ক্রিপ্ট দিয়ে পিছনের বোতামটি অক্ষম করতে পারি?


7
অনুরোধ-পরবর্তী প্যাটার্ন ব্যবহার করুন। গুগল এটি।

উত্তর:


137

আপনি এবং না করা উচিত ব্রাউজারের পিছনে বাটন বা ইতিহাস অক্ষম । এটি ব্যবহারকারীর অভিজ্ঞতার জন্য খারাপ। জাভাস্ক্রিপ্ট হ্যাকগুলি রয়েছে তবে সেগুলি নির্ভরযোগ্য নয় এবং ক্লায়েন্টের জেএস অক্ষম থাকলে তাও কাজ করবে না।

আপনার কংক্রিট সমস্যাটি হ'ল অনুরোধ করা পৃষ্ঠাটি সার্ভার থেকে সরাসরি ব্রাউজারের ক্যাশে থেকে লোড করা হয়েছে। এটি মূলত নিরীহ, তবে প্রকৃতপক্ষে অন্তর্নিবেশকারীকে বিভ্রান্ত করছে কারণ এস / সে ভুলভাবে মনে করে যে এটি সত্যই সার্ভার থেকে আসছে।

সমস্ত সীমাবদ্ধ জেএসপি পৃষ্ঠাগুলি ক্যাশে না করার জন্য আপনাকে কেবল ব্রাউজারকে নির্দেশ দেওয়া দরকার (এবং এটি কেবল লগআউট পৃষ্ঠা / ক্রিয়া নিজেই নয়!)। এইভাবে ব্রাউজারটি ক্যাশে পরিবর্তে সার্ভার থেকে পৃষ্ঠাটি অনুরোধ করতে বাধ্য হয় এবং তাই সার্ভারে সমস্ত লগইন চেকগুলি কার্যকর করা হবে। আপনি একটি ব্যবহার করতে পারেন ফিল্টার যা সেট করে প্রয়োজনীয় প্রতিক্রিয়া হেডার মধ্যে পদ্ধতি: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")

অথবা আপনি যদি এই সীমাবদ্ধতাটি কেবল সুরক্ষিত পৃষ্ঠাগুলিতে রাখতে চান তবে আপনার একটি ইউআরএল প্যাটার্ন নির্দিষ্ট করা উচিত যা এই সমস্ত সুরক্ষিত পৃষ্ঠাগুলি জুড়ে। উদাহরণস্বরূপ, যখন তারা সমস্ত ফোল্ডারে থাকে /appতখন আপনাকে এর URL প্যাটার্ন নির্দিষ্ট করতে হবে /app/*

@WebFilter("/app/*")

আরও বেশি, আপনি Filterযেখানে লগ ইন থাকা ব্যবহারকারীর উপস্থিতি যাচাই করছেন সেভাবেই আপনি এই কাজটি করতে পারেন ।

পরীক্ষার আগে ব্রাউজার ক্যাশে সাফ করতে ভুলবেন না! ;)

আরো দেখুন:


4
কখনও কখনও এটি যথেষ্ট নয়, আমি মনে করি এ জাতীয় সমস্যা ছিল। ব্রাউজারটি কেবল শেষ পৃষ্ঠাটি মনে রাখে। তবে এটি আই 6 হতে পারে, আমি মনে করতে পারি না :)
বোজহো

4
@ বোজো: হয় আপনি হেডারের একটি অসম্পূর্ণ সেট সরবরাহ করেছেন বা ব্রাউজারটিতে পৃষ্ঠাটি এখনও তার ক্যাশে রয়েছে।
বালুসসি

4
@ ক্রিস: ফায়ারফক্স এবং অন্যান্য ব্রাউজারগুলির সাথে আমার জন্য কাজ করে। আপনার সমস্যা অন্যত্র হয় caused সম্ভবত আপনি কিছু ক্যাশে সাফ করতে ভুলে গেছেন? বা সেই শিরোনামগুলি ভুল প্রতিক্রিয়াতে সেট করা আছে?
BalusC

@ বালুসসি আমি doFilter()পদ্ধতিটিকে ওভাররাইড করার জন্য একটি পৃথক ফিল্টার শ্রেণি তৈরি করেছি । আমি যখন লগআউট বোতাম টিপুন তখন এটি কোনও সার্লেটে পুনর্নির্দেশ করা হবে যেখানে আমি সেশনটি অবৈধ করে রাখি। আমি নিশ্চিত না যে doFilter()পদ্ধতিটি এখানে কীভাবে কার্যকর হয় । আপনি কি আমাকে এটি প্রয়োগ করতে পারেন দয়া করে? হিসাবে, অনুসরণ করতে সঠিক পদক্ষেপ। ধন্যবাদ
অঞ্জন বড়দ্বাজ

আমার জন্য ভাল কাজ করেছে। উভয় sendRedirect(...)এবং পরে পরীক্ষা করা হয়েছে forward()
Hal50000

5

* .jsp url প্যাটার্নে কাজ করবে না যদি আপনি কোনও পৃষ্ঠা ফরোয়ার্ড করেন। আপনার সার্লেটটিও অন্তর্ভুক্ত করার চেষ্টা করুন .. যা আপনার অ্যাপ্লিকেশনটিকে এই ব্যাক বোতামের সমস্যা থেকে সুরক্ষিত করে তুলবে।


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
আপনার উত্তরটি কার্যকর হলেও, ওপি'র পছন্দের প্রোগ্রামিং ভাষার সাথে সম্পর্কিত উত্তরটি পোস্ট করুন। আপনার সি # সমাধানটি ওপির জাভা ইই প্রকল্পে সহায়তা করবে না।
বুহাকে সিন্ধি

0

আপনি হোমপৃষ্ঠাটি ক্যাশে না করার জন্য ব্রাউজারকে বলার চেষ্টা করতে পারেন (উপযুক্ত শিরোনাম ব্যবহার করে - মেয়াদ উত্তীর্ণ হবে, ক্যাশে-নিয়ন্ত্রণ, প্রাগমা)। তবে এটির কাজের নিশ্চয়তা নেই। আপনি যা করতে পারেন তা হল ব্যবহারকারী লগড আছে কিনা তা যাচাই করার জন্য পৃষ্ঠা লোডের সার্ভারে একটি অজ্যাক্স কল করা হয়েছে, এবং না - পুনর্নির্দেশ।


13
তবে যদি দুষ্ট মন জাভাস্ক্রিপ্ট অক্ষম করে তবে এটি কাজ করে না এবং তবুও তিনি পৃষ্ঠাটি দেখতে পাবেন।
acme

0

এটি করার সঠিক উপায় হ'ল যুক্ত করা

Vary: Cookie

সুরক্ষিত পৃষ্ঠাগুলিতে শিরোনাম। ব্যবহারকারী লগ আউট করার পরে, তাদের সেশন কুকি সাফ করুন। তারপরে, লগ আউট করার পরে যখন তারা আবার নেভিগেট করবে, তখন ব্রাউজারের ক্যাশে মিস হবে। এটি সম্পূর্ণরূপে ক্যাচিংকে পরাস্ত না করার সুবিধাও রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.