最主要的两点:
- ajax要求跨域的时刻,默许不会照顾cookie。
- 要求分为一般要求(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。