Как обработать истекший сеанс с использованием Spring-Security и JQuery? - PullRequest
1 голос
/ 30 августа 2011

Я использую Spring-Security и JQuery в моем приложении. Главная страница использует загрузку содержимого динамически во вкладки через Ajax. И все в порядке, однако иногда у меня есть страница входа в систему на моей вкладке, и если я введу учетные данные, я буду перенаправлен на страницу содержимого без вкладок.

Так что я бы хотел справиться с этой ситуацией. Я хотел бы просто написать глобальный обработчик для всех ответов ajax, который будет выполнять window.location.reload (), если нам потребуется аутентификация.

1 Ответ

1 голос
/ 30 августа 2011

Я столкнулся с той же проблемой. Пожалуйста, посмотрите решение, которое я принял, и проверьте, полезно ли оно для вас.

Моя страница журнала использовала старую модель контроллера вместо модели аннотации 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 имеет очень хорошую поддержку библиотеки Джексона , вы можете попробовать ее использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...