摘要:最重要的兩點(diǎn)請(qǐng)求跨域的時(shí)候,默認(rèn)不會(huì)攜帶。通常是這樣的前端發(fā)起,后端接受請(qǐng)求并執(zhí)行,前端接受相應(yīng)并發(fā)起,請(qǐng)求重定向后的頁面,其中不存在跨域問題。
最重要的兩點(diǎn):
ajax請(qǐng)求跨域的時(shí)候,默認(rèn)不會(huì)攜帶cookie。
請(qǐng)求分為普通請(qǐng)求(HttpRequest)和Ajax請(qǐng)求(XMLHttpRequest)
先屢一下跨域CAS認(rèn)證的流程:前端發(fā)起ajax請(qǐng)求,請(qǐng)求首先被跨域Filter過濾,加上Access-Control-Allow-Origin , 然后再被CASFilter過濾,此時(shí)沒有登錄的用戶會(huì)被重定向到cas.host.cn/login進(jìn)行登錄,最最最關(guān)鍵的地方就在這里。
通常是這樣的:前端發(fā)起HttpRequest,后端接受請(qǐng)求并執(zhí)行res.sendRedirect(),前端接受相應(yīng)并發(fā)起HttpRequest,請(qǐng)求重定向后的頁面,其中HttpRequest不存在跨域問題。
但是現(xiàn)在是這樣的:前端發(fā)起XMLHttpRequest, 后端接受請(qǐng)求并執(zhí)行res.sendRedirect(),前端接受相應(yīng)并發(fā)起XMLHttpRequest,請(qǐng)求重定向后的頁面,但是,由于cas.host.cn/login沒有配置跨域(安全上也不允許),所以產(chǎn)生了跨域!
思路就是把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"); } }
用戶每次發(fā)起ajax請(qǐng)求之前,先請(qǐng)求validate接口,檢驗(yàn)當(dāng)前用戶的cookie是否失效,如果沒有,就返回{success: true},前端則繼續(xù)發(fā)送接下來的ajax請(qǐng)求。
如果失效了,就返回一個(gè)字符串,內(nèi)容是將要跳轉(zhuǎn)的cas驗(yàn)證地址,前端則手動(dòng)通過location.href = "這個(gè)地址"來進(jìn)行HttpRequest。cas登錄成功后,會(huì)再次重定向,重定向的地址是service=后面的地址。
另外,需要注意的一點(diǎn)是跨域Filter優(yōu)先級(jí)必須要高于CASFIlter,否則請(qǐng)求會(huì)先被CASFilter過濾,沒有登錄過得用戶會(huì)被302跳轉(zhuǎn)到cas.mioffice.cn/login, 但是事實(shí)是你連跳轉(zhuǎn)的機(jī)會(huì)都沒有就會(huì)被瀏覽器告知你跨域了。
因?yàn)槟愕恼?qǐng)求還沒有被跨域Filter過濾,此時(shí)響應(yīng)頭里還沒有Access-Control-Allow-Origin。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/93221.html
摘要:最重要的兩點(diǎn)請(qǐng)求跨域的時(shí)候,默認(rèn)不會(huì)攜帶。通常是這樣的前端發(fā)起,后端接受請(qǐng)求并執(zhí)行,前端接受相應(yīng)并發(fā)起,請(qǐng)求重定向后的頁面,其中不存在跨域問題。 最重要的兩點(diǎn): ajax請(qǐng)求跨域的時(shí)候,默認(rèn)不會(huì)攜帶cookie。 請(qǐng)求分為普通請(qǐng)求(HttpRequest)和Ajax請(qǐng)求(XMLHttpRequest) 先屢一下跨域CAS認(rèn)證的流程: 前端發(fā)起ajax請(qǐng)求,請(qǐng)求首先被跨域Filter...
摘要:這種情況通常發(fā)生在反向代理的時(shí)候,前端發(fā)起請(qǐng)求代理服務(wù)器,代理服務(wù)器發(fā)起請(qǐng)求到,這時(shí)候就容易導(dǎo)致域名不一致,請(qǐng)一定要注意這點(diǎn)。 寫在最前 前后端分離其實(shí)有兩類: 開發(fā)階段使用dev-server,生產(chǎn)階段是打包成靜態(tài)文件整個(gè)放入后端項(xiàng)目中。 開發(fā)階段使用dev-server,生產(chǎn)階段是打包成靜態(tài)文件放入單獨(dú)的靜態(tài)資源服務(wù)器中,如nginx。 這兩種方案最大的區(qū)別就是生產(chǎn)階段。由于第...
摘要:這種情況通常發(fā)生在反向代理的時(shí)候,前端發(fā)起請(qǐng)求代理服務(wù)器,代理服務(wù)器發(fā)起請(qǐng)求到,這時(shí)候就容易導(dǎo)致域名不一致,請(qǐng)一定要注意這點(diǎn)。 寫在最前 前后端分離其實(shí)有兩類: 開發(fā)階段使用dev-server,生產(chǎn)階段是打包成靜態(tài)文件整個(gè)放入后端項(xiàng)目中。 開發(fā)階段使用dev-server,生產(chǎn)階段是打包成靜態(tài)文件放入單獨(dú)的靜態(tài)資源服務(wù)器中,如nginx。 這兩種方案最大的區(qū)別就是生產(chǎn)階段。由于第...
摘要:這種情況通常發(fā)生在反向代理的時(shí)候,前端發(fā)起請(qǐng)求代理服務(wù)器,代理服務(wù)器發(fā)起請(qǐng)求到,這時(shí)候就容易導(dǎo)致域名不一致,請(qǐng)一定要注意這點(diǎn)。 寫在最前 前后端分離其實(shí)有兩類: 開發(fā)階段使用dev-server,生產(chǎn)階段是打包成靜態(tài)文件整個(gè)放入后端項(xiàng)目中。 開發(fā)階段使用dev-server,生產(chǎn)階段是打包成靜態(tài)文件放入單獨(dú)的靜態(tài)資源服務(wù)器中,如nginx。 這兩種方案最大的區(qū)別就是生產(chǎn)階段。由于第...
閱讀 2474·2021-11-16 11:45
閱讀 2444·2021-10-11 10:59
閱讀 2251·2021-10-08 10:05
閱讀 3817·2021-09-23 11:30
閱讀 2370·2021-09-07 09:58
閱讀 790·2019-08-30 15:55
閱讀 773·2019-08-30 15:53
閱讀 1923·2019-08-29 17:00