尝试使用Java配置将Struts2和Spring Security SAML与应用程序集成

时间:2014-09-30 15:14:35

标签: spring struts2 spring-security spring-saml

我尝试在我的应用程序中使用Spring Security SAML Extension。我无法确定正确的配置。在我的应用程序中,我使用的是Spring Java Configuration。这是我的代码:

的web.xml:

<context-param>
        <param-name>contextClass</param-name>
        <param-value>
         org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.ceiwc.es.config</param-value>
    </context-param>

    <!-- For Spring Security -->
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <!-- Handles Strut2 URL requests -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <!-- Mapping for Spring Security URLs -->
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- Mapping for Struts2 URLs -->
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- /WEB-INF/spring/spring-config.xml -->
    <!-- <context-param> <param-name>contextConfigLocation</param-name> <param-value> 
        /WEB-INF/spring/springSecurity-config.xml </param-value> </context-param> -->

    <!-- In charge of starting and stopping the Spring root ApplicationContext. 
        It also determines which configurations are to be used, by looking at the 
        contextConfigLocation. -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <session-config>
        <session-timeout>20</session-timeout>
    </session-config>

这是我的配置类:

@Configuration
@ComponentScan(basePackages = {"com.ceiwc.bc", "com.ceiwc.es"})
@Import({DataConfig.class, LdapConfig.class, CacheConfig.class})
@ImportResource({"/WEB-INF/spring/spring-config.xml", "/WEB-INF/spring/springSecurity-config.xml"})
@PropertySource({"classpath:global.properties"})
public class ApplicationConfig {
    @Bean
    public JavaMailSender mailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost("iwmail.iwif-internal.com");
        return mailSender;
    }
}

当我运行该应用程序时,我收到以下错误:

  

严重:上下文初始化失败   java.lang.IncompatibleClassChangeError:在。实现类   java.lang.ClassLoader.defineClass1(Native Method)at   java.lang.ClassLoader.defineClass(ClassLoader.java:800)at   java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)     在   weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:412)     在   weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:366)     在   weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:318)     在   weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:80)     在java.lang.ClassLoader.loadClass(ClassLoader.java:425)at   java.lang.ClassLoader.loadClass(ClassLoader.java:358)at   weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:186)     在   weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:50)     在   org.springframework.security.saml.SAMLBootstrap.postProcessBeanFactory(SAMLBootstrap.java:42)     在   org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:696)     在   org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:686)     在   org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)     在   org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410)     在   org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)     在   org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)     在   weblogic.servlet.internal.EventsManager $ FireContextListenerAction.run(EventsManager.java:678)     在   weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)     在   weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)     在   weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)     在   weblogic.servlet.internal.EventsManager.executeContextListener(EventsManager.java:243)     在   weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:200)     在   weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:185)     在   weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1838)     在   weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:2876)     在   weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1661)     在   weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:823)     在   weblogic.application.internal.ExtensibleModuleWrapper $ StartStateChange.next(ExtensibleModuleWrapper.java:360)     在   weblogic.application.internal.ExtensibleModuleWrapper $ StartStateChange.next(ExtensibleModuleWrapper.java:356)     在   weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42)     在   weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:138)     在   weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)     在   weblogic.application.internal.flow.ModuleStateDriver $ 3.next(ModuleStateDriver.java:216)     在   weblogic.application.internal.flow.ModuleStateDriver $ 3.next(ModuleStateDriver.java:211)     在   weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42)     在   weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:73)     在   weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:24)     在   weblogic.application.internal.BaseDeployment $ 2.next(BaseDeployment.java:729)     在   weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42)     在   weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:258)     在   weblogic.application.internal.SingleModuleDeployment.activate(SingleModuleDeployment.java:48)     在   weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:165)     在   weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:80)     在   weblogic.deploy.internal.targetserver.BasicDeployment.activate(BasicDeployment.java:226)     在   weblogic.deploy.internal.targetserver.BasicDeployment.activateFromServerLifecycle(BasicDeployment.java:418)     在   weblogic.management.deploy.internal.DeploymentAdapter $ 1.doActivate(DeploymentAdapter.java:51)     在   weblogic.management.deploy.internal.DeploymentAdapter.activate(DeploymentAdapter.java:200)     在   weblogic.management.deploy.internal.AppTransition $ 2.transitionApp(AppTransition.java:30)     在   weblogic.management.deploy.internal.ConfiguredDeployments.transitionApps(ConfiguredDeployments.java:240)     在   weblogic.management.deploy.internal.ConfiguredDeployments.activate(ConfiguredDeployments.java:169)     在   weblogic.management.deploy.internal.ConfiguredDeployments.deploy(ConfiguredDeployments.java:123)     在   weblogic.management.deploy.internal.DeploymentServerService.resume(DeploymentServerService.java:210)     在   weblogic.management.deploy.internal.DeploymentServerService.start(DeploymentServerService.java:118)     在   weblogic.server.AbstractServerService.postConstruct(AbstractServerService.java:78)     在sun.reflect.GeneratedMethodAccessor7.invoke(未知来源)at   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:606)at   org.glassfish.hk2.utilities.reflection.ReflectionHelper.invoke(ReflectionHelper.java:1017)     在   org.jvnet.hk2.internal.ClazzCreator.postConstructMe(ClazzCreator.java:388)     在org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:430)     在   org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:456)     在   org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:225)     在   org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:82)     在   org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2488)     在   org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:98)     在   org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:606)     在   org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:77)     在org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:231)     在   org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:254)     在org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:413)     在   org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:456)     在   org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:225)     在   org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:82)     在   org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2488)     在   org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:98)     在   org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:87)     在   org.glassfish.hk2.runlevel.internal.CurrentTaskFuture $ QueueRunner.oneJob(CurrentTaskFuture.java:1162)     在   org.glassfish.hk2.runlevel.internal.CurrentTaskFuture $ QueueRunner.run(CurrentTaskFuture.java:1147)     在   weblogic.work.SelfTuningWorkManagerImpl $ WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:548)     在weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)at   weblogic.work.ExecuteThread.run(ExecuteThread.java:263)

更多stacktrace:

  

org.springframework.web.context.ContextLoader - 上下文初始化   失败   java.lang.IncompatibleClassChangeError:在。实现类   java.lang.ClassLoader.defineClass1(Native Method)at   java.lang.ClassLoader.defineClass(ClassLoader.java:800)at   java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)     在   weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:412)     在   weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:366)     截断。请参阅日志文件以获取完整的堆栈跟踪

     

用户定义的侦听器   org.springframework.web.context.ContextLoaderListener失败:   java.lang.IncompatibleClassChangeError:实现类。   java.lang.IncompatibleClassChangeError:在。实现类   java.lang.ClassLoader.defineClass1(Native Method)at   java.lang.ClassLoader.defineClass(ClassLoader.java:800)at   java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)     在   weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:412)     在   weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:366)     截断。请参阅日志文件以获取完整的堆栈跟踪

     

无法在web.xml中加载用户定义的过滤器:   org.springframework.web.filter.DelegatingFilterProxy。   java.lang.IncompatibleClassChangeError:在。实现类   java.lang.ClassLoader.defineClass1(Native Method)at   java.lang.ClassLoader.defineClass(ClassLoader.java:800)at   java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)     在   weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:412)     在   weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:366)     截断。请参阅日志文件以获取完整的堆栈跟踪

我做错了什么?如果我添加contextConfigLocation,我会收到一个错误,指示DelegatingFilterProxy无法初始化。任何帮助将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

为我解决这个问题的原因是添加了wls:prefer-web-inf-classes元素并将其设置为true。可以找到对此的一个很好的解释here

相关问题