`

关于filter

阅读更多
struts2的实现核心是filter,本文简要描述filter相关的一些问题

一般应用中如果用到了struts2,则会配置一系列action,不会配置<servlet>和<servlet-mapping>,但是struts2依然会匹配到正确的Action

奥秘在于struts2用一个filter过滤了所有匹配的请求(一般是*.action)

在这个filter中,struts2根据请求的URL,截取出actionName,在自己的配置文件中进行匹配,然后转发到合适的Action类进行处理

关键在于,在这个filter里,没有依照常规,调用filterChain.doFilter()方法。也就是说,在struts2 filter后面的filter,以及servlet容器默认的filter,都没有执行的机会

下面贴一个简单的例子:
@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		System.out.println("hehe");
	}

如果配置了这个filter,然后访问任何url,都只会在控制台打出hehe,然后显示空白页面





然后在这段代码中,允许后面的filter执行
@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		System.out.println("hehe");
		arg2.doFilter(arg0, arg1);
	}

这时候控制台还是会打出hehe,但是同时tomcat也会返回404页面



因为tomcat自己是实现了一个Filter实现类,根据请求的URL,去匹配合适的servlet

在tomcat初始化的时候,会读取web.xml中的filter配置,或者扫描@WebFilter的类,得到所有的自定义Filter,再加上自己的默认filter,组成filter chain

而在struts2 filter的实现中,则没有给后面的filter执行的机会,也因此避免了servlet容器去扫描servlet,避免了扫描不到的错误

这是struts2利用filter实现的一个巧妙之处,但是也是带来了一个副作用。即如果同时使用了struts2框架,以及其他用到filter的组件(比如CAS SSO),必须将struts2的配置放在最后,否则所有的后续filter,都没有执行的机会

另外,我们可以发现,filter是所有http请求的第一关,如果在这里发生阻塞,则会瞬间秒杀整个应用
@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {

		System.out.println("hehe");

		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

然后我用浏览器,同时开2个TAB页发起HTTP请求,控制台会打出2个hehe



然后故意将filter中的代码改成阻塞的
@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {

		synchronized (this) {

			System.out.println("hehe");

			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

同样开2个窗口访问,这次只能打出一个hehe,即只有一个请求能够得到响应,其他的请求全部阻塞



当然,在struts2中,肯定不会犯这样的低级错误。struts2 filter中的代码,都是非阻塞的,当调用action时,也是以异步执行的方式处理,避免阻塞并发请求

但是这个现象提示我们,对于全局的filter,是所有请求的入口,在其中一定不能执行耗时过长的阻塞方法,否则对应用的并发性是毁灭性打击。由于自定义filter的场景是非常常见的,所以必须加以注意
  • 大小: 6.2 KB
  • 大小: 18.5 KB
  • 大小: 23.6 KB
  • 大小: 6.5 KB
  • 大小: 6.9 KB
分享到:
评论

相关推荐

    关于filter在统一身份认证中的应用

    关于filter在统一身份认证中的应用,它是一种在Web应用程序中执行预处理和后处理请求的重要机制。Filter在服务器端扮演着中间件的角色,允许开发者在请求到达目标资源之前和响应返回给客户端之后对其进行拦截和处理...

    Filter简介和工作原理

    `FilterConfig`对象提供了关于Filter的配置信息,包括获取Servlet上下文(`ServletContext`)和初始化参数。如果在此方法中抛出`ServletException`,则表示Filter无法正常工作。 2. `destroy()`:在Servlet容器关闭...

    简单的directshwo filter实例代码

    DirectShow是微软开发的一个多媒体框架,用于处理视频和音频流。这个框架允许开发者创建复杂的媒体管道,用于播放、...对于高级功能,比如滤镜效果、流媒体支持等,你还需要学习更多关于Filter Graph的高级概念和技术。

    Filter知识点整理文档

    **Filter知识点整理** 在Java Web开发中,Filter(过滤器)是不可或缺的一部分,它提供了一种在请求被Servlet处理之前和之后进行拦截处理的方式。Filter主要用于数据预处理、权限控制、日志记录等方面,极大地提高...

    Filter帮助文件

    以下是关于Filter、jsp以及帮助文档的相关知识点的详细说明: 1. **Filter简介**: Filter在Java Web应用中扮演着中间件的角色,它允许开发者在HTTP请求到达Servlet之前或Servlet处理完请求之后进行拦截。开发者...

    Filter过滤器文档

    FilterConfig对象提供了关于Filter配置和运行环境的信息,例如通过`filterConfig.getInitParameter(name)`获取初始化参数。开发者可以在此方法中完成一些全局的设置,如获取ServletContext对象。 2. `destroy()`: ...

    filter学习资料

    描述中提到的"包括网站代码,有完整的注释,可在eclipse上面运行,便于新手理解",意味着这个压缩包可能包含了一系列关于Filter的实际应用示例,这些代码可以在Eclipse这样的集成开发环境中直接运行,对于初学者来说...

    Filter应用程序

    文件名称"Fileter"可能是指示了一个关于Filter的实例代码或者是一个包含多个Filter实现的项目。对于这样的压缩包,开发者通常会期望找到具体的Filter实现,包括配置文件(如web.xml)中的Filter声明,以及相应的...

    关于web.xml配置文件servlet,filter,listener加载顺序

    关于filter、servlet在web.xml配置及加载顺序

    filter相关资料

    ### Filter在Java Web开发中的应用 #### 一、Filter简介 在Java Web应用程序中,`Filter`是一种可以对...以上就是关于Filter以及在Tomcat中配置Filter的相关知识点介绍,希望能够帮助读者更好地理解和使用这些技术。

    filter_solutions.rar

    资源内有关于filter_solutions软件操作的使用教程,以几个滤波器为例子说明软件的使用方法,以及滤波器设计的参数和滤波器的性能参数、响应曲线等。filter solutions功能非常强大,不仅可以根据输入参数设计模拟...

    java中filter的用法(过滤器)

    ### Java中的Filter(过滤器)使用详解 ...以上就是关于Java中Filter(过滤器)的一些基本概念和具体实现方式的详细介绍。通过合理的使用Filter,开发者可以轻松地实现许多强大的功能,提高应用程序的安全性和性能。

    RF filter.rar_RF CBF filter_rf_Filter_rffilter_射频滤波器_滤波器 参数

    像“ch05”这样的章节可能包含关于滤波器设计流程的详细步骤,包括如何选择合适的滤波器结构(如LC滤波器、微带滤波器等)和元件值。 6. 新手与老手:这份资源对初学者来说是一个很好的起点,提供了基础知识和概念...

    cors-filter-2.5.jar

    这可能包含关于如何使用这个库的说明、版本信息、许可证条款或者其他相关的文档内容。 CORS Filter的工作原理是通过实现Servlet API中的Filter接口,对请求进行预处理和后处理。当接收到一个HTTP请求时,CORS ...

    Filter1源代码

    "Filter1源代码"是关于深入理解Filter原理的一个学习资源,通过实际的代码分析来帮助我们更好地掌握这一核心技术。 Filter在Java Web中的主要作用包括:数据校验、安全控制、字符编码转换、性能监控等。它的工作...

    imu_filter_madgwick_IMU滤波_filter_imu_filter_madgwick_IMU_IMU滤波_源

    “filter imu_filter_madgwick”标签进一步强调了这是关于IMU滤波器的实现,特别是使用了Madgwick的滤波方法。Madgwick滤波算法由Sebastian Madgwick提出,它是一种高效的实时传感器融合算法,结合了卡尔曼滤波和...

    webfilter的教程

    `Servlet和Filter的url匹配url-pattern-JSP编程教程`以及`servlet和JSP过滤器Filter-JSP教程`可能提供了关于如何配置`Filter`以匹配特定URL模式的示例,这对于控制访问权限和执行预处理逻辑非常重要。 综上所述,`...

    Java Filter相关资料

    本资料包可能包含了关于Java Filter的详细使用方法和生命周期管理的文档或示例代码。 1. **Filter的基本概念** - Java Filter是一个实现了javax.servlet.Filter接口的类,它允许开发者在请求到达目标Servlet或JSP...

    Exper08.zip

    `Exper08`文件名可能代表这是一个关于Filter的第八个实验或者练习,暗示这个工程可能包含了逐步进阶的内容,涵盖了更复杂的Filter应用场景。在学习这个工程时,你可能会遇到如何处理多个Filter的顺序、如何传递数据...

    过滤器(Filter)

    `Filter创建.exe`可能是一个用于创建过滤器实例或者配置过滤器的工具,而`说明.txt`可能包含了关于如何使用这个工具或者过滤器的详细步骤和注意事项。 过滤器还可以与其他框架集成,比如Spring MVC中的Filter,可以...

Global site tag (gtag.js) - Google Analytics