Spring HandlerInterceptors 是如何实例化的?

9

每个请求是否有一个新的Spring HandlerInterceptors实例?

我在Spring中有一个拦截器,其中包含一个类字段。

public class MyInterceptor extends HandlerInterceptorAdapter {
    Private boolean state = false;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        state = true;
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        if (state == true) {
        System.out.println("Success");
        }
}

如果使用这个拦截器,它是否总是会打印“Success”?(无论同时有多少线程在执行?)
1个回答

9
拦截器的实例化方式取决于您将其配置为bean的方式。如果您没有明确指定bean的范围,那么它将像任何其他bean一样成为单例,因此“state”字段将被所有请求共享。
从这个意义上说,拦截器与控制器没有区别 - 在其中放置会话状态时要非常小心,因为对象将在请求之间共享。
如果您真的需要有状态的拦截器,并且不想在请求之间共享状态,则使用一个请求范围的bean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接