#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:
- Не используйте MockHttpServletRequest подобным образом. Это для тестирования, а не для производственного кода. Подходящий способ обернуть запрос и / или ответ в фильтр, чтобы изменить его поведение позже, — это HttpServletRequestWrapper и HttpServletResponseWrapper .
- Почему вы даже пытаетесь обернуть или удалить исходный запрос, если все, что вы хотите, это добавить заголовок? Просто используйте AddHeader() для входящего запроса.
- Попытка изменить метод запроса и запросить URI в фильтре, как вы делаете, может иметь неожиданные последствия и почти наверняка не будет делать то, что вы, вероятно, ожидаете. К тому времени, когда запрос попадает в ваш фильтр, цепочка фильтров уже построена на основе исходного состояния запроса. Изменение его сейчас не повлияет на то, куда он в конечном итоге пойдет.
Комментарии:
1. спасибо за ответ, Райан .. этот код не является частью продукта.. у нас нет SiteMinder в среде разработки.. Я просто хотел добавить этот основной заголовок имени пользователя, требуемый spring-sec, и протестировать приложение .. до сих пор я не знал о классах-оболочках..
2. но я больше не использую это.. начал использовать расширение Modify Headers для FF, и теперь жизнь очень проста 🙂 .. большое вам спасибо за ответ еще раз….