前后端星散下的跨域CAS要求

最主要的两点:

  1. ajax要求跨域的时刻,默许不会照顾cookie。
  2. 要求分为一般要求(HttpRequest)和Ajax要求(XMLHttpRequest)

先屡一下跨域CAS认证的流程:

前端提议ajax要求,要求起首被跨域Filter过滤,加上Access-Control-Allow-Origin , 然后再被CASFilter过滤,此时没有登录的用户会被重定向到cas.host.cn/login举行登录,最最最症结的处所就在这里。

通常是如许的:前端提议HttpRequest,后端接收要求并实行res.sendRedirect(),前端接收相应并提议HttpRequest,要求重定向后的页面,个中HttpRequest不存在跨域题目。
然则现在是如许的:前端提议XMLHttpRequest, 后端接收要求并实行res.sendRedirect(),前端接收相应并提议XMLHttpRequest,要求重定向后的页面,然则,由于cas.host.cn/login没有设置跨域(平安上也不允许),所以产生了跨域!

处理思绪:

思绪就是把XMLHttpRequest替换为HttpRequest

计划:

@Path("admin/auth")
public class AuthController {
 
    private static Properties prop = new Properties();
    static {
        InputStream in = CORSFilter.class.getClassLoader().getResourceAsStream("dev.properties");
        try {
            prop.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    @Get("validate")
    public String validate(Invocation inv) throws JSONException {
        HttpServletRequest request =  inv.getRequest();
        Assertion assertion = (Assertion) request.getSession().getAttribute("_const_cas_assertion_");
        JSONObject result = new JSONObject();
        if (assertion == null || assertion.getPrincipal().getName() == null) {
            result.put("success",false);
            result.put("data", prop.getProperty("cas.server.url") + "/login?service=" + prop.getProperty("server.url") + "/thoth-admin/admin/auth/redirect");
        } else {
            result.put("success", true);
        }
        return "@json:" + result.toString();
    }
 
    @Get("redirect")
    public void redirect(Invocation inv) throws IOException {
        inv.getResponse().sendRedirect(prop.getProperty("server.url")+"/thoth-admin/admin");
    }
}

用户每次提议ajax要求之前,先要求validate接口,磨练当前用户的cookie是不是失效,假如没有,就返回{success: true},前端则继承发送接下来的ajax要求。

假如失效了,就返回一个字符串,内容是将要跳转的cas考证地点,前端则手动经由过程location.href = “这个地点”来举行HttpRequest。cas登录胜利后,会再次重定向,重定向的地点是service=背面的地点。

别的,须要注重的一点是跨域Filter优先级必需要高于CASFIlter,不然要求会先被CASFilter过滤,没有登录过得用户会被302跳转到cas.mioffice.cn/login, 然则事实是你连跳转的时机都没有就会被浏览器示知你跨域了。
由于你的要求还没有被跨域Filter过滤,此时相应头里还没有Access-Control-Allow-Origin。

    原文作者:fxxjdedd
    原文地址: https://segmentfault.com/a/1190000013574235
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