前端通过ajax请求一个cotroller,后端redirect301解决方案

之前在反馈里提问这个问题,问题传送门

得到朋友们的大力相助,结合朋友们的建议,现实现如下:

后端验证是否登录或则是否登录过期的拦截器:

public class AccessAdminInterceptor implements Interceptor {
    public void intercept(Invocation inv) {
        Controller c = inv.getController();
        HttpServletResponse response = c.getResponse();
        Object obj = c.getSessionAttr("user");
        if(obj==null){
            //如果是ajax请求
            if("XMLHttpRequest".equals(c.getRequest().getHeader("X-Requested-With"))){
                //System.out.println("=============登录过期,设置Ajax重定向到登录界面===========");
                //if (c.getRender() instanceof com.jfinal.render.JsonRender) {
                //    c.renderJson(RetJson.by(-999, "尚未登录或则登录超时!"));
                //}
                //设置跳转地址
                response.setHeader("redirectUrl", "/");
                //设置跳转使能
                response.setHeader("enableRedirect","true");
                c.renderNull(); //这一句很重要,否则,后台会抛异常。说找不到指定的html。
            }else {
                //c.redirect("/");
                c.redirect301("/");
                //c.forwardAction("/");
            }
        }else{
            inv.invoke();
        }
    }
}

前端redirect.js文件内容:

function  redirectHandle(xhr) {
    var url = xhr.getResponseHeader("redirectUrl");
    var enable = xhr.getResponseHeader("enableRedirect");
    if((enable == "true") && (url != "")){
        var win = window;
        while(win != win.top){
            win = win.top;
        }
        win.location.href = url;
    }
}
$(function () {
    $(document).ajaxComplete(function (event, xhr, settings) {
        redirectHandle(xhr);
    })
})

然后在页面引入这个redirect.js文件。

就可以实现无侵入式实现ajax的redirect。

评论区

杜福忠

2022-03-03 14:37

Header好,都没想到用这个,收藏收藏

yuwen01

2022-03-04 15:00

我是判断浏览器cookie和缓存里面对应user对象,作为登录控制(只要其中一个为空就跳转到登录界面)。通过全局拦截器实现

zzutligang

2022-03-05 01:17

@yuwen01 第一:cookie里不能放user对象,不安全。第二:cookie里有,但不一定有台就没过期(各种可能性导致服务器找不到登录信息了)。

yuwen01

2022-03-07 14:56

@zzutligang 说错了cookie放UUID,那你可以用redis去做登录限制

云破月

2022-03-24 12:22

我们是加状态码,如status=401,然后header里面返回location,大同小异

zzutligang

2022-03-30 23:21

@云破月 是一个意思,只不过前端要做好拦截就行了。我的项目是基于jquery的。另外使用easyui,这个控件库封装了很多东西,侵入这个库又带来维护的麻烦。所以就做了一个redirect.js,用来设置全局jquery的ajaxComplete实现无侵入拦截。

hhchor

2022-04-16 13:27

这种方法好啊,我现在通过code来判断,所有结果都会带上code

热门分享

扫码入社