前几天我把 CAS 稍微研究了一下,感觉这个东西还有有点意思的,所以打算把它集成到 Smart 框架中来,但又不想与 Smart 耦合地太紧,于是我单独做了一个项目,叫做 Smart SSO。
Smart SSO 实际上与 Smart Framework 没有任何的耦合,但可以集成到 Smart 应用中,当然也可以集成到没有使用 Smart 框架的应用中,是不是有点意思?
下面我就与大家分享一下我的解决方案吧!
如果您还不了解 SSO 或 CAS,建议先阅读我写的这两篇博文:
第一步:搭建一个 Smart SSO 的 Maven 项目
在 pom.xml 中编写以下配置:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.smart
smart-parent
1.0
../smart-parent/pom.xml
smart-sso
1.0
junit
junit
org.slf4j
slf4j-log4j12
javax.servlet
javax.servlet-api
org.jasig.cas.client
cas-client-core
可见,这个项目没有对 Smart Framework 及其 Plugin 有任何依赖,但它必须依赖 CAS Client 与 Servlet API。
第二步:定义一个 Web 应用初始化接口
import javax.servlet.ServletContext;
public interface WebApplicationInitializer {
void init(ServletContext servletContext);
}
很显然,这里的 init 方法是用来初始化的,我想让 Web 应用被 Web 容器加载的时候就能初始化,如何实现呢?
方案有两种:
方案一:写一个类,让它实现 javax.servlet.ServletContextListener 接口(它是一个 Listener,就像 Smart Framework 中的 ContainerListener 那样)。
方案二:写一个类,让它实现 javax.servlet.ServletContainerInitializer 接口(它是 Servlet 3.0 提供的特性)。
选择哪种方式其实都可以,关键取决于实际情况。
我们打算这样用 Smart SSO,将它打成 jar 包(smart-sso.jar),然后扔到 lib 目录下,让应用跑起来的时候自动加载,对于这种情况,我们优先使用优先使用“方案二”,原因很简单,因为我们不需要定义那么多的 ServletContextListener。
看到这里,你一定会问:为什么要搞一个初始化接口出来?这究竟是要初始化什么?
因为 CAS Client 官方文档告诉我们,想要在自己的应用中加载 CAS Client,必须在 web.xml 中做如下配置:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
org.jasig.cas.client.session.SingleSignOutHttpSessionListener
SingleSig