@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参数设置
控制参数
- -Xmx:设置堆的最大内存大小。等于初始内存
- -Xms:设置堆的初始内存大小。内存的一半
- -Xmn:设置年轻代的大小。推荐3/8的初始内存
- -Xss:设置线程栈的大小。
- -XX:MaxMetaspaceSize:设置元空间的最大大小。
- -XX:MetaspaceSize:设置元空间的初始大小。
- -XX:+UseG1GC:启用 G1 垃圾收集器。
- -XX:+UseConcMarkSweepGC:启用 CMS 垃圾收集器。
- -verbose:gc:启用详细的 GC 日志输出。
- -Xloggc:Dir:将 GC 日志输出到指定文件。
- -XX:+PrintGCDetails:打印 GC 详细信息。
- -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");
}
}