前后端分离的项目集成CAS
这里说的前后端分离,是指部署也分离的项目
前后端分离项目如何集成CAS
关键就是这两点:
2.前端发起的后续请求必须和第一个请求(即前面的那个跳转后端的那个请求)是属于同一个session
假设:
具体步骤:
1. 修改web.xml增加对cas.jsp的拦截
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/cas.jsp</url-pattern>
</filter-mapping>
2. 未登录时,前端重定向后端cas.jsp
// 没有登录,跳转后端cas.jsp
if(notLogin){
window.location.href='192.168.0.100:8080/api-server/cas.jsp';
}
cas.jsp被CAS Filter拦截,那么会再自动重定向到cas登录界面:192.168.0.90:8080/cas/login?service=192.168.0.100:8080/api-server/cas.jsp
如果一切顺利的话,这个时候登录成功,那么就会进入cas.jsp界面.这个进入cas.jsp的请求的session,是通过了cas认证的
3. cas.jsp重定向到前端 修改cas.jsp
// 重定向到前端地址.
String url = "192.168.0.120";
response.sendRedirect(url);
4. 保证将JSESSIONID写入前端cookie中
在创建一个新的session后,Tomcat的Session Manager在response中会加上Set-Cookie:JSESSIONID=123123这个头,来让浏览器写入名为JSESSIONID的cookie.但是这个是写在后端的域下面而不是前端的.而一般情况下,cookie是没法跨域读写的.
后果就是,登录成功了也跳转回了前端界面,但是后续的请求因为请求中没有JSESSIONID这个cookie(实际上也不是必须放在cookie里),导致后续的每个请求,对于Tomcat来说,都是一个新的请求,进而创建新的session–和第一个通过了认证的请求半毛钱关系都没,那CAS Filter自然也就不会放行.所以后续的请求依旧是调用不成功.
那么这一步要解决的问题就是如何将JSESSIONID写入前端的域下的问题.
那大体上的方案,也就如下三种:
就以第三种–让前端手动写入JSESSIONID为例:
修改cas.jsp
// 重定向到前端地址.
String url = "192.168.0.120";
response.sendRedirect(url);
前端js
// getJsessionIdFromUrl() 从地址栏里获取jseesionid参数的值,具体逻辑自行实现
var jsessionid = getJsessionIdFromUrl();
// setCookie() 写入cookie,具体逻辑自行实现
setCookie('jsessionid',jsessionid);
前端后续再发送的请求,带上JSESSIONID这个cookie,就没事了.
忽略不拦截的url:https://blog.csdn.net/wangshuminjava/article/details/82346097