Как я могу обрабатывать / ограничивать доступ пользователей к сервлетам и jsp?

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

прямо сейчас структура веб-приложения может быть (упрощена) описана следующим образом:

Register-Servlet -> Register.jsp
        |
        V
Login-Servlet -> Login.jsp
        |
        V
Main-page-Servlet -> Main.jsp

Итак, прямо сейчас пользователь может войти в систему.jsp, его логин-информация будет отправлена в Логин-сервлет, который проверит его, а затем отправит на главную страницу-сервлет. Затем сервлет главной страницы (после повторной проверки входа в систему) получает все текущие события из базы данных, присоединяет ее к запросу и пересылает в Main.jsp, который отображает его для пользователя.

теперь, если пользователь хочет получить доступ к основным.jsp напрямую (не выходя из главной страницы-сервлета), он, очевидно, не может отображать доступные события. Обходной путь, который я использую в настоящее время, делает null-проверьте, есть ли события, а если нет, перенаправьте на главную страницу-сервлет.

это беспокоит меня, чтобы решить мою проблему так, как я не думаю, что это лучшая практика, и я думаю, что это просто создаст много других проблем, чем больше мое приложение получает.

моя первая мысль об этом была, что было бы полезно, если бы я мог просто "скрыть" все .jsp от пользователя, поэтому пользователь будет приземляться только на сервлеты и не может получить доступ к ним .ССП в различный способ.

есть ли способ сделать это? Или, если нет, какое решение было бы лучшим, если бы я писал профессиональное приложение на уровне предприятия?

1 ответов


это можно обработать в Filter и есть большое объяснение и пример в сервлет StackOverflow-фильтр wiki.

адаптация кода для вашей проблемы (обратите внимание на добавление и использование needsAuthentication способ):

@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig config)
        throws ServletException {
        // If you have any <init-param> in web.xml, then you could get them
        // here by config.getInitParameter("name") and assign it as field.
    }

    @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);

        String requestPath = httpServletRequest.getRequestURI();

        if (needsAuthentication(requestPath) ||
            session == null ||
            session.getAttribute("user") == null) { // change "user" for the session attribute you have defined

            response.sendRedirect(request.getContextPath() + "/login"); // No logged-in user found, so redirect to login page.
        } else {
            chain.doFilter(req, res); // Logged-in user found, so just continue request.
        }
    }

    @Override
    public void destroy() {
        // If you have assigned any expensive resources as field of
        // this Filter class, then you could clean/close them here.
    }

    //basic validation of pages that do not require authentication
    private boolean needsAuthentication(String url) {
        String[] validNonAuthenticationUrls =
            { "Login.jsp", "Register.jsp" };
        for(String validUrl : validNonAuthenticationUrls) {
            if (url.endsWith(validUrl)) {
                return false;
            }
        }
        return true;
    }
}

Я бы рекомендовал переместить все страницы, которые требуют аутентификации внутри папки, такой как app а затем измените веб-фильтр на

@WebFilter("/app/*")

таким образом, вы можете удалить the needsAuthentication метод из фильтра.