2013-07-01 4 views
0

Я пытаюсь написать фильтр, который проверяет, вошел ли пользователь в систему, и в случае не перенаправляет его на страницу входа. Ранее у меня был фильтр, который на самом деле ничего не делал -_- здесь это, и с этим фильтром everythig работает нормально, и сессией аннулирует:сеанс не отменяет

public void doFilter(ServletRequest req, ServletResponse res, 
     FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest request = (HttpServletRequest) req; 
    HttpSession session = request.getSession(); 
    if (session == null || session.getAttribute("UserName") == null) { 
     String command = request.getParameter("command"); 

     request.setAttribute("command", "login"); 
     // String page = ConfigurationManager.getInstance().getProperty(
     // ConfigurationManager.LOGIN_PAGE_PATH); 

    } else { 
     String username = (String) session.getAttribute("UserName"); 
     UserRole role; 
     try { 
      role = UserDAOImpl.getUserRole(username); 
      session.setAttribute("role", role); 
     } catch (DAOTechnicException e) { 
      logger.error(e); 
     } catch (DAOLogicException e) { 
      logger.error(e); 
     } 
    } 
    chain.doFilter(req, res); 
} 

и когда я аннулирование сессии, то он идет (если сессия == NULL) блок, и все в порядке.

, но теперь у меня есть еще один фильтр, вот это:

public class UserCheckFilter implements Filter { 

    static class FilteredRequest extends HttpServletRequestWrapper { 

     public FilteredRequest(ServletRequest request) { 
      super((HttpServletRequest) request); 
     } 

     public String getParameter(String paramName) { 
      String value = super.getParameter(paramName); 
      if(value!=null){ 
       if (value.equals("login")) { 
        return value; 
       } 

       HttpSession session = super.getSession(); 
       if (session == null || session.getAttribute("UserName") == null) { 
        value = "login"; 
       } 
      } 
      return value; 
     } 
    } 

    /** 
    * Checks if user logged in and if not redirects to login page 
    */ 
    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, 
      FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpSession session = request.getSession(false); 
     if (session == null || session.getAttribute("UserName") == null) { 
      if(request.getParameter("command")!=null){ 
       String command = request.getParameter("command"); 
       if(!command.equals("login")){ 
        FilteredRequest filtrequest = new FilteredRequest(request); 
        String filteredvalue = filtrequest.getParameter("command"); 
        chain.doFilter(filtrequest, res); 
       }else{ 
        chain.doFilter(req, res); 
       } 
      }else{ 
       chain.doFilter(req, res); 
      } 
     } else { 
      String username = (String) session.getAttribute("UserName"); 
      UserRole role; 
      chain.doFilter(req, res); 
      try { 
       role = UserDAOImpl.getUserRole(username); 
       session.setAttribute("role", role); 

      } catch (DAOTechnicException e) { 
       logger.error(e); 
      } catch (DAOLogicException e) { 
       logger.error(e); 
      } 
     } 

    } 

, в котором я оберните метод getParameter и проверить, если не зарегистрированный пользователь пытается перейти на пользователя или администратора страниц. Но когда я аннулирую сессию, она не делает недействительными, то есть все параметры остаются неизменными, а затем в фильтре, где он проверяет, является ли session! = Null, это не null, а в строке session.setAttribute («role», role) ; Я получаю исключение «сессия уже недействителен»

вот метод, где я аннулированию сессия:

if(request.getSession(false)!=null){ 
     request.getSession().invalidate(); 
    } 
    String page = ConfigurationManager.getInstance().getProperty(
       ConfigurationManager.LOGIN_PAGE_PATH); 
    return page; 

и сервлет U использовать

RequestDispatcher dispatcher = getServletContext() 
       .getRequestDispatcher(page); 
     dispatcher.forward(request, response); 

и кстати такие вещи недействительности сессия происходит только со вторым фильтром

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

+0

http: // stackoverflow.com/a/14562188/738746 очень четко объясняет, когда и что именно вы должны сделать, чтобы достичь того, чего вы в конечном итоге пытаетесь достичь. –

ответ

1

Я думаю, это потому, что вы всегда вызываете chain.doFilter().

Per документы Oracle, ...

Типичная реализация этого метода будет следовать следующей схеме: -

  1. EXAMINE запрос
  2. Необязательно обернуть объект запроса с обычаем реализация для фильтрации содержимого или заголовков для фильтрации входных данных
  3. При необходимости оберните объект ответа с помощью специальной реализации для фильтрации содержимого или заголовки для фильтрации выходного
  4. а) Либо ссылаться на следующий объект в цепочке с помощью объекта FilterChain (chain.doFilter()),
  5. б) или не проходит на паре запрос/ответ на следующий объект в цепочке фильтров для блокировки обработки запроса
  6. Непосредственно заданные заголовки ответа после вызова следующего объекта в цепочке фильтров.

На шаге 4, вы, вероятно, хотите сделать (б) - то есть, вместо передачи запроса на следующий фильтр в цепочке, возвращает результат пользователю. Я имею в виду, что это недействительный сеанс, поэтому зачем пытаться выполнить дополнительную обработку?

+0

в порядке, thnx, я попробую – DeadKennedy

Смежные вопросы