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>
Другие вопросы по тегам