Поясните работу простого веб приложения на сервлетах — java java-ee servlet

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд
Загрузка...

Вопрос:


Сделал тестовое веб приложение с 3-мя страницами: login.xhtml, registr.xhtml и index.xhtml. 2-мя сервлетами: LoginServlet и RegistrServlet, которые отвечают за вход и регистрацию пользователя, соответственно. Также добавил веб фильтр: LoginFilter, который проверяет прошел ли пользователь аутентификацию. Если нет и находится не на странице login.xhtml, то фильтр перенаправляет пользователя на данную страницу.

Структура проекта:

LoginWithServlet
   Web Pages
      WEB-INF
         web.xml
      login.xhtml
      registr.xhtml
      index.xhtml
   Source Packages
      classes
         User.java
         Database.java
      filters
         LoginFilter.java
      servlets
         LoginServlet.java
         RegistrServlet.java

Сервлеты и фильтр:

@WebServlet(name = "LoginServlet", urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet {

    private static final Logger logger = Logger.getLogger(LoginServlet.class.getName());

    @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher(request.getContextPath() + "/login.xhtml").forward(request, response);
    }

    @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext ctx = request.getServletContext();

        String login = (String) request.getParameter("login");
        String password = (String) request.getParameter("password");

        Database database = Database.getInstance();
        User user = database.find(login, password);
        if (user == null) {
//            request.getRequestDispatcher(request.getContextPath() + "/registr").forward(request, response);
            ctx.log("Incorrect login or password");
            response.sendRedirect(request.getContextPath() + "/registr");
        }
        else {
            ctx.log(String.format("User %s has logged in", user));
            request.getSession().setAttribute("user", user);
            request.getRequestDispatcher(request.getContextPath() + "/index.xhtml").forward(request, response);
        }
    }
}

@WebServlet(name = "RegistrServlet", urlPatterns = {"/registr"})
public class RegistrServlet extends HttpServlet {

    private static final Logger logger = Logger.getLogger(RegistrServlet.class.getName());

    @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher(request.getContextPath() + "/registr.xhtml").forward(request, response);
    }

    @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext ctx = request.getServletContext();

        Long id = Long.valueOf(request.getParameter("id"));
        String login = (String) request.getParameter("login");
        String password = (String) request.getParameter("password");

        User user = new User(id, login, password);
        Database database = Database.getInstance();
        boolean inserted = database.insert(user);
        if(inserted) {
            ctx.log(String.format("New user %s has registred", user));
            request.getSession().setAttribute("user", user);
            request.getRequestDispatcher(request.getContextPath() + "/index.xhtml").forward(request, response);
        }
        else {
            ctx.log("Such user already exists");
        }
    }

    @Override public String getServletInfo() {
        return "Short description";
    }

}

@WebFilter("/*")
public class LoginFilter implements Filter {

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

        boolean loggedIn = session != null && session.getAttribute("user") != null;
        boolean loginRequest = req.getRequestURI().equals(loginURI);

        if(loggedIn || loginRequest) {
            chain.doFilter(request, response);
        } 
        else {
            res.sendRedirect(loginURI);
        }
    }
}

Начальная страница: index.xhtml

Последовательность действий, при запуске данного приложения (как я себе представляю):

  1. Пользователь делает запрос на страницу index.xhtml;
  2. Так как пользователь еще не аутентифицирован, LoginFilter перенаправляет его по URL-у loginURI = req.getContextPath() + "/login" (этот URL обрабатывает сервлет LoginServlet);
  3. В сервлете LoginServlet вызывается метод doGet;
  4. Метод doGet направляет пользователя на страницу login.xhtml;
  5. Зависит от того есть ли такой пользователь в базе: если да — то пользователь направляется на страницу index.xhtml, если нет — по URL-у request.getContextPath() + "/registr", который обрабатывает сервлет RegistrServlet.

Вроде все красиво, но есть одно но. Сразу при запуске я получаю ошибку с кодом 404 и сообщением:

/LoginWithServlet/login.xhtml Not Found in ExternalContext as a Resource

