Предотвратить доступ пользователя к ранее посещаемой защищенной странице после выхода из системы

У меня есть требование, чтобы конечный пользователь не смог вернуться на ограниченную страницу после выхода из системы/выхода из системы. Но в настоящее время конечный пользователь может сделать это с помощью кнопки браузера, просмотра истории браузера или даже путем повторного ввода URL-адреса в адресной строке браузера.

В принципе, я хочу, чтобы конечный пользователь не мог получить доступ к странице с ограничениями после выхода из системы. Как я могу добиться этого лучше всего? Можно ли отключить кнопку "Назад" с помощью JavaScript?

Ответ 1

Вы можете и не должны отключать кнопку назад или историю браузера. Это плохо для пользователей. Есть JavaScript-хаки, но они ненадежны и также не будут работать, если клиент отключен JS.

Ваша конкретная проблема заключается в том, что запрошенная страница была загружена из кеша браузера, а не прямо с сервера. Это по сути безвредно, но действительно запутывает конечного пользователя, потому что он/она неправильно думает, что он действительно приходит с сервера.

Вам просто нужно указать браузеру не кэшировать все страницы JSP с ограниченным доступом (и, следовательно, не только сама страница выхода/действие!). Таким образом, браузер вынужден запрашивать страницу с сервера, а не из кеша, и поэтому все проверки входа на сервер будут выполнены. Вы можете сделать это, используя Filter, который устанавливает необходимые заголовки ответов в методе 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

*. jsp в Url Pattern не будет работать, если вы перешлите страницу. Попытайтесь включить свой сервлет тоже.., что сделает ваше приложение защищенным от этой проблемы с задней кнопкой.

Ответ 3

Самый простой способ сделать это без отключения кнопки возврата браузера - добавить этот код в событие 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");
        }
    }

Ответ 4

Вы можете попросить браузер не кэшировать домашнюю страницу (используя соответствующие заголовки - Expires, Cache-Control, Pragma). Но это не гарантировано. Что вы можете сделать, это сделать ajax-вызов сервера на загрузку страницы, чтобы проверить, зарегистрирован ли пользователь, а если нет - перенаправить.

Ответ 5

Правильный способ сделать это - добавить

Vary: Cookie

на защищенных страницах. Когда пользователь выйдет из системы, очистите их cookie сеанса. Затем, когда они будут перемещаться назад после выхода из системы, кеш браузера будет пропущен. Это также имеет преимущество не полностью победить кеширование.