项目中想要指定某个URL不需要通过单点登录,但是项目中所使用的CAS Client版本不支持,于是只能去扩展AuthenticationFilter
AuthenticationFilter继承抽象类AbstractCasFilter,因此我们也实现一个类继承AbstractCasFilter

1
2
3
public class MyCasFilter extends AbstractCasFilter {

}

先把AuthenticationFilter的代码全部复制到MyCasFilter之后,进行扩展。

首先声明一个String数组,来存放排除的URL。

1
private String[] excludeUrls;

initInternal方法中加入下面的代码,参数使用,来分割

1
2
3
4
String paramExcludeUrl = getPropertyFromInitParams(filterConfig, "excludeUrls", null);
if (CommonUtils.isNotBlank(paramExcludeUrl)) {
setExcludeUrls(paramExcludeUrl.trim().split(","));
}

加入setExcludeUrls方法

1
2
3
public final void setExcludeUrls(String[] excludeUrls) {
this.excludeUrls = excludeUrls;
}

doFilter方法中加入下面的代码

1
2
3
4
if (exclude(request)) {
filterChain.doFilter(request, response);
return;
}

最后是核心的exclude方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private Boolean exclude(HttpServletRequest request) {
String serviceUrl = request.getRequestURI();
if (serviceUrl == null || excludeUrls == null) {
return false;
}

for (String url : excludeUrls) {
if (serviceUrl.contains(url)) {
return true;
}
}

return false;
}

web.xmlCAS Filter的配置最后大概是这个样子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>me.lijf.filter.MyCasFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://lijf.me/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>https://lijf.me</param-value>
</init-param>
<init-param>
<param-name>excludeUrls</param-name>
<param-value>/api</param-value>
</init-param>
</filter>

最后要说明的是,高版本的CAS Client(似乎是3.3.3之后的版本),已经支持ignorePattern参数。