MockHttpServletRequest не передает URL следующему фильтру в цепочке

#servlets #spring-mvc #spring-security #request

#сервлеты #spring-mvc #spring-безопасность #запрос

Вопрос:

Я пытаюсь реализовать фильтр, который использует 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/**'
  

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

Комментарии:

1. Мне нужно установить servletpath и pathinfo.. Если бы я только посмотрел исходные документы, прежде чем писать этот длинный вопрос .. 🙁

Ответ №1:

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

Комментарии:

1. спасибо за ответ, Райан .. этот код не является частью продукта.. у нас нет SiteMinder в среде разработки.. Я просто хотел добавить этот основной заголовок имени пользователя, требуемый spring-sec, и протестировать приложение .. до сих пор я не знал о классах-оболочках..

2. но я больше не использую это.. начал использовать расширение Modify Headers для FF, и теперь жизнь очень проста 🙂 .. большое вам спасибо за ответ еще раз….