成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

前后端分離下的跨域CAS請求

CoffeX / 1582人閱讀

摘要:最重要的兩點請求跨域的時候,默認不會攜帶。通常是這樣的前端發(fā)起,后端接受請求并執(zhí)行,前端接受相應并發(fā)起,請求重定向后的頁面,其中不存在跨域問題。

最重要的兩點:

ajax請求跨域的時候,默認不會攜帶cookie。

請求分為普通請求(HttpRequest)和Ajax請求(XMLHttpRequest)

先屢一下跨域CAS認證的流程:

前端發(fā)起ajax請求,請求首先被跨域Filter過濾,加上Access-Control-Allow-Origin , 然后再被CASFilter過濾,此時沒有登錄的用戶會被重定向到cas.host.cn/login進行登錄,最最最關鍵的地方就在這里。

通常是這樣的:前端發(fā)起HttpRequest,后端接受請求并執(zhí)行res.sendRedirect(),前端接受相應并發(fā)起HttpRequest,請求重定向后的頁面,其中HttpRequest不存在跨域問題。
但是現(xiàn)在是這樣的:前端發(fā)起XMLHttpRequest, 后端接受請求并執(zhí)行res.sendRedirect(),前端接受相應并發(fā)起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");
    }
}

用戶每次發(fā)起ajax請求之前,先請求validate接口,檢驗當前用戶的cookie是否失效,如果沒有,就返回{success: true},前端則繼續(xù)發(fā)送接下來的ajax請求。

如果失效了,就返回一個字符串,內容是將要跳轉的cas驗證地址,前端則手動通過location.href = "這個地址"來進行HttpRequest。cas登錄成功后,會再次重定向,重定向的地址是service=后面的地址。

另外,需要注意的一點是跨域Filter優(yōu)先級必須要高于CASFIlter,否則請求會先被CASFilter過濾,沒有登錄過得用戶會被302跳轉到cas.mioffice.cn/login, 但是事實是你連跳轉的機會都沒有就會被瀏覽器告知你跨域了。
因為你的請求還沒有被跨域Filter過濾,此時響應頭里還沒有Access-Control-Allow-Origin。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/51930.html

相關文章

  • 前后分離下的跨域CAS請求

    摘要:最重要的兩點請求跨域的時候,默認不會攜帶。通常是這樣的前端發(fā)起,后端接受請求并執(zhí)行,前端接受相應并發(fā)起,請求重定向后的頁面,其中不存在跨域問題。 最重要的兩點: ajax請求跨域的時候,默認不會攜帶cookie。 請求分為普通請求(HttpRequest)和Ajax請求(XMLHttpRequest) 先屢一下跨域CAS認證的流程: 前端發(fā)起ajax請求,請求首先被跨域Filter...

    Tony_Zby 評論0 收藏0
  • 前后分離下的CAS跨域流程分析

    摘要:這種情況通常發(fā)生在反向代理的時候,前端發(fā)起請求代理服務器,代理服務器發(fā)起請求到,這時候就容易導致域名不一致,請一定要注意這點。 寫在最前 前后端分離其實有兩類: 開發(fā)階段使用dev-server,生產階段是打包成靜態(tài)文件整個放入后端項目中。 開發(fā)階段使用dev-server,生產階段是打包成靜態(tài)文件放入單獨的靜態(tài)資源服務器中,如nginx。 這兩種方案最大的區(qū)別就是生產階段。由于第...

    ckllj 評論0 收藏0
  • 前后分離下的CAS跨域流程分析

    摘要:這種情況通常發(fā)生在反向代理的時候,前端發(fā)起請求代理服務器,代理服務器發(fā)起請求到,這時候就容易導致域名不一致,請一定要注意這點。 寫在最前 前后端分離其實有兩類: 開發(fā)階段使用dev-server,生產階段是打包成靜態(tài)文件整個放入后端項目中。 開發(fā)階段使用dev-server,生產階段是打包成靜態(tài)文件放入單獨的靜態(tài)資源服務器中,如nginx。 這兩種方案最大的區(qū)別就是生產階段。由于第...

    DevTalking 評論0 收藏0
  • 前后分離下的CAS跨域流程分析

    摘要:這種情況通常發(fā)生在反向代理的時候,前端發(fā)起請求代理服務器,代理服務器發(fā)起請求到,這時候就容易導致域名不一致,請一定要注意這點。 寫在最前 前后端分離其實有兩類: 開發(fā)階段使用dev-server,生產階段是打包成靜態(tài)文件整個放入后端項目中。 開發(fā)階段使用dev-server,生產階段是打包成靜態(tài)文件放入單獨的靜態(tài)資源服務器中,如nginx。 這兩種方案最大的區(qū)別就是生產階段。由于第...

    jay_tian 評論0 收藏0
  • 徹底弄懂跨域問題

    摘要:用于告知瀏覽器可以將預先檢查請求返回結果緩存的時間,在緩存有效期內,瀏覽器會使用緩存的預先檢查結果判斷是否發(fā)送跨域請求。 跨域,老生常談的問題 簡述 作為一只前端菜鳥,跨域方面只懂得JSONP和CORS,并未曾深入了解。但隨著春招越來越近,就算是菜鳥也要猛振翅膀。近幾日仔細研究了跨域問題,寫下這篇文章,希望對開發(fā)者們有所幫助。在讀本文前,希望您對以下知識略有了解。 瀏覽器同源策略 n...

    rose 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<