Spring MVC如何使HttpServletRequest字段线程安全?

时间:2014-02-05 08:08:33

标签: java spring spring-mvc

代码:

package com.test.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/")
public class Controller {
    private HttpServletRequest request;

    public HttpServletRequest getRequest() {
        return request;
    }
    @Autowired
    public void setRequest(HttpServletRequest request) {
        this.request = request;
    }
    @RequestMapping("safe-read")
    public void threadSafeRead() throws InterruptedException {
        System.out.println(request.getHeader("user-agent"));
        Thread.sleep(TimeUnit.MILLISECONDS.convert(5,TimeUnit.SECONDS));
        System.out.println(request.getHeader("user-agent"));
    }
}

当我同时做两个请求时,执行的结果是:

  1. Mozilla / 5.0(Windows NT 6.1; WOW64; rv:26.0)Gecko / 20100101 火狐/ 26.0
  2. Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.36(KHTML,like Gecko)Chrome / 32.0.1700.102 Safari / 537.36
  3. Mozilla / 5.0(Windows NT 6.1; WOW64; rv:26.0)Gecko / 20100101 火狐/ 26.0
  4. Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.36(KHTML,like Gecko)Chrome / 32.0.1700.102 Safari / 537.36
  5. 在运行时字段中有类型com.sun.proxy.$Proxy45。 弹簧如何使其成为线程安全的读取?

1 个答案:

答案 0 :(得分:0)

为了扩展M. Deinum上面的评论,我们可以使用一些方法来避免将请求的引用作为控制器状态的一部分。

1)如前所述,直接将请求作为方法签名的一部分注入。

2)只使用方法签名中的@RequestParam注释处理您直接感兴趣的请求参数。

3)查看RequestContextHolder类的Spring api文档。你可以这样做:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
            .currentRequestAttributes()).getRequest();

对您有用或可能没用。

希望这会有所帮助: - )