Как реализовать фиктивный фильтр, чтобы исключить файл из фильтрации? - PullRequest
0 голосов
/ 11 октября 2010

Я пытаюсь внедрить фильтр для всех моих файлов, кроме login.jsp. Я понимаю, что сопоставление фильтров не может исключать определенные файлы. Что мне нужно сделать, это создать еще один фильтр для сопоставления только login.jsp. Как создать еще один файл с шаблоном URL /login.jsp и без обработки SessionFilter после него? Вот часть моего кода для фильтра сеанса для всех файлов.

public class SessionFilter implements Filter{ 
   RequestDispatcher rd = null; 

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) 
   throws IOException, ServletException{ 
      HttpServletRequest request = (HttpServletRequest)request; 
      HttpSession session = request.getSession(); 

   // New Session so forward to login.jsp 
   if (session.isNew()){ 
     rd = request.getRequestDispatcher("login.jsp"); 
     rd.forward(request, response); 
  } 

  // Not a new session so continue to the requested resource 
   else{ 
      filterChain.doFilter(request, response); 
  } 
} 

Ответы [ 2 ]

2 голосов
/ 11 октября 2010

Вы можете проверить, находится ли запрошенный путь в вашем "исключенном списке" с помощью request.getServletPath().

Если вы хотите, чтобы новый Filter отделился от SessionFilter, вы можете установить специальный флаг в качестве атрибута запроса (например, «loginPage»), который будет проверяться другими фильтрами (если вы хотите новый Filter отделен от SessionFilter) или вы просто не можете вызвать chain.doFilter().

Если вы изменяете SessionFilter, просто не отправляйте повторно "login.jsp"

1 голос
/ 11 октября 2010

Вам не нужен новый фильтр.Вы можете проверить это на своем собственном фильтре.

if(request.getServletPath().equals("login.jsp") || !session.isNew()) { // or "/login.jsp", not sure about this
   filterChain.doFilter(request, response); 
} else { // session is new and it's not login.jsp
     rd = request.getRequestDispatcher("login.jsp"); 
     rd.forward(request, response);    
}

Но мне не нравится такой подход.Это похоже на переписывание JAAS API для сервлетов.И это подразумевает жесткое кодирование путей jsp, что может быть не очень хорошей идеей в плане обслуживания и переносимости.

...