У меня есть рабочий solulion, используя ответы от @John и @Arpad link и @RobWinch link
Я использую Spring Security 3.2.9 и jQuery 1.10.2.
Расширить класс Spring, чтобы вызвать ответ 4XX только из запросов AJAX:
public class CustomLoginUrlAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {
public CustomLoginUrlAuthenticationEntryPoint(final String loginFormUrl) {
super(loginFormUrl);
}
// For AJAX requests for user that isn't logged in, need to return 403 status.
// For normal requests, Spring does a (302) redirect to login.jsp which the browser handles normally.
@Override
public void commence(final HttpServletRequest request,
final HttpServletResponse response,
final AuthenticationException authException)
throws IOException, ServletException {
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
} else {
super.commence(request, response, authException);
}
}
}
applicationContext-security.xml
...
...
В моих JSP добавьте глобальный обработчик ошибок AJAX, как показано здесь здесь
$( document ).ajaxError(function( event, jqxhr, settings, thrownError ) {
if ( jqxhr.status === 403 ) {
window.location = "login.jsp";
} else {
if(thrownError != null) {
alert(thrownError);
} else {
alert("error");
}
}
});
. Также удалите существующие обработчики ошибок из вызовов AJAX в JSP-страницах:
var str = $("#viewForm").serialize();
$.ajax({
url: "get_mongoDB_doc_versions.do",
type: "post",
data: str,
cache: false,
async: false,
dataType: "json",
success: function(data) { ... },
// error: function (jqXHR, textStatus, errorStr) {
// if(textStatus != null)
// alert(textStatus);
// else if(errorStr != null)
// alert(errorStr);
// else
// alert("error");
// }
});
Надеюсь, что это поможет другим.
Update1 Я обнаружил, что мне нужно добавить параметр (always-use-default-target = "true") в конфигурацию формы входа. Это было необходимо, так как после запроса AJAX перенаправляется на страницу входа (из-за истекшего сеанса), Spring запоминает предыдущий запрос AJAX и автоматически перенаправляет его после входа в систему. Это приведет к отображению возвращаемого JSON на странице браузера. Конечно, не то, что я хочу.
Update2 Вместо использования always-use-default-target="true"
используйте пример @RobWinch блокировки запросов AJAX из requstCache. Это позволяет нормальным ссылкам перенаправляться на исходную цель после входа в систему, но AJAX переходит на домашнюю страницу после входа в систему.
Мой коллега имел подобные проблемы и нашел это:
IE 8 имеет функцию, названную Слабо связанным Internet Explorer (LCIE), который приводит к IE, натыкающемуся на несколько процессов.
http://www.microsoft.com/windows/internet-explorer/beta/readiness/developers-existing.aspx#lcie
Более старые версии Отладчика Visual Studio запутываются этим и не могут выяснить, как присоединить к корректному процессу. Можно работать вокруг этого путем отключения опции роста процесса LCIE. Вот то, как:
- Открывают RegEdit
- Browse to HKEY_LOCALMACHINE-> SOFTWARE-> Microsoft-> Internet Explorer-> Main
- Add dword под этим ключом, названным Набором TabProcGrowth
- TabProcGrowth к 0
, Так как Вы работаете на Windows Server 2003, это - все, что необходимо должны быть сделать. При столкновении с той же проблемой на Vista или более новый необходимо будет также выключить защищенный режим.
Кредит: Brad Sullivan, Диспетчер Программ, Отладчик Visual Studio, источник MSFT
: http://social.microsoft.com/Forums/en-US/vsdebug/thread/e2c795cd-b7a0-4fad-b7c9-b1ca40d7302e
Если вы столкнетесь с этим в IE8 и Visual Studio 2008, измените файл hosts и укажите localhost на 127.0.0.1 :
127.0.0.1 localhost
У меня недавно была подобная проблема после установки обновления Windows Vista. В основном обновление изменило файл hosts, который вызвал ту же проблему, которую Вы описываете.
, По-видимому, запись в файле hosts должна быть снабжена префиксом тремя двоеточиями, т.е.:
::: 1 localhost
По некоторым причинам обновление Vista изменило это на два двоеточия. Я не уверен, есть ли у Вас та же проблема, но она кажется, что это стоит проверить.