vlambda博客
学习文章列表

前后端分离的项目集成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.jspif(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