Фильтр Java для перенаправления пользователей, которые не вошли в систему, на страницу входа

Я пытался создать фильтр, чтобы запретить пользователям, которые не вошли в систему, доступ к определенным страницам. Для этого я создал класс фильтра со следующим методом doFilter

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String url = request.getRequestURI();
boolean allowedRequest = false;

System.out.println(url);

if(urlList.contains(url)) {
    allowedRequest = true;
    System.out.println("in list");
}

if (!allowedRequest) {
    Object o = request.getSession().getAttribute("UserInfo");
    if (null == o) {
        System.out.println("Hey i am in");
        response.sendRedirect("/login.jsp");
    }
}

chain.doFilter(req, res);

} // end of doFilter

Чтобы разрешить страницы, которые не требуют входа пользователя, я создал список URL-адресов arraylist в init().

Сейчас происходит очень странная глупость. предположим, у меня есть две страницы home.jsp и dcr.jsp. Когда я пытаюсь получить доступ к home.jsp без входа в систему, я успешно перенаправляюсь на login.jsp, но когда я пытаюсь получить доступ к dcr.jsp, он не перенаправляется, хотя входит в цикл if(null == o), который я могу понять потому что я получаю эту строку, напечатанную в консоли. Это вывод, который я получаю на сервере. Это вывод, который я получаю на сервере.

/dcrmaintenance.jsp

Hey i am in

Что говорит мне, что null == o было правдой.

Страница dcr.jsp обращается к объекту сеанса, и, поскольку пользователь не вошел в систему, он получает java.lang.NullPointerException, как и ожидалось, но я не могу понять, почему перенаправление не происходит даже после входа в цикл. Если кто-то может указать, где я делаю ошибку, это будет оценено.


person Shamik    schedule 19.04.2012    source источник


Ответы (4)


После response.sendRedirect("/login.jsp"); сделайте return;.

person Joop Eggen    schedule 19.04.2012

Я считаю, что вы должны либо вызвать sendRedirect, либо doFilter. Например.

if (requiresLogin)
  response.sendRedirect("/login.jsp");
else
  chain.doFilter(req,resp);
person erikxiv    schedule 19.04.2012

chain.doFilter(req, res);

Какие еще фильтры работают в вашем приложении? Вы отправляете перенаправление, но продолжаете цепочку фильтров. Я предполагаю, что другой фильтр снова изменяет ответ. Если вы остаетесь со своим фильтром, просто вернитесь после перенаправления.

Вместо фильтра в Java WebApp вы можете определить свои ограничения безопасности в файле web.xml. Взгляните на Ограничения безопасности.

Краткий пример:

<security-constraint>
  <web-resource-collection>
     <web-resource-name>Restricted Area</web-resource-name>
     <url-pattern>*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
     <role-name>Authorized</role-name>
  </auth-constraint>
</security-constraint>
person proko    schedule 19.04.2012
comment
У меня не было другого фильтра. Другое решение сработало. Но я проверю, как я могу использовать ограничения безопасности! Благодарю. - person Shamik; 19.04.2012

Я думаю, вам нужно изменить свой web.xml... Вы должны поместить свои ограниченные ресурсы в соответствующую папку. Таким образом, сервлет фильтра будет ограничивать файлы, которые размещаются в «ограниченной» папке. Servlet-Filter.htm" rel="nofollow">http://www.developer.com/security/article.php/3467801/Securing-J2EE-Applications-with-a-Servlet-Filter.htm) (И я думаю, что причиной использования Filter Servlet является написание собственной системы авторизации. Таким образом, вам не нужно определять свои ограничения безопасности в файле web.xml, вы должны определить его в базе данных;))))

<!--Servlet Filter that handles site authorization.-->
<filter>
     <filter-name>AuthorizationFilter</filter-name>
     <filter-class>examples.AuthorizationFilter</filter-class>
     <description>This Filter authorizes user access to application
                  components based upon request URI.</description>
     <init-param>
        <param-name>error_page</param-name>
        <param-value>../../login.html</param-value>
     </init-param>
</filter>

<filter-mapping>
     <filter-name>AuthorizationFilter</filter-name>
     <url-pattern>/restricted/*</url-pattern>
</filter-mapping>
person Musa    schedule 26.07.2015