spring mvc 源码简要分析

关于web项目,运用比较多的是过滤器和拦截器

过滤器基于责任链设计模式

创建过滤器链

/ Create the filter chain for this requestApplicationFilterChain filterChain =        ApplicationFilterFactory.createFilterChain(request, wrapper, servlet);

//调用
private void internalDoFilter(ServletRequest request,                              ServletResponse response)    throws IOException, ServletException {

    // Call the next filter if there is one    if (pos < n) {        ApplicationFilterConfig filterConfig = filters[pos++];        try {            Filter filter = filterConfig.getFilter();

            if (request.isAsyncSupported() && "false".equalsIgnoreCase(                    filterConfig.getFilterDef().getAsyncSupported())) {                request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR, Boolean.FALSE);            }            if( Globals.IS_SECURITY_ENABLED ) {                final ServletRequest req = request;                final ServletResponse res = response;                Principal principal =                    ((HttpServletRequest) req).getUserPrincipal();

                Object[] args = new Object[]{req, res, this};                SecurityUtil.doAsPrivilege ("doFilter", filter, classType, args, principal);            } else {                filter.doFilter(request, response, this);            }        } catch (IOException | ServletException | RuntimeException e) {            throw e;        } catch (Throwable e) {            e = ExceptionUtils.unwrapInvocationTargetException(e);            ExceptionUtils.handleThrowable(e);            throw new ServletException(sm.getString("filterChain.filter"), e);        }        return;    }

    // We fell off the end of the chain -- call the servlet instance    try {        if (ApplicationDispatcher.WRAP_SAME_OBJECT) {            lastServicedRequest.set(request);            lastServicedResponse.set(response);        }

        if (request.isAsyncSupported() && !servletSupportsAsync) {            request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR,                    Boolean.FALSE);        }        // Use potentially wrapped request from this point        if ((request instanceof HttpServletRequest) &&                (response instanceof HttpServletResponse) &&                Globals.IS_SECURITY_ENABLED ) {            final ServletRequest req = request;            final ServletResponse res = response;            Principal principal =                ((HttpServletRequest) req).getUserPrincipal();            Object[] args = new Object[]{req, res};            SecurityUtil.doAsPrivilege("service",                                       servlet,                                       classTypeUsedInService,                                       args,                                       principal);        } else {            servlet.service(request, response);        }    } catch (IOException | ServletException | RuntimeException e) {        throw e;    } catch (Throwable e) {        e = ExceptionUtils.unwrapInvocationTargetException(e);        ExceptionUtils.handleThrowable(e);        throw new ServletException(sm.getString("filterChain.servlet"), e);    } finally {        if (ApplicationDispatcher.WRAP_SAME_OBJECT) {            lastServicedRequest.set(null);            lastServicedResponse.set(null);        }    }

拦截器基于动态代理 
// 执行拦截器的prehandle
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}

// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

// 执行拦截器的PostHandle
mappedHandler.applyPostHandle(processedRequest, response, mv);

// 执行拦截器的AfterCompletion
if (mappedHandler != null) {
mappedHandler.triggerAfterCompletion(request, response, null);
}



原文地址:https://www.cnblogs.com/wchxj/p/11784111.html

时间: 2024-10-11 21:05:58

spring mvc 源码简要分析的相关文章

spring mvc源码解析

1.从DispatcherServlet开始     与很多使用广泛的MVC框架一样,SpringMVC使用的是FrontController模式,所有的设计都围绕DispatcherServlet 为中心来展开的.见下图,所有请求从DispatcherServlet进入,DispatcherServlet根据配置好的映射策略确定处理的 Controller,Controller处理完成返回ModelAndView,DispatcherServlet根据配置好的视图策略确定处理的 View,由V

RxJava &amp;&amp; Agera 从源码简要分析基本调用流程(2)

版权声明:本文由晋中望原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/124 来源:腾云阁 https://www.qcloud.com/community 接上篇RxJava && Agera 从源码简要分析基本调用流程(1)我们从"1.订阅过程"."2.变换过程"进行分析,下篇文章我们继续分析"3.线程切换过程" 3.线程切换过程 从上文中我们知道了R

uboot源码简要分析

uboot源码简要分析 一.uboot源码整体框架 源码解压以后,我们可以看到以下的文件和文件夹: cpu 与处理器相关的文件.每个子目录中都包括cpu.c和interrupt.c.start.S.u-boot.lds. cpu.c:初始化CPU.设置指令Cache和数据Cache等 interrupt.c:设置系统的各种中断和异常 start.S:是U-boot启动时执行的第一个文件,它主要做最早期的系统初始化,代码重定向和设置系统堆栈,为进入U-boot第二阶段的C程序奠定基础. u-boo

Spring MVC源码——Root WebApplicationContext

目录 Spring MVC源码--Root WebApplicationContext 上下文层次结构 Root WebApplicationContext 初始化和销毁 ContextLoaderListener ContextLoader Servlet 3.0+ 中初始化 参考资料 Spring MVC源码--Root WebApplicationContext 打算开始读一些框架的源码,先拿 Spring MVC 练练手,欢迎点击这里访问我的源码注释. Spring MVC 的文档一开始

Spring IOC 源码简单分析 01 - BeanFactory

### 准备 ## 目标 了解 Spring IOC 的基础流程 ## 相关资源 Offical Doc:http://docs.spring.io/spring/docs/4.3.9.RELEASE/spring-framework-reference/htmlsingle/ Sample code:<https://github.com/gordonklg/study>,spring module 源码版本:Spring framework 4.3.9 ##测试代码 gordon.stud

Spring MVC源码分析--视图解析过程

写在最前,本文中的源码是4.2.3版本的源码,针对的是JstlView. 视图解析的过程即DispatcherServlet的doDispatch()方法的调用的processDispatchResult(): 1,processDispatchResult()里,调用DispatchServlet的render()方法: 2,render()方法里,调用DispatchServlet的resolveViewName()方法,把配置文件里注册的全部ViewResolver对象添加进来,寻找合适的

Spring MVC源码分析

从以下三个方面进行介绍: Spring MVC是基于Servlet实现的封装. 首先回顾下Servlet: Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤: 1.编写一个Java类,实现servlet接口. 2.把开发好的Java类部署到web服务器中. 按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程

带着问题学 Spring MVC 源码: 一、概述

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! 简单就好,生活可以很德国 Q:什么是 Spring MVC ? ※ Spring MVC 是 Spring Web 的一个重要模块.Spring 支持 Web 应用,Spring MVC 是对 MVC 模式的支持. Q:MVC 模式? ※ MVC 模式是种经典的软件架构,分 Model 模型.View 视图及 Controller 控制器 三种角色.架构的意图明显区分三种角色的职责,使其不相互

EventBus 3.0 源码简要分析

EvenBus 可以在不同模块间传递信息,减少接口的使用. 一.使用例子 <span style="font-size:18px;">public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.la