Я создаю систему управления студентами, в которой у меня есть три пользователя.
Администратор, студенты и супер админы.
Я обрабатываю авторизацию через фильтр. Когда пользователи регистрируются, он перенаправляет его в соответствии с его ролью, например, если пользователь переадресовывает пользователя на страницу студента.
Но проблема с SuperAdmin в FilterBean
Фильтр работает в бесконечном цикле перенаправления
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
*
* @author Sikandar
*/
public class FilterBean implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//HttpSession session = req.getSession();
HttpSession session = req.getSession();
String userName = (String) session.getAttribute("userName");
String role = (String) session.getAttribute("role");
System.out.println("role in Filter out side condition " +role);
String url = req.getRequestURI();
if (session == null || userName == null) {
System.out.println("The role is if session == null "+role);
if (url.indexOf("admin.xhtml") >= 0 || url.indexOf("student.xhtml") >= 0 || url.indexOf("superadmin.xhtml") >= 0) {
resp.sendRedirect(req.getServletContext().getContextPath()+"/login.xhtml");
} else {
chain.doFilter(request, response);
}
} else {
if(role.equals("admin") && (url.indexOf("login.xhtml") >= 0 || url.indexOf("superadmin.xhtml") >= 0 || url.indexOf("student.xhtml") >= 0)) {
resp.sendRedirect(req.getServletContext().getContextPath()+"/admin.xhtml");
} else if (role.equals("super") && (url.indexOf("login.xhtml") >= 0 || url.indexOf("student.xhtml") >=0)) {
System.out.println("role == super "+url.indexOf("admin.xhtml"));
resp.sendRedirect(req.getServletContext().getContextPath()+"/superadmin.xhtml");
} else if (role.equals("student") && (url.indexOf("login.xhtml") >= 0 || url.indexOf("admin.xhtml") >=0 || url.indexOf("superadmin.xhtml") >= 0)) {
resp.sendRedirect(req.getServletContext().getContextPath()+"/student.xhtml");
}
else {
chain.doFilter(request, response);
}
}
}
@Override
public void destroy() {
}
}
else if (role.equals("super") && (url.indexOf("login.xhtml") >= 0 || url.indexOf("student.xhtml") >=0)) {
System.out.println("role == super "+url.indexOf("admin.xhtml"));
resp.sendRedirect(req.getServletContext().getContextPath()+"/superadmin.xhtml");
если я поставил url.indexOf("superadmin.xhtml");
в таком состоянии, он говорит, что есть более Перенаправление на страницу.
почему вы должны проверить на всех страницах и всегда перенаправлять на одну страницу? Ваш код, если он работает, перенаправляет супер администратора всегда на страницу супер администратора независимо от того, что он попросил student.xhtml или login.xhtml –
Правильный способ - это обработать роль на странице входа и когда пользователь вводит имя пользователя/пароль для перенаправления на правильный результат. После этого создайте фильтр, который проверяет только, зарегистрирован ли пользователь и перенаправляет его на страницу входа, если он не является. –