Ограничить доступ к незарегистрированным пользователям [дублировать]

U-префикс означает, что у вас есть строка Unicode. Когда вы действительно используете строку, она не будет отображаться в ваших данных. Не нажимайте напечатанный вывод.

Например, попробуйте следующее:

print mail_accounts[0]["i"]

Вы не увидите u.

20
задан BalusC 4 February 2016 в 10:24
поделиться

1 ответ

Предисловие. Похоже, вы используете вход для входа в систему, а не для входа в контейнер. Для всех способов см. Как обрабатывать аутентификацию / авторизацию с пользователями в базе данных?


Фильтр (перехватчик) не должен проверять правильность имени пользователя / пароли. Это ответственность сервлета (контроллера).

Фильтр должен просто проверять, вошел ли пользователь в систему (обычно, просто проверяя наличие атрибута сеанса), а затем продолжить запрос или заблокировать его, перенаправив его обратно на страницу входа в систему.

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

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

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

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

    // ...
}

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

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @EJB
    private UserService userService;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        Map<String, String> messages = new HashMap<String, String>();

        if (username == null || username.isEmpty()) {
            messages.put("username", "Please enter username");
        }

        if (password == null || password.isEmpty()) {
            messages.put("password", "Please enter password");
        }

        if (messages.isEmpty()) {
            User user = userService.find(username, password);

            if (user != null) {
                request.getSession().setAttribute("user", user);
                response.sendRedirect(request.getContextPath() + "/home");
                return;
            } else {
                messages.put("login", "Unknown login, please try again");
            }  
        }

        request.setAttribute("messages", messages);
        request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
    }

}

См. также:

45
ответ дан Community 22 August 2018 в 20:44
поделиться
  • 1
    +1. И для еще более удобного пользовательского интерфейса, если перехваченный запрос является GET, кешируйте его (или добавляйте его как скрытое поле на странице входа) и перенаправляйте на эту страницу после успешного входа в систему. – JB Nizet 7 November 2012 в 21:52
  • 2
    Конкретный пример этого можно найти здесь: stackoverflow.com/questions/6388014/… – BalusC 7 November 2012 в 21:56
  • 3
    Спасибо, я не думал о пользователе, уже вошедшем в систему. – Hoper 7 November 2012 в 22:04
  • 4
    Пожалуйста. Убедитесь, что фильтр не вызывается на самой странице входа! В противном случае это может закончиться бесконечным циклом. Вам нужно будет либо поместить ограниченные страницы в отдельную папку (чтобы вместо этого использовать шаблон URL из /somefolder/*), либо добавить дополнительную проверку на URL-адрес запроса, если конечный пользователь в настоящее время не запрашивает логин стр. – BalusC 7 November 2012 в 22:06
  • 5
    не могли бы вы объяснить, что дополнительная проверка для страницы входа или исключения js или css-страниц? – Vnge 6 March 2014 в 23:34
Другие вопросы по тегам:

Похожие вопросы: