后端开发

70 阅读1分钟

@Autowired注入HttpServletRequest的线程安全问题

增加参数尽量用@Autowired注入,降低代码侵入度

@RestController
public class AutowiredRequestController {
    @Autowired
    private HttpServletRequest request;
}

AutowiredRequestController是一个singleton的bean,HttpServletRequest是一个变化的共享变量,每个请求对象都是不一样的,这样写不会有线程安全问题吗?

结论是:不会有线程安全问题,request被注入的对象是一个动态代理生成的类,并且objectFactory是WebApplicationContextUtils中的内部类RequestObjectFactory。是通过threadLocal来进行httpRequest获取的,可以保证线程安全。

调客户端ip方法

request.getRemoteAddr()如果有代理,返回的是代理的ip;真实客户端ip为request.getHeader("X-Forwarded-For")返回值的第一个ip。

JVM参数设置

控制参数

  1. -Xmx:设置堆的最大内存大小。等于初始内存
  2. -Xms:设置堆的初始内存大小。内存的一半
  3. -Xmn:设置年轻代的大小。推荐3/8的初始内存
  4. -Xss:设置线程栈的大小。
  5. -XX:MaxMetaspaceSize:设置元空间的最大大小。
  6. -XX:MetaspaceSize:设置元空间的初始大小。
  7. -XX:+UseG1GC:启用 G1 垃圾收集器。
  8. -XX:+UseConcMarkSweepGC:启用 CMS 垃圾收集器。
  9. -verbose:gc:启用详细的 GC 日志输出。
  10. -Xloggc:Dir:将 GC 日志输出到指定文件。
  11. -XX:+PrintGCDetails:打印 GC 详细信息。
  12. -XX:+PrintGCDateStamps:在 GC 日志中打印时间戳。

SpringBoot 拦截器继承WebMvcConfigurationSupport类导致date-format时间格式失效

解决办法不继承WebMvcConfigurationSupport,修改为实现WebMvcConfigurer接口

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Resource
    private JwtInterceptor jwtInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(jwtInterceptor)
                //拦截所有url
                .addPathPatterns("/**")
                //排除登录url
                .excludePathPatterns("/", "/login");

    }
}