Я - новичок к ajax здесь, и я знаю, что кто-то уже встретился бы с этой проблемой. Мне основывались на приложении прежней версии Spring MVC, он имеет перехватчик (фильтр), который перенаправляет пользователя к странице входа в систему каждый раз, когда нет никакой сессии.
public class SessionCheckerInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
// check if userInfo exist in session
User user = (User) session.getAttribute("user");
if (user == null) {
response.sendRedirect("login.htm");
return false;
}
return true;
}
}
Для запроса non-xmlhttp это хорошо работает.. но когда я пытаюсь использовать ajax в своем приложении, все становится странным, это не может перенаправить к странице входа в систему правильно. Как проверяют значение
xhr.status = 200 textStatus = parseError errorThrown = "Недопустимый JSON - Разметка моей Страницы входа в систему HTML -
$(document).ready(function(){
jQuery.ajax({
type: "GET",
url: "populateData.htm",
dataType:"json",
data:"userId=SampleUser",
success:function(response){
//code here
},
error: function(xhr, textStatus, errorThrown) {
alert('Error! Status = ' + xhr.status);
}
});
});
Я проверил своего поджигателя, что существует 302 ответа HTTP, но я не уверен, как поймать ответ и перенаправить пользователя к странице входа в систему. Какая-либо идея здесь?Спасибо.
JQuery ищет результат типа json, но поскольку перенаправление обрабатывается автоматически, он получит сгенерированный html-источник вашей страницы login.htm
.
Одна из идей - дать браузеру знать, что он должен перенаправить, добавив переменную redirect
к результирующему объекту и проверив ее в JQuery:
$(document).ready(function(){
jQuery.ajax({
type: "GET",
url: "populateData.htm",
dataType:"json",
data:"userId=SampleUser",
success:function(response){
if (response.redirect) {
window.location.href = response.redirect;
}
else {
// Process the expected results...
}
},
error: function(xhr, textStatus, errorThrown) {
alert('Error! Status = ' + xhr.status);
}
});
});
Вы также можете добавить переменную Header к вашему ответу и позволить браузеру решать, куда перенаправлять. В Java, вместо перенаправления, сделайте response.setHeader("REQUIRES_AUTH", "1")
, а в JQuery сделайте при успехе(!):
//....
success:function(response){
if (response.getResponseHeader('REQUIRES_AUTH') === '1'){
window.location.href = 'login.htm';
}
else {
// Process the expected results...
}
}
//....
Надеюсь, это поможет.
Мой ответ в значительной степени вдохновлен этой темой, которая не должна оставить никаких вопросов, если у вас все еще есть какие-то проблемы.