MockHttpServletRequest не передает URL следующему фильтру в цепочке - PullRequest
1 голос
/ 14 октября 2011

Я пытаюсь реализовать фильтр, который использует MockHttpServletRequest для добавления заголовка к объекту запроса. Я хочу использовать этот заголовок для предварительной аутентификации. Это класс фильтра ..

public class MockAuthFilter implements Filter{

   private FilterConfig filterConfig = null;
   private static String loggedInUserName = "myId";
   private static String httpRequestHeaderName = "SM_ID";
   private Logger logger = Logger.getLogger(MockAuthFilter.class);

   @Override
   public void destroy() {
     this.filterConfig = null;
   }

   @Override
   public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {

      if(this.filterConfig.getServletContext() == null){}

      HttpServletRequest httpRequest = (HttpServletRequest) request;        
      MockHttpServletRequest mRequest = new MockHttpServletRequest(this.filterConfig.getServletContext());
      if(mRequest.getHeader(httpRequestHeaderName)==null ||
            !mRequest.getHeader(httpRequestHeaderName).equalsIgnoreCase(loggedInUserName))
        mRequest.addHeader(httpRequestHeaderName, loggedInUserName);

      mRequest.setMethod("GET");
      mRequest.setRequestURI(httpRequest.getRequestURL().toString());
      logger.debug("**********************exiting doFilter() method*****************");
      chain.doFilter(mRequest, response);
     }

@Override
public void init(FilterConfig config) throws ServletException {
    this.filterConfig = config;
}

}

но URL не заполняется, когда запрос достигает следующего фильтра в цепочке фильтров Spring Security. Я вижу следующие строки в файле журнала ..

  [2011-10-13 16:52:35,114] [DEBUG] [http-8080-1] [com.app.filter.MockAuthFilter:doFilter:55] - **********************exiting doFilter() method*****************
  [2011-10-13 16:52:35,114] [DEBUG] [http-8080-1] [com.app.filter.MockAuthFilter:doFilter:55] - **********************exiting doFilter() method*****************
  [2011-10-13 16:52:35,114] [DEBUG] [http-8080-1] [org.springframework.security.web.util.AntPathRequestMatcher:matches:103] - Checking match of request : ''; against '/static/**'
   [2011-10-13 16:52:35,114] [DEBUG] [http-8080-1][org.springframework.security.web.util.AntPathRequestMatcher:matches:103] - Checking match of request : ''; against '/static/**'

Как вы можете видеть, в объекте запроса, переданном в метод совпадений AntPathrequestMatcher, не было URL. Я проверил объект mockrequest прямо перед методом chain.doFilter (), и он содержит значение url в своем поле requestURI. если URI и URL-адрес - это не одно и то же, какие изменения я должен внести здесь, чтобы сохранить URL в объекте запроса.

1 Ответ

2 голосов
/ 14 октября 2011
  1. Не используйте MockHttpServletRequest таким образом. Это для тестирования, а не для производственного кода. Надлежащий способ обернуть запрос и / или ответ в фильтре, чтобы впоследствии изменить его поведение, с помощью HttpServletRequestWrapper и HttpServletResponseWrapper .
  2. Почему вы даже пытаетесь обернуть или удалить исходный запрос, если все, что вам нужно, это добавить заголовок? Просто используйте addHeader () для входящего запроса.
  3. Попытка изменить метод запроса и запросить URI в фильтре, как вы это делаете, может иметь неожиданные последствия и почти наверняка не даст того, чего вы, вероятно, ожидаете. К тому времени, когда запрос попадает в ваш фильтр, цепочка фильтров уже сформирована на основе исходного состояния запроса. Изменение его теперь не повлияет на то, куда оно приведет.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...