Java 在不使用web.xml的情况下使用Spring(Boot)配置CAS

Java 在不使用web.xml的情况下使用Spring(Boot)配置CAS,java,xml,spring,spring-mvc,cas,Java,Xml,Spring,Spring Mvc,Cas,我正在用Boot将一个WebApp从spring3移植到spring4 下面是原始web.xml文件 <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <filter> <filter-name>CAS Authentication F

我正在用Boot将一个WebApp从spring3移植到spring4

下面是原始web.xml文件

<listener>
 <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>

<filter>
 <filter-name>CAS Authentication Filter</filter-name>
 <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
 <init-param>
    <param-name>casServerLoginUrl</param-name>
    <param-value>https://casserver/login</param-value>
 </init-param>
 <init-param>
    <param-name>serverName</param-name>
    <param-value>http://myapp</param-value>
 </init-param>
</filter>

<filter>
 <filter-name>CAS Validation Filter</filter-name>
 <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
 <init-param>
    <param-name>casServerUrlPrefix</param-name>
    <param-value>https://casserver/login</param-value>
 </init-param>
 <init-param>
    <param-name>serverName</param-name>
    <param-value>http://myapp</param-value>
 </init-param>
 <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
 </init-param>
</filter>

<filter>
 <filter-name>CAS Single Sign Out Filter</filter-name>
 <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>

<filter-mapping>
 <filter-name>CAS Single Sign Out Filter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
 <filter-name>CAS Authentication Filter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
 <filter-name>CAS Validation Filter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

<session-config>
 <session-timeout>90</session-timeout>
</session-config>

<context-param>
 <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
 <param-value>messages</param-value>
</context-param>
1/CAS20实例问题

我无法定义cas20 casServerUrlPrefix。。。没有二传手

2/身份验证筛选器问题

即使定义了serverName,在启动过程中也会发生以下错误:

java.lang.IllegalArgumentException: serverName or service must be set.
    at org.jasig.cas.client.util.CommonUtils.assertTrue(CommonUtils.java:116) ~[cas-client-core-3.2.1.jar:3.2.1]
    at org.jasig.cas.client.util.AbstractCasFilter.init(AbstractCasFilter.java:103) ~[cas-client-core-3.2.1.jar:3.2.1]
    at org.jasig.cas.client.authentication.AuthenticationFilter.init(AuthenticationFilter.java:96) ~[cas-client-core-3.2.1.jar:3.2.1]
    at org.jasig.cas.client.util.AbstractCasFilter.init(AbstractCasFilter.java:84) ~[cas-client-core-3.2.1.jar:3.2.1]
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279) ~[tomcat-embed-core-8.0.28.jar:8.0.28]
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:109) ~[tomcat-embed-core-8.0.28.jar:8.0.28]
java.lang.IllegalArgumentException:必须设置服务器名或服务。
在org.jasig.cas.client.util.CommonUtils.assertTrue(CommonUtils.java:116)~[cas-client-core-3.2.1.jar:3.2.1]
在org.jasig.cas.client.util.AbstractCasFilter.init(AbstractCasFilter.java:103)~[cas-client-core-3.2.1.jar:3.2.1]
在org.jasig.cas.client.authentication.AuthenticationFilter.init(AuthenticationFilter.java:96)~[cas-client-core-3.2.1.jar:3.2.1]
在org.jasig.cas.client.util.AbstractCasFilter.init(AbstractCasFilter.java:84)~[cas-client-core-3.2.1.jar:3.2.1]
在org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279)~[tomcat-embed-core-8.0.28.jar:8.0.28]
在org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:109)~[tomcat-embed-core-8.0.28.jar:8.0.28]

是否可以在ServletContextInitializer内部定义这种过滤器?我是否必须加载一个xml(dispatcher-servlet.xml之类?

我强烈建议您阅读一下,如果您知道自己在做什么,那么web.xml可以很好地移植。您只需要在注册中指定init参数

<filter>
 <filter-name>CAS Validation Filter</filter-name>
 <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
 <init-param>
    <param-name>casServerUrlPrefix</param-name>
    <param-value>https://casserver/login</param-value>
 </init-param>
 <init-param>
    <param-name>serverName</param-name>
    <param-value>http://myapp</param-value>
 </init-param>
 <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
 </init-param>
</filter>
上面是xml到java的一对一转换。这会让你了解其他过滤器

不过,您使用的是弹簧靴,这使它更容易。只需创建一个
@Bean
方法,该方法返回所需过滤器的值。另请参阅《Spring Boot参考指南》中相应的

@Bean
public FilterRegistrationBean cas20Registration() {
    FilterRegistrationBean cas20 = new FilterRegistrationBean();
    cas20.setFilter(new Cas20ProxyReceivingTicketValidationFilter());
    cas20.addUrlPatterns("/*");
    cas20.addInitParameter("casServerUrlPrefix casServerUrlPrefix", "https://casserver/login");
    cas20.addInitParameter("serverName", "http://myapp");
    cas20.addInitParameter("encoding", "UTF-8");        
    return cas20;
}
您可以对其他筛选器、侦听器和所需组件执行相同的操作

但是,有一件事是基于java的配置无法做到的,那就是设置会话超时值。但是,您只需将其移动到
应用程序.properties
并添加
服务器.session.timeout
属性即可。您需要将值乘以60,因为在web.xml中,它是以分钟为单位的,而在属性文件中,它应该是以秒为单位的

server.session.timeout=5400 # 90 minutes

这是基于标准jhipster构建的,它在为spring boot配置CAS方面帮助了我很多,可能也很有用
@Configuration
public class MyWebApplicationInitializer implements ServletContextInitializer  {

    @Override
    public void onStartup(ServletContext sc) {
        FilterRegistration.Dynamic cas20Registration = sc.addFilter("CAS Validation Filter", Cas20ProxyReceivingTicketValidationFilter.class);
        cas20Registration.setInitParameter("casServerUrlPrefix casServerUrlPrefix", "https://casserver/login");
        cas20Registration.setInitParameter("serverName", "http://myapp");
        cas20Registration.setInitParameter("encoding", "UTF-8");
        cas20Registration.addMappingForUrlPatterns(null, false, "/*");
    }
}
@Bean
public FilterRegistrationBean cas20Registration() {
    FilterRegistrationBean cas20 = new FilterRegistrationBean();
    cas20.setFilter(new Cas20ProxyReceivingTicketValidationFilter());
    cas20.addUrlPatterns("/*");
    cas20.addInitParameter("casServerUrlPrefix casServerUrlPrefix", "https://casserver/login");
    cas20.addInitParameter("serverName", "http://myapp");
    cas20.addInitParameter("encoding", "UTF-8");        
    return cas20;
}
server.session.timeout=5400 # 90 minutes