精华内容
下载资源
问答
  • 今天我在做短信验证码的...我一开始采用了私有成员变量,但是我突然觉得这个数据并不安全,假如多人同时请求这个controller,那么数据安全无法保证,于是我做了一个测试,发现真的会串改数据。 于是我改用了sessio...

    今天我在做短信验证码的时候,需要一个RequestMapping获取验证码,还需要一个RequestMapping验证用户输入验证码和发送验证码是否正确。但是我怎么传递随机验证码和验证的电话号码呢?我一开始采用了私有成员变量,但是我突然觉得这个数据并不安全,假如多人同时请求这个controller,那么数据安全无法保证,于是我做了一个测试,发现真的会串改数据。

    于是我改用了session来存放数据,这样就ok了。但是我觉得我需要深入去了解一番,于是我使用了@Scope("prototype"),这个是可以多线程的,每次为一个线程分配一个action。于是我把私有变量设置成了static,发现不会被串改,相互不影响

    但是,最好不要使用私有成员变量,这样很不安全,假如一定要使用,必须加上@Scope("prototype")的注解。假如没有私有成员变量,controller单例也是安全的,它自身具有多线程的功能。

    转载于:https://www.cnblogs.com/claireyu1219/p/5813649.html

    展开全文
  • 再一次前台调用后台查询个表,获取结果的过程中,我在controller里面开启线程池跑,同事查询个表。每个线程run方法里面使用同一个request,然后通过request.getParameter()获取入参。次查询总有那么1,2个线程...

    再一次前台调用后台查询多个表,获取结果的过程中,我在controller里面开启线程池跑,同事查询多个表。每个线程run方法里面使用同一个request,然后通过request.getParameter()获取入参。多次查询总有那么1,2个线程拿不到参数,跑出空指针异常。我把代码排查到如下类似代码,可以复现问题。使用postman模拟请求http://localhost:8081/test?aaa=aaa,多次发送请求,后台不定时会有空指针异常。

     

    问题原因追踪:我刚开始怀疑是tomcat的原因,也尝试看了request.getparameter()的源码,如下,paramHashValues的类型是LinkedHashMap,这个类是链表hashmap,它的get方法是线程安全的,且调试过程中paramHashValues分明有值,但是代码还是会调到else里面,很费解。

    然后我在本地另一个项目里面复现此问题,并没有复现。我认真比对了2个项目的配置文件,发现是pom里面依赖spring boot的版本引起的,spring boot 的不同版本会使用不同版本的tomcat-core,tomcat-core具体处理getParameter()。

    问题pom

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.xxx</groupId>
        <artifactId>AutoTest</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
    <!--        <version>1.3.2.RELEASE</version>-->
            <version>2.1.2.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-servlet-api</artifactId>
                <version>7.0.42</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.2</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>27.0.1-jre</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.54</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.54</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.11</version>
            </dependency>
            <dependency>
                <groupId>org.apache.pdfbox</groupId>
                <artifactId>pdfbox</artifactId>
                <version>2.0.15</version>
            </dependency>
            <dependency>
                <groupId>org.apache.pdfbox</groupId>
                <artifactId>fontbox</artifactId>
                <version>2.0.15</version>
            </dependency>
            <dependency>
                <groupId>com.amazonaws</groupId>
                <artifactId>aws-java-sdk</artifactId>
                <version>1.11.547</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.1.1</version>
            </dependency>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-api</artifactId>
                <version>RELEASE</version>
                <scope>compile</scope>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>

    没问题的pom

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.xxx</groupId>
        <artifactId>AutoTest</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.3.2.RELEASE</version>
           <!-- <version>2.1.2.RELEASE</version>-->
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-servlet-api</artifactId>
                <version>7.0.42</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.2</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>27.0.1-jre</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.54</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.54</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.11</version>
            </dependency>
            <dependency>
                <groupId>org.apache.pdfbox</groupId>
                <artifactId>pdfbox</artifactId>
                <version>2.0.15</version>
            </dependency>
            <dependency>
                <groupId>org.apache.pdfbox</groupId>
                <artifactId>fontbox</artifactId>
                <version>2.0.15</version>
            </dependency>
            <dependency>
                <groupId>com.amazonaws</groupId>
                <artifactId>aws-java-sdk</artifactId>
                <version>1.11.547</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.1.1</version>
            </dependency>
            <dependency>
                <groupId>org.junit.jupiter</groupId>
                <artifactId>junit-jupiter-api</artifactId>
                <version>RELEASE</version>
                <scope>compile</scope>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>

    如果你们要复现问题的话可以使用问题pom,然后写一个controller,仿照图片的写法。

    问题解决:1,更换spring boot 的版本(已验证)

    2.可以更换spring boot使用tomcat的版本(未验证)

    3.代码里面加入锁(推荐)

     

    展开全文
  • 项目中的问题-controller是否线程安全

    千次阅读 2019-08-14 10:16:36
    结论:Controller线程不安全的, 默认的controller是单列的; 因此所有的线程共享一个controller;可以通过设置controller的scope来改变,使得每个线程拥有自己的controller实例。 测试: /** * Controller线程不...
    1. 结论:Controller是线程不安全的, 默认的controller是单列的; 因此所有的线程共享一个controller;可以通过设置controller的scope来改变,使得每个线程拥有自己的controller实例。
    2. 测试:
    /**
     * Controller是线程不安全的, 默认的controller是单列的; 因此所有的线程共享一个controller;
     * result:
     *  SET: http-nio-8081-exec-1, Num: 0
     *  GET: http-nio-8081-exec-2, Num: 1
     *  SET: http-nio-8081-exec-3, Num: 1
     *  GET: http-nio-8081-exec-4, Num: 2
     *  SET: http-nio-8081-exec-5, Num: 2
     */
    @RequestMapping(value = "/test")@RestController
    public class TestController {
        private TestDto dto = new TestDto();
    
        @PutMapping(value = "/set")    public void set() {
            System.out.println("SET: " + Thread.currentThread().getName() + ", Num: " + dto.getNum());
            dto.setNum(dto.getNum() + 1);
        }
        @GetMapping(value = "/get")
        public Long get() {
            System.out.println("GET: " + Thread.currentThread().getName() + ", Num: " + dto.getNum());
            return dto.getNum();
        }
     }
    
    展开全文
  • Controller线程安全的吗

    千次阅读 2020-10-07 18:58:39
    Controller线程安全的吗 ...但这样会消耗很资源,并且这种方式只对于该Controller中非静态成员变量有用,如果是静态资源他还是会线程不安全. 2单例模式下需要线程安全的话必须使用ThreadLocal来封装变量ThreadLocal

    Controller是线程安全的吗

    最近学长被问到了这个面试题,自己也查阅了相关的资料总结如下,
    在Springmvc中,所有的bean实例都是交给ioc容器去管理,默认Scope是单例模式,所以他是线程不安全的.
    解决方法
    1将创建的Controller的Scope设置成为多例prototype.但这样会消耗很多资源,并且这种方式只对于该Controller中非静态成员变量有用,如果是静态资源他还是会线程不安全.
    2单例模式下需要线程安全的话必须使用ThreadLocal来封装变量ThreadLocal tl = new ThreadLocal<>(); 才能保证线程安全.

    展开全文
  • 升降控制器 多线程电梯控制器
  • 实例变量和类变量(静态变量)类&单实例&实例(如何知道一个类有多少个实例)线程名称&线程安全spring mvc controller单实例OR实例 web容器启动时区别synchronized使用 实验: 实验方法: 通过
  • @Controller默认采用单例注入,因此它是多线程共享,但是并不一定是线程不安全的,如果Controller中有非静态成员变量,则是线程不安全的 2,若出现非静态变量,要保证线程安全: 建议用默认单例方式,实现要共享对象...
  • Spring的controller默认是Singleton的,这意味着每一个request过来,系统都会用原有的...由于只有一个Controller的instance,当线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。
  • 通过scope属性可以更改为例。 第一部分:验证Spring生成对象默认是单例的。 下面我们来一个网上的例子验证一下: <beanid="singleton"class="java.util.Date"scope="singleton"></bean> <...
  • 若有线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。 1)常量始终是线程安全的,因为只存在读操作。 2)局部变量是线程安全的。因为每执行一个方法,都会在独立的空间(栈帧)创建局部...
  • Controller是JFinal核心类之一,该类作为MVC模式中的控制器。基于JFinal的Web应用的控制器...因为每次请求过来,都是使用新创建的 controller 对象处理请求的,该 controller 对象是线程独享的,所以线程安全 ...
  • 每个请求都会分配一个线程处理请求http://www.cnblogs.com/doit8791/p/4093808.html ...总的来讲就是controller可以自定义为单例的,当请求发送请求时,每个请求会有一个线程处理,全局变量会被共享,每
  • 使用GroboUtils多线程并发请求测试springmvc controller
  • 【Java】Java Controller 每次只能一个请求 多线程 ReentrantLock.pdf
  •  从需求中就可以看出代码涉及了服务器上同一个文件夹的写操作,如果多个用户在差不多时刻点击打包按钮,那么有可能会产生冲突,需要进行多线程同步操作。大家都知道SpringMVC 的controller默认是单例模式,因此在...
  • spring mvc 中controller是非线程安全的

    千次阅读 2016-03-05 19:02:56
    springmvc的controller是singleton的(非线程安全的),struts2中的action是每次请求都实例一个action对象,是不用考虑action的线程安全问题的。和Struts一样,Spring的Controller默认是Singleton的,这意味着每个...
  • Spring的Controller是Singleton的,或者是线程不安全的  和Struts一样,Spring的Controller是Singleton的,这意味着每个request过来,系统都会用原有...由于只有一个Controller的instance,当线程调用它的时...
  • 彻底理解tomcat是怎样多线程处理的http请求并将代码执行到controller里的 1.线程池:thread=threadPool.getThread().thread.executeHttp(httprequest),thread的start方法执行行里面调用,每个thread里获取所有的...
  • @Controller(运用于表现层)使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为"userAction"的action,这个名字是根据UserAction类名来取的。...
  • 最近几年工作一直主要用的是SpringMvc...所以每一次的请求过来只会使用首次创建的实例,这样可以避免每次创建新的对象,减少垃圾对象,但是它也有弊端,最大的问题就是如果内部声明了实例变量,多线程下存在线程安全问题
  • 有状态和无状态的对象基本概念: 有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,是非线程安全的。一般是prototype scope。 无状态对象(Stateless ...线程同时访问此action时 会造成user变量的..
  • 背景我有一个程序,controller中接收客户端请求,但是这个请求做的操作非常的重,而且做完一个如果再来请求必须拒绝。因为这是一个费时的操作。而且次操作会报错。 @GetMapper() public void do(){ // 判断是否...
  • 如果有个方法 访问了可写的成员变量并且修改了这个成员变量,那么就出现线程安全问题了(多线程情况下哪个线程都可以修改,谁再什么时候修改的就要看线程的调度了),如果你有个对象本身是符合【非“线程安全”】的...
  • 此时会存在一个问题,这个controllerl内部声明了实例变量,当线程调用它的时候,线程访问的是同一个对象变量,就会产生线程安全问题。 解决在controller内部声明全局变量的方法: 1.成员变量定义在方法...
  • struts是线程安全,并不是指多线程,而是指单态,当多个用户访问一个请求的时候,服务器内存中只有一个与之对应的action类对象,execute方法加上了同步关键字,如果你在action里加上一个全局变量,那么,多个客户...
  • controller默认是单例的,单例的是线程不安全的 下面是一个简单的案例: 一、先将idea设置为热部署 1.在pom文件中导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <...
  • 不安全,默认情况,也就是单例模式下需要线程...若是例在controller上添加@Scope(value = “prototype”),使controller变成例的那么,在没有静态成员变量的情况下他是线程安全的,但是若使用了静态成员变量,那么因...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,521
精华内容 33,408
关键字:

controller多线程