账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    FrameworkServlet.processRequest() 中为什么要获取上个请求的RequestAttributes?
    70
    0

    springmvc中的FrameworkServlet的processRequest方法中为什么要先获取上一个请求保存的LocaleContext和RequestAttributes,最后在finally中还要还原LocaleContext和RequestAttributes?这么做有什么意义?

    附上源码和疑点注释:

    //org.springframework.web.servlet.FrameworkServlet#processRequest
    
    protected final void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            long startTime = System.currentTimeMillis();
            Throwable failureCause = null;
    
    
            //获取上一个请求保存的LocaleContext
            LocaleContext previousLocaleContext = LocaleContextHolder.getLocaleContext();
            //建立新的LocaleContext
            LocaleContext localeContext = buildLocaleContext(request);
            //获取上一个请求保存的RequestAttributes
            RequestAttributes previousAttributes = RequestContextHolder.getRequestAttributes();
            //建立新的RequestAttributes
            ServletRequestAttributes requestAttributes = buildRequestAttributes(request, response, previousAttributes);
    
    
    
            WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
            asyncManager.registerCallableInterceptor(FrameworkServlet.class.getName(), new RequestBindingInterceptor());
    
            initContextHolders(request, localeContext, requestAttributes);
    
            try {
                doService(request, response);
            }
            catch (ServletException ex) {
                failureCause = ex;
                throw ex;
            }
            catch (IOException ex) {
                failureCause = ex;
                throw ex;
            }
            catch (Throwable ex) {
                failureCause = ex;
                throw new NestedServletException("Request processing failed", ex);
            }
    
            finally {
                //恢复previousLocaleContext和previousAttributes
                resetContextHolders(request, previousLocaleContext, previousAttributes);
                if (requestAttributes != null) {
                    requestAttributes.requestCompleted();
                }
    
                if (logger.isDebugEnabled()) {
                    if (failureCause != null) {
                        this.logger.debug("Could not complete request", failureCause);
                    }
                    else {
                        if (asyncManager.isConcurrentHandlingStarted()) {
                            logger.debug("Leaving response open for concurrent processing");
                        }
                        else {
                            this.logger.debug("Successfully completed request");
                        }
                    }
                }
    
                publishRequestHandledEvent(request, response, startTime, failureCause);
            }
        }
    
    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • o﹎.熟悉 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部