Использование фильтров для ограничения доступа к JSP? - PullRequest
1 голос
/ 22 июля 2011

Я использую Javascript-вызов из JSP для входа в систему с помощью AJAX-вызова и прототипной структуры для запроса на стороне сервера. Я настроил фильтр для перехвата всех запросов, чтобы можно было либо перенаправить на страницу входа, либо продолжить.

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

Каков наилучший способ справиться с этим?

Спасибо!

1 Ответ

2 голосов
/ 22 июля 2011

Я понимаю, что вы не используете управляемую контейнером аутентификацию Java EE.Именно при правильной настройке это будет приниматься во внимание автоматически.

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

Предполагая, что ваш метод входа выглядит следующим образом:

User user = userService.find(username, password);

if (user != null) {
    request.getSession().setAttribute("user", user);
}

// ...

Тогда вы можете просто сделать следующее в фильтре:

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    HttpSession session = request.getSession(false);

    if (session == null || session.getAttribute("user") == null) {
        response.sendRedirect("login.jsp"); // No logged-in user found, so redirect to login page.
    } else {
        chain.doFilter(req, res); // Logged-in user found, so just continue request.
    }
}

Сопоставьте этот фильтр с шаблоном URL, который охватывает защищенные страницы, например, /app/* или что-то еще.

...