为了账号安全,请及时绑定邮箱和手机立即绑定

servlet过滤器问题

servlet过滤器问题

慕斯王 2019-02-27 17:39:20
请问 servlet过滤器 是每次有请求 都要被tomcat new一个实例的吗亦或是全局共享的?
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

在Servlet规范中,对于Servlet单例与多例定义如下:

“Deployment Descriptor”, controls how the servlet container provides instances of the servlet.For a servlet not hosted in a distributed environment (the default), the servlet container must use only one instance per servlet declaration. However, for a servlet implementing the SingleThreadModel interface, the servlet container may instantiate multiple instances to handle a heavy request load and serialize requests to a particular instance.

上面规范提到,
如果一个Servlet没有被部署在分布式的环境中,一般web.xml中声明的一个Servlet只对应一个实例。

而如果一个Servlet实现了SingleThreadModel接口,就会被初始化多个实例。实例有多少呢,这里没细说。

那一个实现了SingleThreadModel接口的Servlet,一般会初始化多少个实例呢?
StandardWrapper类中有两个属性,其中maxInstance初始为20。所以上面的问题就有了答案。

/**
 * Does this servlet implement the SingleThreadModel interface?
 */
protected volatile boolean singleThreadModel = false;
/**
 * Maximum number of STM instances.
 */

protected int maxInstances = 20;

由于SingleThreadModel已经声明为废弃,官方不建议使用。我们这里只是让大家了解下。

总结下,一个Servlet究竟有几个实例呢?受如下几个原因影响:
是否在分布式环境中部署
是否实现SingleThreadModel,如果实现则最多会创建20个实例
在web.xml中声明了几次,即使同一个Servlet,如果声明多次,也会生成多个实例。

查看完整回答
反对 回复 2019-03-01
?
忽然笑

TA贡献1806条经验 获得超5个赞

每次请求都会创建一个servlet实例和filter实例:
两者的生命周期如下:

filter:init()---启动服务
servlet:init()
filter:service()---请求
servlet:service()
servlet:destroy() 
filter:destroy()---关闭服务
查看完整回答
反对 回复 2019-03-01
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

只有第一次请求这个Servlet的时候才会创建这个Servlet对象,之后每次对这个Servlet的请求都是用的之前创建好的Servlet,不会重新创建

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 515 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信