Spring препятствует тому, чтобы вызов ajax был целевым URL при аутентификации
У меня есть рабочее Spring/Java веб-приложение. На некоторых страницах, когда я выхожу из системы, последний запрос - AJAX-вызов. Поэтому, когда я снова вхожу в систему, Spring перенаправляет меня на вызов ajax, давая мне браузер, полный json. Мой обработчик успеха входа в систему расширяет SavedRequestAwareAuthenticationSuccessHandler
,
Как я могу контролировать, какие URL будут перенаправлены при успешном входе в систему?
2 ответа
Мое решение вдохновлено ответом Роба Уинча. Хотя в моем сценарии Spring сохранял запросы, которые X-Requested-With: XMLHttpRequest
задавать. Это были просьбы, которые я должен был игнорировать.
Я создал класс, чтобы быть моим обычаем RequestCache
учебный класс.
@Service("customRequestCache")
public class CustomRequestCache extends HttpSessionRequestCache { //this class (bean) is used by spring security
@Override
public void saveRequest(HttpServletRequest request, HttpServletResponse response) {
if (!"XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With"))) {
//request is not ajax, we can store it
super.saveRequest(request, response);
} else {
//do nothing, add some logs if you want
}
}
}
Затем в моей весенней конфигурации безопасности:
<http>
<request-cache ref="customRequestCache" />
</http>
При использовании этого пользовательского класса кэша запросов, ajax-запросы больше не сохраняются.
Лучший подход - это предотвратить кеширование запроса. Если вы используете Java-конфигурацию Spring Security, она автоматически игнорирует любой запрос с установленным "X-Requested-With: XMLHttpRequest".
Вы также можете указать свой собственный HttpSessionRequestCache
с RequestMatcher
на нем, который указывает, когда запрос должен быть сохранен. Например, вы можете использовать следующую конфигурацию XML, чтобы игнорировать любые запросы JSON:
<b:bean id="requestCache"
class="org.springframework.security.web.savedrequest.HttpSessionRequestCache">
<b:property name="requestMatcher">
<b:bean class="org.springframework.security.web.util.matcher.NegatedRequestMatcher">
<b:constructor-arg>
<b:bean class="org.springframework.security.web.util.matcher.MediaTypeRequestMatcher">
<b:constructor-arg>
<b:bean class="org.springframework.web.accept.HeaderContentNegotiationStrategy"/>
</b:constructor-arg>
<b:constructor-arg value="#{T(org.springframework.http.MediaType).APPLICATION_JSON}"/>
</b:bean>
</b:constructor-arg>
<b:property name="useEquals" value="true"/>
</b:bean>
</b:property>
</b:bean>
<http ...>
<!-- ... -->
<request-cache ref="requestCache"/>
</http>