如何使用spring-security和jQuery处理过期的会话?

时间:2011-08-30 12:09:00

标签: jquery ajax security spring session

我在我的应用程序中使用spring-security和jQuery。主页使用Ajax动态加载内容到选项卡。一切都很好,但有时我的选项卡中有登录页面,如果我输入凭据,我将被重定向到没有标签的内容页面。

所以我想处理这种情况。我想为所有ajax响应编写一个全局处理程序,如果我们需要进行身份验证,它将执行window.location.reload()。

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。请参阅我采用的解决方案,并检查它是否对您有用。

我的日志页面使用旧的模型控制器而不是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
        }
    });

然后在我的登录控制器中,我使用x-requested-with标头检查原始请求是否是ajax请求。如果是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对jackson库有很好的支持,你可以尝试使用它。