Spring MVC集成测试弹簧安全问题,怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC集成测试弹簧安全问题,怎么解决相关的知识,希望对你有一定的参考价值。

参考技术A

首先对于spring的IOC来说,对象是由Spring来帮我们管理,也就是在Spring启动的时候,在Spring容器中,由Spring给我们创建的,Spring会帮我们维护,一般都是单例的,也就是一个对象。

spring生成对象默认是单例的。通过scope属性可以更改为多例。

第一部分:验证Spring生成对象默认是单例的。

下面我们来一个网上的例子验证一下:

[html] view plain copy print?

    <bean id="singleton" class="java.util.Date" scope="singleton"></bean>  

    <bean id="prototype" class="java.util.Date" scope="prototype"></bean>  

    [java] view plain copy print?

    package test;   

    import java.util.Date;  

    import org.springframework.context.ApplicationContext;  

    import org.springframework.context.support.ClassPathXmlApplicationContext;  

    import com.opensymphony.xwork2.ActionContext;  

    public class TestScope   

    public static void main(String[] args)   

    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext-web.xml");  

    Date s1=(Date)context.getBean("singleton");  

    Date p1=(Date)context.getBean("prototype");  

    Date s2=(Date)context.getBean("singleton");  

    Date p2=(Date)context.getBean("prototype");  

    System.out.println("单例:"+(s1==s2));  

    System.out.println("非单例:"+(p1==p2));  

      

      


    输出结果:

    结果

    单例:true

    非单例:false

    注:复合数据类型的“== ”对比的是内存中存放的地址,所以此处我们采用“==”去对比

    因为object中的equals初始行为是比较内存中的地址,但在一些类库中被覆盖掉了如(String,Integer,Date等)

    第二部分:SpringMVC和Struts2中是并发访问否会存在线程安全问题。

    对于使用过SpringMVC和Struts2的人来说,大家都知道SpringMVC是基于方法的拦截,而Struts2是基于类的拦截。

    对于Struts2来说,因为每次处理一个请求,struts就会实例化一个对象;这样就不会有线程安全的问题了;

    而Spring的controller默认是Singleton的,这意味着每一个request过来,系统都会用原有的instance去处理,这样导致两个结果:

    一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。

    当然大多数情况下,我们根本不需要考虑线程安全的问题,比如dao,service等,除非在bean中声明了实例变量。因此,我们在使用spring mvc 的contrller时,应避免在controller中定义实例变量。 
    如:

    [java] view plain copy print?

    public class Controller extends AbstractCommandController     

    protected Company company;  

    protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response,Object command,BindException errors) throws Exception   

    company = ................;           

                 

        


    解决方案:

    有几种解决方法:
    1、在Controller中使用ThreadLocal变量
    2、在spring配置文件Controller中声明 scope="prototype",每次都创建新的controller
    所在在使用spring开发web 时要注意,默认Controller、Dao、Service都是单例的。

    例如:

    [java] view plain copy print?

    @Controller  

    @RequestMapping("/fui")  

    public class FuiController extends SpringController   

    //这么定义的话就是单例  

    @Controller  

    @Scope("prototype")  

    @RequestMapping("/fui")  

    public class FuiController extends SpringController   

    //每次都创建  

如何测试在弹簧集成中使用通道的热文件夹?

【中文标题】如何测试在弹簧集成中使用通道的热文件夹?【英文标题】:how to test a hotfolder that use channels in spring-integration? 【发布时间】:2019-06-10 22:15:36 【问题描述】:

在 spring-integretion 项目中,我有一个热文件夹,用于检测何时将 csv 放入文件夹并做一些额外的事情,我有一个与通道连接的入站通道适配器。

入站通道适配器-> 通道。 检测其放置的 csv 何时收到与其连接的 mns 服务激活器 我要做什么测试只在创建文件时通道接收 mns

我正在使用本教程 https://www.javacodegeeks.com/2013/05/spring-integration-file-polling-and-tests.html 它非常有用,但我可以创建上下文

在允许 TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@57a4d5ee] 准备测试实例 [proyect.integration.hotFolderTest@5af5def9] 时捕获异常 java.lang.IllegalStateException: 无法加载 ApplicationContext

【问题讨论】:

【参考方案1】:

您需要显示更多有关此问题的堆栈跟踪,因为目前尚不清楚您的真正问题是什么。

也很高兴分享一些您目前拥有的代码以及您想在测试用例中做什么。

要验证通道中是否存在消息,您可以配置ChannelInterceptor 并实现其preSend()

但是,我们也建议使用 @SpringIntegrationTest 之类的 MockIntegration 功能。这样您就可以用一些MockIntegration.mockMessageHandler() 替换您的真实服务激活器并对其执行验证。

您需要在提到的注解上配置一个noAutoStartup,直到您准备好模拟并调用this.mockIntegrationContext.substituteMessageHandlerFor(),才轮询目录。

在参考手册中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/testing.html#test-context

【讨论】:

嗨,现在我知道我的问题是,首先我需要验证所有上下文(我在 xml 中定义的)是否需要加载到我创建的测试类中与: >@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "/../resources/hot-folder.xml" ) Artem Bilan 你说得对,我的问题很笼统,那是因为我不知道我在做什么。 但问题是,使用 RunWith 指定 spring 的特殊运行器,使用 ContextConfiguration 指定加载上下文所需的位置或类,在我的情况下,我将路径中的所有 bean /../resources/hot-folder.xml 所以我可以在测试中使用,并且你必须在你带来你的上下文之前验证这个 bean 是否已经创建好

以上是关于Spring MVC集成测试弹簧安全问题,怎么解决的主要内容,如果未能解决你的问题,请参考以下文章

弹簧视图安全

Spring MVC 与 Spring Security 的集成测试

spring mvc集成spring security 案例

弹簧反应的弹簧安全会话超时

为啥弹簧测试失败,不起作用@MockBean

如何测试在弹簧集成中使用通道的热文件夹?