Попробовал изменить loginURI в LoginFilter на loginURI = req.getContextPath() + "/login.xhtml" (вместо «/login» написал «/login.xhtml») и фильтр удачно перенаправил на страницу login.xhtml. Но беда, при попытка ввести любые данные (существующие и нет) я так и остаюсь на странице login.xhtml.

Заранее спасибо!

Автор вопроса: not a Programmer

Источник

Вам также может быть интересно:

Drag and Drop UWP — c# xaml mvvm
Вопрос: Нужно иметь возможность добавлять изображения в приложение путем перетаскивания из файловой системы У Grid включил AllowDrop. Но как добавить перетаскиваемые изображения в коллекцию? Т.к. те ...
Растягивание Высоты , Резина — html css html5
Вопрос: Здравствуйте! Реализовал резиновый дизайн. Растягивается ширина, но длина по % не растягивается. Возможно ли это реализовать? Или так и задумано, растягивание только на ширину ...
Jquery position().left Как быть на мобильниках? — javascript jquery css
Вопрос: На мобильных устройствах, если зумишь экран, position всегда разный. $('g').position().left Как сделать так, чтобы он не менял свои значения? Автор вопроса: ...
Jquery position().left Как быть на мобильниках? — javascript jquery css
Вопрос: На мобильных устройствах, если зумишь экран, position всегда разный. $('g').position().left Как сделать так, чтобы он не менял свои значения? Автор вопроса: ...
requestAnimation и очередность отрисовки — javascript canvas
Вопрос: Здравствуйте! Реализовал 2D игру и в Edge работает все плавно и круто, но в Firefox'e подвисает, сказали, что нужно сделать, чтобы раз-два момент и все ...
Контекстное/всплывающее меню в Android — java android popup
Вопрос: Есть ли техническая возможность сделать приложение, добавляющее свое контекстное или всплывающее меню в любом месте системы? Хочу, чтобы при выделении любого текста появлялась дополнительная кнопка ...
Контекстное/всплывающее меню в Android — java android popup
Вопрос: Есть ли техническая возможность сделать приложение, добавляющее свое контекстное или всплывающее меню в любом месте системы? Хочу, чтобы при выделении любого текста появлялась дополнительная кнопка ...
Завершить службы циклом — c# windows-service
Вопрос: Можно ли остановить службы циклом? У меня есть список служб, занёс их в List List<string> name = new List<string> { "AdobeARMservice", "RemoteRegistry", "TermService", "Messenger", "SSDPSRV", ...
Завершить службы циклом — c# windows-service
Вопрос: Можно ли остановить службы циклом? У меня есть список служб, занёс их в List List<string> name = new List<string> { "AdobeARMservice", "RemoteRegistry", "TermService", "Messenger", "SSDPSRV", ...
RecyclerView — разная разметка — android recyclerview
Вопрос: Смотрел, я смотрел в сторону RecyclerView и наконец решил кинуть ListView и на тебе! В "плохом прошлом" мой ListView использовался для двух разметок. Сейчас я ...
RecyclerView — разная разметка — android recyclerview
Вопрос: Смотрел, я смотрел в сторону RecyclerView и наконец решил кинуть ListView и на тебе! В "плохом прошлом" мой ListView использовался для двух разметок. Сейчас я ...
Как правильно передать массив аргументом для пользовательской функции — php
Вопрос: Если не брать в функцию все это, тогда результат работает. А если вот так в функции все выполнять, тогда PHP ругается: «Invalid ...
Как правильно передать массив аргументом для пользовательской функции — php
Вопрос: Если не брать в функцию все это, тогда результат работает. А если вот так в функции все выполнять, тогда PHP ругается: «Invalid ...
ViewPager внутри ViewPager — такие матрешки работают? — android viewpager
Вопрос: Доброго времени суток. Назрела новая задача. Есть каталог мастеров. При выборе конкретного мастера открывается его страница (активити с ViewPager), и теперь мастеров можно перелистывать свайпом. ...
Почему id всегда 1 Yii2 — yii авторизация
Вопрос: Использую все как по документации. Для получения информации о пользователе использую $identity = $model->findOne(]); И каким бы не был email, id пользователя всегда ...

Оставьте ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *