эквивалент заголовка php в JSP - PullRequest
2 голосов
/ 29 июля 2010

в php Я использовал для проверки подлинности, вошел ли пользователь в систему или нет, проверив сеанс на предмет идентификатора участника, если он установлен в порядке, иначе страница будет перенаправлена ​​через заголовок на страницу входа. Этот скрипт авторизации был в auth.php, и я использовал его для включения в любую страницу, требующую входа в систему. просто. Однако я не могу сделать то же самое в JSP. потому что остальная часть страницы, которая включает в себя auth.jsp, загружается независимо от того, что делает auth.jsp. auth.jsp равен

<%
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
if (user == null) {
%>
<jsp:forward page="/index"/>
<%
return; 
}
%>

если пользователь не вошел в систему, он все еще может видеть исходную страницу под страницей входа. из-за этого мне приходится вручную включать проверку пользователя с помощью if else на каждой странице, что очень неудобно. какие-либо решения ?? включающая страница

<jsp:include page="auth.jsp" />
<p>Welcome</p>

Ответы [ 2 ]

1 голос
/ 29 июля 2010

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> и так далее.Пока ответ не зафиксирован, вы можете изменить его назначение с помощью переадресации или перенаправления.

1 голос
/ 29 июля 2010

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

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

РЕДАКТИРОВАТЬ:

Нет проблем.

В то же время вы, вероятно, хотите сделать что-то подобное в auth.jsp

<%
  if (user == null){
    response.sendRedirect(redirectURL);
  }
%>

что-то вроде

response.addHeader("location", "/login.jsp");

, что-то вроде того, к чему вы привыкли в PHP.

...