摘要:最重要的兩點請求跨域的時候,默認不會攜帶。通常是這樣的前端發起,后端接受請求并執行,前端接受相應并發起,請求重定向后的頁面,其中不存在跨域問題。
最重要的兩點:
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。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/51930.html
摘要:最重要的兩點請求跨域的時候,默認不會攜帶。通常是這樣的前端發起,后端接受請求并執行,前端接受相應并發起,請求重定向后的頁面,其中不存在跨域問題。 最重要的兩點: ajax請求跨域的時候,默認不會攜帶cookie。 請求分為普通請求(HttpRequest)和Ajax請求(XMLHttpRequest) 先屢一下跨域CAS認證的流程: 前端發起ajax請求,請求首先被跨域Filter...
摘要:這種情況通常發生在反向代理的時候,前端發起請求代理服務器,代理服務器發起請求到,這時候就容易導致域名不一致,請一定要注意這點。 寫在最前 前后端分離其實有兩類: 開發階段使用dev-server,生產階段是打包成靜態文件整個放入后端項目中。 開發階段使用dev-server,生產階段是打包成靜態文件放入單獨的靜態資源服務器中,如nginx。 這兩種方案最大的區別就是生產階段。由于第...
摘要:這種情況通常發生在反向代理的時候,前端發起請求代理服務器,代理服務器發起請求到,這時候就容易導致域名不一致,請一定要注意這點。 寫在最前 前后端分離其實有兩類: 開發階段使用dev-server,生產階段是打包成靜態文件整個放入后端項目中。 開發階段使用dev-server,生產階段是打包成靜態文件放入單獨的靜態資源服務器中,如nginx。 這兩種方案最大的區別就是生產階段。由于第...
摘要:這種情況通常發生在反向代理的時候,前端發起請求代理服務器,代理服務器發起請求到,這時候就容易導致域名不一致,請一定要注意這點。 寫在最前 前后端分離其實有兩類: 開發階段使用dev-server,生產階段是打包成靜態文件整個放入后端項目中。 開發階段使用dev-server,生產階段是打包成靜態文件放入單獨的靜態資源服務器中,如nginx。 這兩種方案最大的區別就是生產階段。由于第...
閱讀 1884·2021-11-17 09:33
閱讀 6470·2021-10-12 10:20
閱讀 2299·2021-09-22 15:50
閱讀 1783·2021-09-22 15:10
閱讀 615·2021-09-10 10:51
閱讀 618·2021-09-10 10:50
閱讀 3020·2021-08-11 11:19
閱讀 1776·2019-08-30 15:55