A фильтр сервлетов определенно то, что вы ищете.Вы также можете захватить контейнер, управляемый или пружинная защита , но, учитывая ваши знания, это, вероятно, будет слишком далеко, чтобы получить правильное понимание.
Вот базовый пример того, как должен выглядеть метод doFilter()
вашего фильтра:
if (UserServiceFactory.getUserService().getCurrentUser() != null) {
chain.doFilter(request, response); // User is logged in, just continue request.
} else {
((HttpServletResponse) response).sendRedirect("/login.jsp"); // Not logged in, show login page. You can eventually show the error page instead.
}
Отобразите этот фильтр в web.xml
на url-pattern
, охватывающем страницы, которые выхотел бы подтвердить подлинность.Например, /secured/*
, /private/*
, /authenticated/*
и т. Д., И поместите все JSP (за исключением страницы входа!) В одну папку.
Относительно того, почему он терпит неудачу в JSP: это может произойти, когда ответ уже зафиксирован.Если вы прочитали журналы сервера, вы должны были увидеть IllegalStateException: Response already committed
в точке, где вызывается <jsp:forward>
.Это работает в PHP, вероятно, потому что он имеет больший буфер ответов или потому, что эта логика по совпадению правильно вызывается перед любой частью тела ответа, то есть прямо перед <!DOCTYPE>
и так далее.Пока ответ не зафиксирован, вы можете изменить его назначение с помощью переадресации или перенаправления.