`

tomcat中url匹配context的代码片

 
阅读更多
/**
     * Map the specified URI.
     */
    private final void internalMap(CharChunk host, CharChunk uri,
                                   MappingData mappingData)
        throws Exception {

        uri.setLimit(-1);

        Context[] contexts = null;
        Context context = null;
        int nesting = 0;

        // Virtual host mapping
        if (mappingData.host == null) {
            Host[] hosts = this.hosts;
            int pos = findIgnoreCase(hosts, host);
            if ((pos != -1) && (host.equalsIgnoreCase(hosts[pos].name))) {
                mappingData.host = hosts[pos].object;
                contexts = hosts[pos].contextList.contexts;
                nesting = hosts[pos].contextList.nesting;
            } else {
                if (defaultHostName == null) {
                    return;
                }
                pos = find(hosts, defaultHostName);
                if ((pos != -1) && (defaultHostName.equals(hosts[pos].name))) {
                    mappingData.host = hosts[pos].object;
                    contexts = hosts[pos].contextList.contexts;
                    nesting = hosts[pos].contextList.nesting;
                } else {
                    return;
                }
            }
        }

        // Context mapping
        if (mappingData.context == null) {
            int pos = find(contexts, uri);//L1
            if (pos == -1) {
                return;
            }

            int lastSlash = -1;
            int uriEnd = uri.getEnd();
            int length = -1;
            boolean found = false;
            while (pos >= 0) {
                if (uri.startsWith(contexts[pos].name)) {
                    length = contexts[pos].name.length();
                    if (uri.getLength() == length) {
                        found = true;
                        break;
                    } else if (uri.startsWithIgnoreCase("/", length)) {
                        found = true;
                        break;
                    }
                }
                if (lastSlash == -1) {
                    lastSlash = nthSlash(uri, nesting + 1);
                } else {
                    lastSlash = lastSlash(uri);
                }
                uri.setEnd(lastSlash);
                pos = find(contexts, uri);
            }
            uri.setEnd(uriEnd);

            if (!found) {//L4
                if (contexts[0].name.equals("")) {
                    context = contexts[0];
                }
            } else {
                context = contexts[pos];
            }
            if (context != null) {
                mappingData.context = context.object;
                mappingData.contextPath.setString(context.name);
            }
        }

        // Wrapper mapping
        if ((context != null) && (mappingData.wrapper == null)) {
            internalMapWrapper(context, uri, mappingData);
        }

    }

代码位置:org.apache.tomcat.util.http.mapper.Mapper;

先是根据目标host拿到该host下拥有的所有的context(我们比较关心的ServletContext对象则存放在context中),接下来的过程便是根据internalMap参数二uri(本次Http请求的uri,如http://192.168.1.101:8080/test/a.htm,则uri是"/test/a.htm")去匹配到哪个context(context.name为各web项目的根目录名,此时的匹配目标便是context.name);

L1行方法:

/**
     * Find a map elemnt given its name in a sorted array of map elements.
     * This will return the index for the closest inferior or equal item in the
     * given array.
     */
    private static final int find(MapElement[] map, CharChunk name) {
        return find(map, name, name.getStart(), name.getEnd());//L2
    }

其中参数一map为上文L1行的contexts ,参数二name为L2行的uri

L2行代码:

/**
     * Find a map elemnt given its name in a sorted array of map elements.
     * This will return the index for the closest inferior or equal item in the
     * given array.
     */
    private static final int find(MapElement[] map, CharChunk name,
                                  int start, int end) {

        int a = 0;
        int b = map.length - 1;

        // Special cases: -1 and 0
        if (b == -1) {
            return -1;
        }
        
        if (compare(name, start, end, map[0].name) < 0 ) {
            return -1;
        }         
        if (b == 0) {
            return 0;
        }

        int i = 0;
        while (true) {
            i = (b + a) / 2;
            int result = compare(name, start, end, map[i].name);
            if (result == 1) {
                a = i;
            } else if (result == 0) {
                return i;
            } else {
                b = i;
            }
            if ((b - a) == 1) {
                int result2 = compare(name, start, end, map[b].name);
                if (result2 < 0) {
                    return a;
                } else {
                    return b;
                }
            }
        }

    }

 可以看到这里用了二分查找法,意味着contexts是已经排序过的了,方法返回的目标context(切确的说是可能是目标的context)在数组中索引号,当没有找到时,在L4行可以看出使用的是默认的context,也就是"/"。

分享到:
评论

相关推荐

    dbcp tomcat 配置方法 代码

    在上述代码中,我们通过`InitialContext`查找`jdbc/MyDB`对应的`DataSource`,然后调用`getConnection()`方法获取数据库连接。 **注意事项** 1. 确保Tomcat的`conf/server.xml`文件中`GlobalNamingResources`元素内...

    数据源使用代码tomcat + jsp

    本篇文章将详细介绍如何在Tomcat服务器中配置数据源,并结合JSP技术实现对MySQL数据库的操作。 #### 二、配置Tomcat中的数据源 配置Tomcat的数据源主要涉及以下几个步骤: 1. **修改`server.xml`文件** 在`...

    数据池连接Name jdbc is not bound in this Context解决方案

    这里的`res-ref-name`应与Context.xml中的`name`属性值相匹配,`res-type`表明引用的是数据源类型,`res-auth`表示由容器(即Tomcat)进行认证。 接下来,在Java代码中,可以通过Java Naming and Directory ...

    How Tomcat Work 电子书+源码

    每个Context负责管理一组Servlet,根据URL路径匹配并调用相应的Servlet进行处理。 5. **Servlet生命周期**:Tomcat会加载并实例化Servlet,调用其init()方法初始化,然后处理请求(service()方法),最后在服务器...

    Tomcat 部署ecology9

    - **8.3** 更改文件匹配规则,将`*.jsp`改为`*`,并将`resin-ln`中的`*.*`改为`*`,以适应Tomcat的URL映射规则。 8. **删除特定库文件**:在`ecoloyg/WEB-INF/lib`目录下,删除可能与Tomcat冲突的库文件,如`rt....

    gwt和tomcat整合

    标题中的“gwt和tomcat整合”指的是将Google Web Toolkit (GWT) 应用程序部署到Apache Tomcat服务器的过程。GWT是一个开源的Java框架,用于开发在浏览器上运行的富互联网应用程序(RIA),而Tomcat是一款流行的、开源...

    将tomcat5.5 admin部署到 Tomcat7.0上

    在IT行业中,Tomcat是一个广泛使用的开源Java Servlet容器,它实现了Java EE的Web部分,包括Servlet和JSP规范。在本教程中,我们将探讨如何将Tomcat 5.5的admin应用部署到Tomcat 7.0上。这是一个常见的升级过程,...

    Tomcat 9 虚拟路径配置

    &lt;Context docBase="D:\Java\apache-tomcat-9\backstage" path="/backstage/" reloadable="true" /&gt; ``` 这里的关键参数解释如下: - `docBase`:指定Web应用的物理路径。 - `path`:设置虚拟路径,即用户通过浏览器...

    Tomcat基本知识精华

    当Tomcat接收到一个HTTP请求时,会根据请求的URL查找匹配的Servlet。Servlet的生命周期包括初始化(`init()`方法)、服务(`doGet()`或`doPost()`方法)、销毁(`destroy()`方法)。Tomcat会根据需求加载和卸载...

    apache-tomcat-6.0.45-src.zip

    设置项目属性,确保编译器兼容性与Tomcat版本匹配,并配置好构建路径。 4. **学习与调试** - 通过阅读源码,开发者可以理解Tomcat如何处理HTTP请求,解析URL,管理会话,以及容器内部的线程模型等核心概念。 - ...

    tomcat-catalina-7.0.27.jar.zip

    - Host查找与URL匹配的Context。 - Context根据Servlet映射找到合适的Servlet,并创建一个Wrapper。 - Wrapper创建Servlet实例(如果尚未创建),然后调用Servlet的service方法处理请求。 3. **Catalina关键类**...

    tomcat跨域访问问题

    当Tomcat服务器返回的响应头中包含`Access-Control-Allow-Origin`字段,且其值与请求的源匹配时,浏览器才会允许跨域访问。 解决Tomcat的跨域问题有几种方法: 1. **修改web.xml配置**:在Tomcat的每个Web应用的...

    tomcat6 server.xml 详解

    这些资源可以在任何Context中被应用使用。 9. **Valves**: Valves是处理请求的中间件,可以进行权限验证、日志记录、URL重写等操作。每个容器(Server、Service、Engine、Host、Context)都可以有自己的Valve链。...

    Tomcat配置Web站点.ppt

    Tomcat遵循最长路径匹配原则处理URL请求,确保请求被正确的Context捕获。 配置虚拟主机则是为了在一个Tomcat实例上托管多个域名的应用。这涉及到修改`conf/server.xml`中的`Host`元素,每个`Host`元素代表一个域名...

    struts2和tomcat使用

    Struts2和Tomcat是Java Web开发中两个关键的组件,它们共同构成了Web应用程序的基础架构。Struts2是一个基于MVC(Model-View-Controller)设计模式的开源框架,主要用于构建企业级的Java Web应用,而Tomcat则是一个...

    Tomcat6配置JNDI出错

    在IT行业中,Tomcat是一个广泛使用的开源应用服务器,主要用于运行Java Servlet和JavaServer Pages(JSP)应用程序。在本文中,我们将深入探讨“Tomcat6配置JNDI出错”这一主题,这是一个常见的问题,很多开发者在...

    配置tomcat虚拟目录

    1. **路径问题**:确保在`server.xml`文件中指定的物理路径与实际文件系统中的路径完全一致,包括大小写也要匹配。 2. **权限问题**:检查目标目录的读写权限,确保Tomcat进程有足够的权限访问这些文件。 3. **...

    tomcat配置数据源步骤

    - 对于更复杂的配置,如C3P0或HikariCP等第三方连接池,需要在Tomcat的`conf/context.xml`中配置`&lt;Resource&gt;`标签,并在Web应用的`WEB-INF/web.xml`中声明数据源。第三方连接池提供了更多的性能调优选项,如最小...

    tomcat布署地图服务

    - 由于Linux系统对文件路径的大小写敏感性,需要在`ArcGISCacheExtent.js`文件中对路径进行相应调整,以避免因路径不匹配而导致的问题。 3. **Tomcat应用部署** - 进入Tomcat的配置目录`apache-tomcat-8.5.39/...

    apache-tomcat-8.5.34.rar

    例如,将`&lt; Context&gt;`标签内的管理员凭据设置为"admin/admin",以便在启动Tomcat时能够正确识别和处理CAS的验证请求。 启动Tomcat服务器时,通常会使用`startup.bat`脚本,这个脚本位于`bin`目录下。运行此脚本会...

Global site tag (gtag.js) - Google Analytics