Запретить пользователю видеть ранее посещенную защищенную страницу после выхода - PullRequest
98 голосов
/ 16 ноября 2010

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

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

Ответы [ 5 ]

132 голосов
/ 16 ноября 2010

Вы можете и не должны отключить кнопку браузера назад или историю.Это плохо для пользовательского опыта.Есть хаки 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, что и при проверке присутствия вошедшего в систему пользователя.

Не забудьте очиститькеш браузера перед тестированием!;)

См. Также:

5 голосов
/ 04 марта 2012

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

2 голосов
/ 29 июня 2015

Самый простой способ сделать это без отключения кнопки возврата браузера - добавить этот код в событие page_load для страницы, на которую пользователь не должен возвращаться после выхода из системы:

if (!IsPostBack)
    {
        if (Session["userId"] == null)
        {
            Response.Redirect("Login.aspx");
        }
        else
        {
            Response.ClearHeaders();
            Response.AddHeader("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate");
            Response.AddHeader("Pragma", "no-cache");
        }
    }
0 голосов
/ 05 ноября 2016

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

Vary: Cookie

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

0 голосов
/ 16 ноября 2010

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

...