基于服务端的修改流程:客户端所有的远程请求都必须携带有loginUrl参数信息以使得服务器端知道在认证失败后转向客户端登陆页面。
我们首先需要重新实现一个自己的认证过滤器,以下是我们自己的认证过滤器的代码:
/**
* 远程认证过滤器.
* 由于AuthenticationFilter的doFilter方法被声明为final,
* 只好重新实现一个认证过滤器,支持localLoginUrl设置.
*
*/
public class RemoteAuthenticationFilter extendsAbstractCasFilter {
public static finalString CONST_CAS_GATEWAY = "_const_cas_gateway_";
/**
* 本地登陆页面URL.
*/
privateString localLoginUrl;
/**
* The URL to the CASServer login.
*/
private StringcasServerLoginUrl;
/**
* Whether to send therenew request or not.
*/
private boolean renew= false;
/**
* Whether to send thegateway request or not.
*/
private booleangateway = false;
protected voidinitInternal(final FilterConfig filterConfig) throws ServletException {
super.initInternal(filterConfig);
setCasServerLoginUrl(getPropertyFromInitParams(filterConfig,"casServerLoginUrl", null));
log.trace("Loaded CasServerLoginUrl parameter: " +this.casServerLoginUrl);
setLocalLoginUrl(getPropertyFromInitParams(filterConfig,"localLoginUrl", null));
log.trace("Loaded LocalLoginUrlparameter: " + this.localLoginUrl);
setRenew(Boolean.parseBoolean(getPropertyFromInitParams(filterConfig,"renew", "false")));
log.trace("Loaded renew parameter: " + this.renew);
setGateway(Boolean.parseBoolean(getPropertyFromInitParams(filterConfig,"gateway", "false")));
log.trace("Loaded gateway parameter: " + this.gateway);
}
public void init() {
super.init();
CommonUtils.assertNotNull(this.localLoginUrl, "localLoginUrl cannotbe null.");
CommonUtils.assertNotNull(this.casServerLoginUrl,"casSer