webapi 获取全局的上下文对象_webapi 从请求上下文获取header - CSDN
精华内容
参与话题
  • ASP.NET WEBAPI 的身份验证和授权

    千次阅读 2018-07-06 10:35:35
    定义身份验证(Authentication):确定用户是谁。授权(Authorization):确定用户能做什么...验证时,宿主会创建一个表示安全上下文的主体对象(实现 IPrincipal),将它附加到当前线程。主体对象包含一个存储用户信...

    定义

    身份验证(Authentication):确定用户是谁。

    授权(Authorization):确定用户能做什么,不能做什么。

    身份验证

    WebApi 假定身份验证发生在宿主程序称中。对于 web-hosting,宿主是 IIS。这种情况下使用 HTTP Module 进行验证。

    验证时,宿主会创建一个表示安全上下文的主体对象(实现 IPrincipal),将它附加到当前线程。主体对象包含一个存储用户信息的 Identity 对象。若验证成功,Identity.IsAuthenticated 属性将返回 true。

    HTTP 消息处理程序(HTTP Message Handler)

    可以用 HTTP 消息处理程序代替宿主进行身份验证。这种情况下,由 HTTP 消息处理程序检查请求并设置主体对象。

    请考虑以下事项决定是否使用消息处理程序进行身份验证:

    • HTTP 模块检查所有经过 asp.net 管道的请求,消息处理程序只检查路由到 WebAPI的请求。
    • 可以为每个路由单独设置消息处理程序。
    • HTTP 模块仅在 IIS 中可用。消息处理程序则与宿主无关,在 web-hosting 和 self-hosting 中均可用。
    • HTTP 模块参与IIS 日志和审计等功能。
    • HTTP模块在管道之前运行,主体在消息处理程序运行之前不会设置,当响应离开 消息处理程序时,主体会恢复成原来的那个。

    一般来说,不需要自承载时,HTTP 模块较好。

    设置主体

    进行自定义身份验证时,应在两个地方设置主体对象:

    • Thread.CurrentPrincipal,这是 .net 中设置线程主体的标准方式。
    • HttpContext.Current.User 这是特定于 ASP.NET 的属性。
    复制代码
    private void SetPrincipal(IPrincipal principal)
    {
        Thread.CurrentPrincipal = principal;
        if (HttpContext.Current != null)
        {
            HttpContext.Current.User = principal;
        }
    }
    复制代码

    采用 web-hosting 时,必须同时设置两处,避免安全上下文不一致。对于 self-hosting,HttpContext.Current 为 null,所以设置之前应进行检查。

    授权

    授权发生在管道中更接近 controller 的位置。

    • 授权筛选器(Authorization filter)在 action 之前运行。若请求未授权,返回错误,action 不运行。
    • 在 action 内部,可以用 ApiController.User 属性获取主体对象,做进一步的控制。

    [Authorize] 属性

    AuthorizeAttribute 是内置的授权筛选器。用户未通过身份验证时,它返回 HTTP 401 状态码。可以在全局,控制和 action 三个级别应用它。

    在全局级别应用

    public static void Register(HttpConfiguration config)
    {
        config.Filters.Add(new AuthorizeAttribute());
    }

    在控制器级别应用

    复制代码
    [Authorize]
    public class ValuesController : ApiController
    {
        public HttpResponseMessage Get(int id) { ... }
        public HttpResponseMessage Post() { ... }
    }
    复制代码

    在 Action 级别应用

    复制代码
    public class ValuesController : ApiController
    {
        public HttpResponseMessage Get() { ... }
            [Authorize]
        public HttpResponseMessage Post() { ... }
    }
    复制代码

    在控制器上应用 [Authorize] 时,可以在 Action 上应用 [AllowAnonymous] 取消对某个 Action 的授权要求。上面的代码可以改成下面的形式:

    复制代码
    [Authorize]
    public class ValuesController : ApiController
    {
        [AllowAnonymous]
        public HttpResponseMessage Get() { ... }
    
        public HttpResponseMessage Post() { ... }
    }
    复制代码

    指定用户和角色进行限制:

    复制代码
    // 按用户限制访问
    [Authorize(Users="Alice,Bob")]
    public class ValuesController : ApiController
    {
    }
       
    // 按角色限制访问
    [Authorize(Roles="Administrators")]
    public class ValuesController : ApiController
    {
    }
    复制代码

    用于 WebAPI 的 AuthorizeAttribute 位于 System.Web.Http 命名空间。在 System.Web.Mvc 命名空间中有一个同名属性,不可用于 WebAPI。

    自定义授权筛选器

    可从以下类型派生自定义授权筛选器

    • AuthorizeAttribute,基于用户和角色进行授权。
    • AuthorizationFilterAttribute,不基于用户和角色的同步授权。
    • IAuthorizationFilter,实现此接口执行异步授权逻辑。例如,授权逻辑中有对 IO 或网络的异步调用。(CPU-bound的授权逻辑更适合从 AuthorizationFilterAttribute 派生,这样不必写异步方法)。

    下图是 AuthorizeAttribute 类层次

    在 Action 中执行验证

    可在控制器中检查 ApiController.User 属性,根据用户和角色使用不同的逻辑。

    复制代码
    public HttpResponseMessage Get()
    {
        if (User.IsInRole("Administrators"))
        {
            // ...    }
    }
    复制代码

     

    展开全文
  • ServletContext作用功能详解

    万次阅读 多人点赞 2009-10-13 17:01:00
    ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个。所以,为了节省空间,提高...

    ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个。所以,为了节省空间,提高效率,ServletContext中,要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。

    换一种方式说吧,运行在JAVA虚拟机中的每一个Web应用程序都有一个与之相关的Servlet上下文。ServletContext对象是Web服务器中的一个已知路径的根,Servlet上下文被定位于http://localhost:8080/项目名.以 /项目名 请求路径(称为上下文路径)开始的所有请求被发送到与此ServletContext关联的Web应用程序。一个ServletContext对象表示了一个Web应用程序的上下文。

    Servlet上下文:Servlet上下文提供对应用程序中所有Servlet所共有的各种资源和功能的访问。Servlet上下文API用于设置应用程序中所有Servlet共有的信息。Servlet可能需要共享他们之间的共有信息。运行于同一服务器的Servlet有时会共享资源,如JSP页面、文件和其他Servlet。

    举例:

    如,做一个购物类的网站,要从数据库中提取物品信息,如果用session保存这些物品信息,每个用户都访问一便数据库,效率就太低了;所以要用来Servlet上下文来保存,在服务器开始时,就访问数据库,将物品信息存入Servlet上下文中,这样,每个用户只用从上下文中读入物品信息就行了。

     

    3.1 ServletContext接口简介

    ServletContext接口定义了运行servlet的web应用的servlet视图。容器供应商负责提供servlet容器内ServletContext接口的实现。使用ServletContext对象,servlet可以记录事件日志,获取资源的URL地址,并且设置和保存上下文内可以访问的其他servlet的属性。

    ServletContext以web的已知路径为根路径。比如,假定一个servlet上下文位于http://www.mycorp.com/catalog。以/catalog请求路径开头的所有请求,已知为上下文路径,被路由到和该ServletContext关联的web应用。

    3.2 ServletContext接口作用域

    容器中部署的每一个web应用都有一个ServletContext接口的实例对象与之关联。如果容器被分布在多个虚拟机上,一个web应用将在每一个VM中有一个ServletContext实例。

    不作为web应用一部分部署的容器中的servlet默认是“默认”web应用的一部分,有一个默认的ServletContext。在分布式容器中。默认ServletContext是非分布式的,并且必须只存在于一个VM中。

    3.3 初始化参数

    ServletContext接口的初始化参数允许servlet访问与web应用相关的上下文初始化参数,这些由应用开发人员在部署描述符中指定:

    getInitParameter

    getInitParameterNames

    应用开发人员利用初始化参数传送配置信息。典型的例子是web管理员的e-mail地址或者一个持有关键数据的系统名称。

    3.4 上下文属性

    servlet可以通过名称将对象属性绑定到上下文。任何绑定到上下文的属性可以被同一个web应用的其他servlet使用。ServletContext接口的下列方法允许访问这种功能:

    setAttribute

    getAttribute

    getAttributeNames

    removeAttribute

    3.4.1 分布式容器中的上下文属性

    上下文属性对于创建它们的VM来说是本地的。这防止ServletContext属性存储于分布式容器的共享内存中。当信息需要在运行于分布式环境中的servlet之间共享时,信息被放入会话中(参见第7章“会话”),存储于数据库中,或者存储于EJB组件中。

    3.5 资源

    ServletContext接口通过下列方法提供对web应用组成的静态内容文档层级的直接访问,包括HTML,GIF和JPEG文件:

    getResource

    getResourceAsStream

    getResource和getResourceAsStream方法以“/”开头的字符串为参数,它指定上下文根路径的资源相对路径。文档的层级可能存在于服务器的文件系统,war文件,远程服务器或者在一些其它位置中。

    这些方法不用来获取动态内容。比如,在一个支持JSP规范1的容器中,getResource("/index.jsp")这种形式的方法调用将返回JSP源代码,而不是处理后的输出。关于访问动态内容的更多信息参见第8章“转发请求”。

    Web应用资源的完整列表可以使用getResourcePaths(String path)方法访问。该方法语义的完整信息可以在本规范的API文档中找到。

    3.6 多个主机和ServletContext

    Web服务器可能支持一个服务器上多个逻辑主机共享一个IP地址。这功能有时被称为“虚拟主机”。这种情况下,每一个逻辑主机必须有它自己的servlet上下文或者servlet上下文组。Servlet上下文不可以被多个虚拟主机共享。

    3.7 重载考虑

    尽管容器供应商因为对于易于开发而实现的类加载不做要求,但是任何那样的实现必须确保所有它们可能使用2的所有servlet和类,被加载在单个类加载器作用域内。必须保证应用应该如开发人员预想的那样运转。作为开发辅助,绑定监听器的会话通知的完整语义应当由容器支持,在类加载上会话终止的监听上使用。

    上一代的容器创建新的类加载器以加载servlet,这和用来加载servlet上下文中使用的其他servlet或者类的类加载器不同。这可能造成servlet上下文内的对象引用指向一个意想不到的类或对象,造成意想不到的行为。需要阻止由新一代类加载器所引发的问题。

    3.7.1 临时工作目录

    每一个servlet上下文都需要一个临时存储目录。Servlet容器必须为每一个servlet上下文提供一个私有的临时目录,并且使它可以通过javax.servlet.context.tempdir上下文属性可用。这些属性关联的对象必须是java.io.File类型。

    这项需求认可了很多servlet引擎实现中提供的常见便利。容器不需要在servlet重启时维持临时目录的内容,但是需要确保一个servlet上下文的临时目录的内容对于该servlet容器上运行的其他web应用的servlet上下文不可见。

    展开全文
  • Java ServletContext 详解

    万次阅读 2010-01-19 22:44:00
    ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个。所以,为了节省空间,提高...

    ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个。所以,为了节省空间,提高效率,ServletContext中,要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。

    换一种方式说吧,运行在JAVA虚拟机中的每一个Web应用程序都有一个与之相关的Servlet上下文。ServletContext对象是Web服务器中的一个已知路径的根,Servlet上下文被定位于http://localhost:8080/项目名. 以 /项目名 请求路径(称为上下文路径)开始的所有请求被发送到与此ServletContext关联的Web应用程序。一个ServletContext对象表示了一个Web应用程序的上下文。

    Servlet上下文:Servlet上下文提供对应用程序中所有Servlet所共有的各种资源和功能的访问。Servlet上下文API用于设置应用程序中所有Servlet共有的信息。Servlet可能需要共享他们之间的共有信息。运行于同一服务器的Servlet有时会共享资源,如JSP页面、文件和其他Servlet。

    举例:

    如,做一个购物类的网站,要从数据库中提取物品信息,如果用session保存这些物品信息,每个用户都访问一便数据库,效率就太低了;所以要用来Servlet上下文来保存,在服务器开始时,就访问数据库,将物品信息存入Servlet上下文中,这样,每个用户只用从上下文中读入物品信息就行了。

     

    3.1 ServletContext接口简介

    ServletContext接口定义了运行servlet的web应用的servlet视图。容器供应商负责提供servlet容器内ServletContext接口的实现。使用ServletContext对象,servlet可以记录事件日志,获取资源的URL地址,并且设置和保存上下文内可以访问的其他servlet的属性。

    ServletContext以web的已知路径为根路径。比如,假定一个servlet上下文位于http://www.mycorp.com/catalog。以/catalog请求路径开头的所有请求,已知为上下文路径,被路由到和该ServletContext关联的web应用。

    3.2 ServletContext接口作用域

    容器中部署的每一个web应用都有一个ServletContext接口的实例对象与之关联。如果容器被分布在多个虚拟机上,一个web应用将在每一个VM中有一个ServletContext实例。

    不作为web应用一部分部署的容器中的servlet默认是“默认”web应用的一部分,有一个默认的ServletContext。在分布式容器中。默认ServletContext是非分布式的,并且必须只存在于一个VM中。

    3.3 初始化参数

    ServletContext接口的初始化参数允许servlet访问与web应用相关的上下文初始化参数,这些由应用开发人员在部署描述符中指定:

    getInitParameter

    getInitParameterNames

    应用开发人员利用初始化参数传送配置信息。典型的例子是web管理员的e-mail地址或者一个持有关键数据的系统名称。

    3.4 上下文属性

    servlet可以通过名称将对象属性绑定到上下文。任何绑定到上下文的属性可以被同一个web应用的其他servlet使用。ServletContext接口的下列方法允许访问这种功能:

    setAttribute

    getAttribute

    getAttributeNames

    removeAttribute

    3.4.1 分布式容器中的上下文属性

    上下文属性对于创建它们的VM来说是本地的。这防止ServletContext属性存储于分布式容器的共享内存中。当信息需要在运行于分布式环境中的servlet之间共享时,信息被放入会话中(参见第7章“会话”),存储于数据库中,或者存储于EJB组件中。

    3.5 资源

    ServletContext接口通过下列方法提供对web应用组成的静态内容文档层级的直接访问,包括HTML,GIF和JPEG文件:

    getResource

    getResourceAsStream

    getResource和getResourceAsStream方法以“/”开头的字符串为参数,它指定上下文根路径的资源相对路径。文档的层级可能存在于服务器的文件系统,war文件,远程服务器或者在一些其它位置中。

    这些方法不用来获取动态内容。比如,在一个支持JSP规范1的容器中,getResource("/index.jsp")这种形式的方法调用将返回JSP源代码,而不是处理后的输出。关于访问动态内容的更多信息参见第8章“转发请求”。

    Web应用资源的完整列表可以使用getResourcePaths(String path)方法访问。该方法语义的完整信息可以在本规范的API文档中找到。

    3.6 多个主机和ServletContext

    Web服务器可能支持一个服务器上多个逻辑主机共享一个IP地址。这功能有时被称为“虚拟主机”。这种情况下,每一个逻辑主机必须有它自己的servlet上下文或者servlet上下文组。Servlet上下文不可以被多个虚拟主机共享。

    3.7 重载考虑

    尽管容器供应商因为对于易于开发而实现的类加载不做要求,但是任何那样的实现必须确保所有它们可能使用2的所有servlet和类,被加载在单个类加载器作用域内。必须保证应用应该如开发人员预想的那样运转。作为开发辅助,绑定监听器的会话通知的完整语义应当由容器支持,在类加载上会话终止的监听上使用。

    上一代的容器创建新的类加载器以加载servlet,这和用来加载servlet上下文中使用的其他servlet或者类的类加载器不同。这可能造成servlet上下文内的对象引用指向一个意想不到的类或对象,造成意想不到的行为。需要阻止由新一代类加载器所引发的问题。

    3.7.1 临时工作目录

    每一个servlet上下文都需要一个临时存储目录。Servlet容器必须为每一个servlet上下文提供一个私有的临时目录,并且使它可以通过javax.servlet.context.tempdir上下文属性可用。这些属性关联的对象必须是java.io.File类型。

    这项需求认可了很多servlet引擎实现中提供的常见便利。容器不需要在servlet重启时维持临时目录的内容,但是需要确保一个servlet上下文的临时目录的内容对于该servlet容器上运行的其他web应用的servlet上下文不可见

    展开全文
  • Web Api使用VS实现自动化测试

    万次阅读 2016-07-28 11:22:55
    期间也找了不少的测试工具,针对于Web Api比较简单的有PostMan或者嵌入项目中的Web Api Test Client甚至于 Fiddler,但这些都不足以进行连续的测试。一些老牌的测试工具,如loadrunner、QTP等又过于臃肿,且重点在于...

    进入到项目开发的后期,测试变得尤为重要。模拟用户使用场景,根据测试用例建立自动化测试就成为了下一个开发目标。
    期间也找了不少的测试工具,针对于Web Api比较简单的有PostMan或者嵌入项目中的Web Api Test Client甚至于 Fiddler,但这些都不足以进行连续的测试。一些老牌的测试工具,如loadrunner、QTP等又过于臃肿,且重点在于网站测试,快速掌握又只能以录制为主。既然使用visual studio开发的web api,那么使用visual studio自带的测试项目不是能够更好的融合吗,而且有了编程基础,自动化测试会做得更好。
    其实微软提供了丰富的测试框架,从单元测试到顺序测试、性能测试和压力测试,之前之所以排斥不用,还是因为先入为主觉得太复杂,既然单元测试能够满足需求,就没必要再深入研究。
    如果测试人员局限于于写测试用例,UI功能测试,那基本上测试生涯也就止步不前。如果测试人员开始着手敲敲代码,就会发现原来测试领域也有很大的一片天地。
    以下项目主要实现了对api的自动化测试和压力测试,涉及到参数化、提取规则和验证规则。
    微软提供的测试api:http://northwindapi.cloudapp.net
    1、建立项目
    这里写图片描述
    2、新建web性能测试
    这里写图片描述
    3、项目进行配置,停止录制

    • 添加web服务请求;
    • 添加上下文参数,上下文参数类似于公共变量,可以在所有测试中使用,而在测试中,如果要使用到上下文参数,使用{{参数名}}即可。上下文参数对应的代码为e.WebTest.Context,接下来作动态参数时会讲到;
    • 添加验证规则,此处添加的验证规则是全局的验证规则,比如访问时间不能超过5s等
    • 添加自定义的web测试插件,web测试插件可以修改全局的访问地址、参数、变量等
      这里写图片描述

    4、配置请求并测试
    4.1、添加上下文参数
    Host= http://northwindapi.cloudapp.net
    ParaId=0
    4.2、修改web请求Url:{{Host}}/api/Seminars,请求修改为Get
    这里写图片描述
    运行测试,查看结果
    这里写图片描述
    5、请求参数的修改
    方法1:添加QueryString
    这里写图片描述
    测试结果,将只返回SeminarId为1的数据
    这里写图片描述
    方法2:使用全局上下文参数
    这里写图片描述
    方法3:添加WebTestRequestPlugin,使用代码改变请求参数,使用Plugin改变参数可以实现参数的计算

     public class QSPlugin : WebTestRequestPlugin
        {
            public override void PostRequest(object sender, PostRequestEventArgs e)
            {
            }
    
            public override void PreRequest(object sender, PreRequestEventArgs e)
            {
                // 在QueryString中加入参数
                e.Request.QueryStringParameters.Add("id", "1");
            }
        }

    添加请求插件,选择QSPlugin
    这里写图片描述
    方法4:添加WebTestPlugin,建立ContextPlugin,全局插件用于对于所有请求的公共参数如sign,timespan,appkey等的情况。
    添加全局插件
    这里写图片描述
    这里写图片描述
    这里写图片描述

    [Description("全局")]
        public class ContextPlugin : WebTestPlugin
        {
            private bool m_parseDependents = true;
    
            public override void PreWebTest(object sender, PreWebTestEventArgs e)
            {
                // TODO: Add code to execute before the test.
            }
    
            public override void PostWebTest(object sender, PostWebTestEventArgs e)
            {
                // TODO: Add code to execute after the test.
            }
    
            public override void PreRequest(object sender, PreRequestEventArgs e)
            {
                // e.Request.Url = e.Request.Url + "/growing/test/123";
                // 在QueryString中加入参数
                e.Request.QueryStringParameters.Add("id", "1");
            }
    
            // Properties for the plugin.
            [DefaultValue(true)]
            [Description("All requests will have their ParseDependentsRequests property set to this value")]
            public bool ParseDependents
            {
                get
                {
                    return m_parseDependents;
                }
                set
                {
                    m_parseDependents = value;
                }
            }
    }

    方法5:使用上一个测试的返回值作为参数,由于提取规则的实现,就可以实现完全模拟客户端访问api的情况,这也是实现自动化测试的根本。比如登录后,自动捕获UserId,方便以后的测试使用UserId。
    下面的示例流程为,首先从Seminars中获取列表,取第一个列表的SeminarId作为下一个测试的Id;
    建立自定义的JSON提取规则JsonExtractionRule.cs,根据JSON的键名提取对应的值。

    [DisplayName("Extract JSON rule")]
    
        [Description("Custom extraction rule for extracting values from JSON web response generated by web performance test")]
    
        public class JsonExtractionRule : ExtractionRule
        {
    
            public String Token { get; set; }
    
            public override void Extract(object sender, ExtractionEventArgs e)
            {
                var jsonString = e.Response.BodyString;
                var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<JObject>>(jsonString);
                var json = list.First();
                JToken jToken = null;
                if (json == null)
                {
                    e.Success = false;
                    e.Message = "Response received not in JSON format";
                }
    
                else
                {
                    jToken = json.SelectToken(Token);
                    if (jToken == null)
                    {
                        e.Success = false;
                        e.Message = String.Format("{0} : Not found", Token);
                    }
    
                    else
                    {
                        e.Success = true;
                        e.WebTest.Context.Add(this.ContextParameterName, jToken);
                    }
                }
            }
        }
    }

    这里写图片描述
    这里写图片描述
    在第二个测试中,使用定义到的“DynamicId”值作为参数
    这里写图片描述

    6、自定义验证规则的实现
    新建自定义验证规则ValidateRules;
    我们验证返回的数组数量为4则为通过;

     [DisplayName("Result count validation rule")]
    
        [Description("This rule checks to see the REST API returns number of items requested")]
    
        public class ValidateResultCode : ValidationRule
        {
            public override void Validate(object sender, ValidationEventArgs e)
            {
    
                var jsonString = e.Response.BodyString;
                var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<JObject>>(jsonString);
    
    
                if (list.Count == 3)
                {
                    e.IsValid = true;
                }
    
                else
                {
                    e.IsValid = false;
                }
            }
        }

    这里写图片描述
    运行测试,结果如下
    这里写图片描述

    7、根据webtest建立负载测试
    这里写图片描述
    这里写图片描述
    具体参数没有深入研究,选择以上建立的测试,完成,并运行负载测试
    这里写图片描述
    这里写图片描述

    8、参考网站
    http://developer.51cto.com/art/201006/206971_all.htm
    http://www.thisdevmind.com/2014/12/27/using-visual-studio-web-test-for-automating-api-testing/
    http://www.cnblogs.com/Binhua-Liu/archive/2012/08/30/2663078.html
    https://msdn.microsoft.com/en-us/library/bb514192.aspx
    https://blogs.msdn.microsoft.com/densto/2007/03/19/dynamic-querystring-correlation-custom-extraction-rules-and-webtest-plug-in/
    http://magustest.com/blog/automationtesting/adding-web-test-verifaction-rule/#more-516
    以下为本次示例代码:
    http://download.csdn.net/detail/wuwo333/9588351

    展开全文
  • 上下文对象

    千次阅读 2018-01-28 20:14:14
    一、上下文概念: 每一个Web Project,运行时都部署在Tomcat下,称为一个应用。...1.上下文对象类似一个全局变量,在整个应用中有效。 2.利用上下文对象,可以实现多个用户间的数据共享。 Servle
  • $getConfig()获取当前全局环境变量和配置信息。Returns: config (object): 配置对象; bundleUrl (string): bundle 的 url; debug (boolean): 是否是调试模式; env (object): 环境对象; weexVersion (string): ...
  • ServletContext 与application的异同

    千次阅读 2016-08-28 13:55:49
    servletContext接口是Servlet中最大的一个接口,呈现了web应用的Servlet视图。ServletContext实例是通过 getServletContext()方法获得的,由于HttpServlet继承Servlet的关系GenericServlet类和HttpServlet类同时具有...
  • JavaScript引擎研究与C、C++与互调用

    万次阅读 2013-07-10 16:02:04
    C、C++与JavaScript的互调用 1. 概要 JavaScript是一种广泛用于Web...由于JavaScript提供了丰富的内置函数、良好的对象机制。所以JavaScript还可以嵌入到某一种宿主语言中,弥补宿主语言的表现力,从而实现快速
  • ServletContext理解学习

    千次阅读 2018-10-18 17:09:13
    1.ServletContext原理 ...时为*每个WEB应用创建对应的对象ServletContext*,**一个WEB应用对应一个 ServletContext.**每个ServletContext中都有一个很大的MAP,并且tomcat在启动之初就向 这个MAP中放入了大...
  • 解释一:  要想很好理解这三个上下文的关系,需要先熟悉spring是怎样在web容器中启动...首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局上下文环境,这个上下文就是ServletContext,其为后
  • 先看一下官方的基本介绍,短短几句就塞满了关键字。 SquirrelFish,正式名称是JavaScriptCore,包括register-based(基于寄存器的虚拟机), direct-threaded, high-level bytecode engine(字节码引擎)....
  • Servlet规范总结

    万次阅读 2016-10-08 10:34:31
    Servlet规范的核心接口即是Servlet接口,它是所有Servlet类必须实现的接口,在Java Servelt API中已经提供了两个抽象类方便开发者实现Servlet类,分别是GenericServlet 和 HttpServlet,GenericServlet定义了一个...
  • getServletContext()方法详解

    千次阅读 2017-09-12 19:16:25
    javax.servlet.ServletContext接口 一个servlet上下文是servlet引擎提供用来服务于Web应用的...一个servlet可以通过ServletConfig对象的getServletContext()方法得到servlet上下文的引用,如果servlet直接或间接
  • 理解WebKit和Chromium: Canvas2D及其实现

    万次阅读 2012-12-23 21:22:52
    转载请注明原文地址:... # Canvas 2D及其在WebKit和Chromium中的实现 ## 概述 ...开发者可以用JavaScript脚本在该元素绘制任意图形(2D或者3D)。Canvas元素有两个属性“width”和“heigh
  • WebApi路由机制详解——看完不会用你打我

    万次阅读 多人点赞 2020-10-11 17:15:02
    随着前后端分离的大热,WebApi在项目中的作用也是越来越重要,由于公司的原因我之前一直没有机会参与前后端分离的项目,但WebApi还是要学的呀,因为这东西确实很有用,可单独部署、与前端和App交互都很方便,既然有...
  • 官方最新《Red5 用户参考手册》全套下载地址  前言  本文档介绍了如何将 Red5 作为一个应用程序存档(WAR)部署到 Tomcat。标准的 Red5 的部署由一个独立的 Java 程序组成,这个 Java 程序嵌入了一个可以作为一个...
  • Servlet容器与Web容器

    千次阅读 多人点赞 2017-02-04 15:03:21
    Servlet规范定义了一个API标准,这一标准的实现通常称为Servlet容器,比如开源的Tomcat、JBoss。web容器更准确的说应该叫web服务器,它是来管理和部署 web应用的。还有一种服务器叫做应用服务器,它的功能比web...
  • Spring详解(概述、组件详解、加载流程)

    万次阅读 多人点赞 2018-03-31 00:29:14
    1.Spring是什么?Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您 选择使用哪一个组件,同时...即将创建及管理对象的权利交给Spring容器。Spr...
  • webworker-threads时Web Worker规范在Node.js的实现。这个模块是基于node-threads-a-gogo模块(简称TAGG)做的,可以让Node.js实现多线程编程,充分使用服务器的资源。
1 2 3 4 5 ... 20
收藏数 33,084
精华内容 13,233
关键字:

webapi 获取全局的上下文对象