0

Я пытался проверить свое первое веб-приложение. Использование Tomcat 7.Переадресация на другой webapp с аутентификацией

Я хочу переслать с хоста: port/app1/x/y с некоторыми сообщениями и заголовками аутентификации на хост: port/app2/x/y с теми же данными сообщения и заголовками. Оба приложения находятся на одном хосте.

/app2 имеет базовую аутентификацию. На стороне клиента код идет

method.addRequestHeader("Authorization", 
    "Basic " + new String(Base64.encodeBase64(userNPasswd.getBytes()))); 

Я могу переслать из/App1 в/app2, выполнив следующие действия

1) Реализация фильтра и делать это в doFilter в/app1

ServletContext othercontext = filterConfig.getServletContext().getContext("/app2"); 
RequestDispatcher dispatcher = othercontext.getRequestDispatcher(req.getRequestURI().replace("/app1", "")); 
dispatcher.forward(request, response); 

2) В App1 .. под WEB-INF/web.xml вперед все (/ *) URL отображения

<filter> 
    <filter-name>ForwardFilter</filter-name> 
    <filter-class><my.package.filter.ForwardFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>ForwardFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

3) Во в котом конфе/server.xml .. Определение контекста как для/App1 и/app2 при том же хосте и выключая распакуйте войны и т.д., и имеющее crossContext = истинный

<Context path="/app1" docBase="app1" crossContext="true" /> 
<Context path="/app2" docBase="app2" crossContext="false" /> 

app1.war действительно просто с только один класс фильтра и web.xml, который отображается на перенаправлять запросы

app2.war родник включен веб-приложение

Когда я непосредственно сделать запрос/app2 с неправильным паролем, я получаю ошибку

Когда я переправляю путь вперед (от/app1 до/app2), он пропускает аутентификацию и обработку начала запроса в/app2. Она терпит неудачу с NPE, когда в каком-то месте в/app2 .. он пытается читать имя пользователя из контекста безопасности (весна, как ожидается, удар и установить это)

SecurityContextHolder.getContext().getAuthentication().getName(); 

Я не могу изменить код под/app2

Я хотел бы/APP1 быть очень простым запросом вперед ..
я не могу использовать перенаправление или использовать правило апача переписывает перед котом

Пожалуйста, дайте мне знать, если какая-либо дополнительная информация должен быть разделена

Переадресация также пересылает все заголовки проверки подлинности, так что, как будто запрос hit/app2 напрямую?

ответ

1

Фильтры по умолчанию не применяются для форвардов. Нужно указать явно, чтобы применять для форвардов также

Так что в WEB-INF/web.xml получающего приложения (здесь app2) для каждого фильтра, который должен быть применен к прямому запросу, а также добавьте следующий

<filter-mapping> 
... 
<dispatcher>FORWARD</dispatcher> 
<dispatcher>REQUEST</dispatcher> 
... 
<filter-mapping> 

После этого все необходимые фильтры/app2 приступили к выполнению, а

+0

Спасибо, это спасло меня! –

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

  • Нет связанных вопросов^_^