Я столкнулся с той же проблемой. Пожалуйста, посмотрите решение, которое я принял, и проверьте, полезно ли оно для вас.
Моя страница журнала использовала старую модель контроллера вместо модели аннотации Spring 3.0.
Я зарегистрировал глобальный обработчик ошибок ajax следующим образом
jQuery(document).ajaxError(
function(event, request, ajaxOptions, thrownError) {
try {
var result = getJsonObject(request.responseText);//Convert the json reply to json object
if (result.timeout) {
window.location.reload();
}
} catch (e) {
// Ignore this error
}
});
Затем в контроллере входа в систему я проверяю, был ли исходный запрос ajax-запросом или не использовал заголовок x-requested-with
. Если это был запрос ajax, то я возвращаю ответ json, говорящий {"timeout" : true}
.
private boolean isAjaxRequest(HttpServletRequest request) {
boolean isAjaxRequest = false;
SavedRequest savedRequest = (SavedRequest) request.getSession()
.getAttribute(
DefaultSavedRequest.SPRING_SECURITY_SAVED_REQUEST_KEY);
if (savedRequest != null) {
List<String> ajaxHeaderValues = savedRequest
.getHeaderValues("x-requested-with");
for (String value : ajaxHeaderValues) {
if (StringUtils.equalsIgnoreCase("XMLHttpRequest", value)) {
isAjaxRequest = true;
}
}
}
return isAjaxRequest;
}
.............
.............
.............
if (isAjaxRequest(request)) {
Map<String, Object> model = new HashMap<String, Object>();
model.put("timeout", true);
return new ModelAndView(new JSONView(model));//Returns a json object.
} else {
//return login page
}
Пример реализации JSONView
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import org.springframework.web.servlet.View;
import com.greytip.common.json.CougarJsonConfig;
public class JSONView implements View {
private JSON jsonObject;
private JsonConfig jsonConfig;
private String value;
public JSONView(Object value) {
this();
jsonObject = JSONObject.fromObject(value, jsonConfig);
}
public JSONView(List<?> value) {
this();
jsonObject = JSONArray.fromObject(value, jsonConfig);
}
public JSONView(String value) {
this();
this.value = value;
}
public JSONView() {
jsonConfig = new JsonConfig();//Your json config
}
@SuppressWarnings("unchecked")
public void render(Map map, HttpServletRequest request,
HttpServletResponse response) throws Exception {
if (jsonObject != null) {
jsonObject.write(response.getWriter());
}
if (value != null) {
response.getWriter().write(value);
}
}
public String getContentType() {
return "text/json";
}
}
При этом используется библиотека json-lib для преобразования объектов в формат json.
Spring 3.0 имеет очень хорошую поддержку библиотеки Джексона , вы можете попробовать ее использовать.