#java #jsp #session #servlets #servlet-filters
#java #jsp #сессия #сервлеты #servlet-фильтры
Вопрос:
я использую jsp servlet для создания веб-приложения, я хочу запретить пользователю показывать страницу входа, если он уже вошел в систему, я создаю фильтр, который проверяет это, но он все равно показывает страницу входа, даже если у пользователя есть действительный сеанс, вот код в фильтре.
HttpSession session = httpreq.getSession(false);
if(session == null){
System.out.println("not logged, redirect ");
httpres.sendRedirect("../Login.jsp");
}
else{
System.out.println("could be logged");
String logged = (String) session.getAttribute("Login");
if(logged != null){
System.out.println(" logged " logged);
if (!logged.equals("ok")) { // user is not logged
System.out.println("not logged, redirect ");
httpres.sendRedirect("../Login.jsp");
return;
} else { // if user has a session redirect his to the page he was opened
System.out.println("redirect to the same page");
chain.doFilter(request, response);
System.out.println("redirect to the same page");
httpres.setCharacterEncoding("UTF-8");
httpres.sendRedirect(httpreq.getRequestURI());
}
}else
{
System.out.println("not logged, redirect login ");
httpres.sendRedirect("../Login.jsp");
return;
}
}
Я создаю сеанс только для папок, расположенных за пределами папки WEB-INF.
Редактировать: Вот код для проверки достоверности пользователя и добавления атрибутов в сеанс
isVaild = StudentManagement.isValidUser(connection, studentUserName, password);
// I have more than one roles in the system..
}
if (isVaild) {
System.out.println("create session");
HttpSession session = request.getSession();
session.setAttribute("Login", "ok");
session.setAttribute("userName", userName);
session.setAttribute("role", role);
if (role == UserRole.STUDENT) { //student role
url = "/ParentManagementServlet?pageName=StudentActivationPage";
forward(request, response, url);
} else if (role == UserRole.ADMIN) { //admin role
url = "/Admin/MainPage.jsp";
forward(request, response, url);
}
Правка 2:
вот сопоставление URL в web.xml файл
<filter-mapping>
<filter-name>AuthenticationFilter</filter-name>
<url-pattern>/Admin/*</url-pattern>
</filter-mapping>
поскольку Admin — это папка, которая находится за пределами папки WEB-INF.
Комментарии:
1. где вы написали эту логику?
2. @Alaa — Можете ли вы подробнее объяснить, когда пользователь может видеть страницу входа? 1) повторно нажав URL страницы входа или 2) используя кнопку «Назад» браузера
3. @Falcon, пользователь не должен иметь возможности вернуться к входу в систему в обоих случаях, как вы упоминаете, этот фильтр предотвращает указание URL страницы входа, и я должен найти способ также запретить использование кнопки «Назад».
4. @Alaa — Не могли бы вы, пожалуйста, показать код, в котором вы устанавливаете атрибуты, такие как Login? и что говорит sout .. они отображаются?
5. можете ли вы проверить обновленный раздел, пожалуйста.
Ответ №1:
Кажется, все в порядке, кроме сопоставления фильтров, попробуйте —
<filter-mapping>
<filter-name>AuthenticationFilter</filter-name>
<url-pattern>/protected directory/*</url-pattern>
</filter-mapping>
Я предполагаю, что вы хотите защитить все в каталоге, и приведенный выше шаблон URL будет проверять весь каталог.. вы можете точно настроить шаблон в соответствии с вашими потребностями.
Но дело в том, что шаблон, упомянутый в вопросе ( <url-pattern>/Admin/*</url-pattern>
), не перехватывается Login.jsp
, и именно поэтому он не может выполнить проверку сеанса и визуализировать Login.jsp
даже для действительных сеансов.
Вы можете выполнить проверку в существующем фильтре — относится ли запрос к Login.jsp, а затем можете принять решение (я не знаю, хороший ли это способ), в противном случае удалите Login.jsp из защищенного каталога и напишите другой фильтр, который соответствует только Login.jsp
Комментарии:
1. когда я делаю вот так «/ *», Login.jsp не запускается, кажется, что он тоже защищен, он отображается на localhost: 8080/Login.jsp , который не является реальным путем к странице Login.jsp !!
2. отредактировал ответ.. но я думаю, вы поняли, что это становится неправильным.. но если вас интересует наилучшая практика для этого, тогда вы можете опубликовать другой вопрос, потому что это будет выходить за рамки этого вопроса 🙂