资讯专栏INFORMATION COLUMN

前后端分离下的跨域CAS请求

CoffeX / 1434人阅读

摘要:最重要的两点请求跨域的时候,默认不会携带。通常是这样的前端发起,后端接受请求并执行,前端接受相应并发起,请求重定向后的页面,其中不存在跨域问题。

最重要的两点:

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。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/51930.html

相关文章

  • 前后分离下的跨域CAS请求

    摘要:最重要的两点请求跨域的时候,默认不会携带。通常是这样的前端发起,后端接受请求并执行,前端接受相应并发起,请求重定向后的页面,其中不存在跨域问题。 最重要的两点: ajax请求跨域的时候,默认不会携带cookie。 请求分为普通请求(HttpRequest)和Ajax请求(XMLHttpRequest) 先屡一下跨域CAS认证的流程: 前端发起ajax请求,请求首先被跨域Filter...

    Tony_Zby 评论0 收藏0
  • 前后分离下的CAS跨域流程分析

    摘要:这种情况通常发生在反向代理的时候,前端发起请求代理服务器,代理服务器发起请求到,这时候就容易导致域名不一致,请一定要注意这点。 写在最前 前后端分离其实有两类: 开发阶段使用dev-server,生产阶段是打包成静态文件整个放入后端项目中。 开发阶段使用dev-server,生产阶段是打包成静态文件放入单独的静态资源服务器中,如nginx。 这两种方案最大的区别就是生产阶段。由于第...

    ckllj 评论0 收藏0
  • 前后分离下的CAS跨域流程分析

    摘要:这种情况通常发生在反向代理的时候,前端发起请求代理服务器,代理服务器发起请求到,这时候就容易导致域名不一致,请一定要注意这点。 写在最前 前后端分离其实有两类: 开发阶段使用dev-server,生产阶段是打包成静态文件整个放入后端项目中。 开发阶段使用dev-server,生产阶段是打包成静态文件放入单独的静态资源服务器中,如nginx。 这两种方案最大的区别就是生产阶段。由于第...

    DevTalking 评论0 收藏0
  • 前后分离下的CAS跨域流程分析

    摘要:这种情况通常发生在反向代理的时候,前端发起请求代理服务器,代理服务器发起请求到,这时候就容易导致域名不一致,请一定要注意这点。 写在最前 前后端分离其实有两类: 开发阶段使用dev-server,生产阶段是打包成静态文件整个放入后端项目中。 开发阶段使用dev-server,生产阶段是打包成静态文件放入单独的静态资源服务器中,如nginx。 这两种方案最大的区别就是生产阶段。由于第...

    jay_tian 评论0 收藏0
  • 彻底弄懂跨域问题

    摘要:用于告知浏览器可以将预先检查请求返回结果缓存的时间,在缓存有效期内,浏览器会使用缓存的预先检查结果判断是否发送跨域请求。 跨域,老生常谈的问题 简述 作为一只前端菜鸟,跨域方面只懂得JSONP和CORS,并未曾深入了解。但随着春招越来越近,就算是菜鸟也要猛振翅膀。近几日仔细研究了跨域问题,写下这篇文章,希望对开发者们有所帮助。在读本文前,希望您对以下知识略有了解。 浏览器同源策略 n...

    rose 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<