Tomcat中Filter的实现和上面差不多,不过其中的类名和概念的名称比较匹配。如下:
ApplicationDispatcher通过使用FilterChain来实现Filter链式调用。
其中ApplicationFIlterChain.internalDoFilter为核心的代码:
private void internalDoFilter(ServletRequest request,
ServletResponse response)
throws IOException, ServletException {
// 通过pos来记录当前执行的Filter,只有到所有Filter执行完(递归终止条件之一)
if (pos < n) {
ApplicationFilterConfig filterConfig = filters[pos++];
Filter filter =
null;
try {
filter = filterConfig.getFilter();
if (request.isAsyncSupported() &&
"false".equalsIgnoreCase(
filterConfig.getFilterDef().getAsyncSupported())) {
// ...
}
else {
// Filter.doFilter,通过传入当前对象,来实现递归调用,将控制权传递给Filter,由Filter来决定是否需要继续执行下去
filter.doFilter(request, response,
this);
}
return;
}
try {
if ((request
instanceof HttpServletRequest) &&
(response
instanceof HttpServletResponse)) {
if( Globals.IS_SECURITY_ENABLED ) {
// ...
}
else {
// 执行Target真正的方法
servlet.service(request, response);
}
}
else {
servlet.service(request, response);
}
}
// ...
}
参考文档:
Wiki:
https://en.wikipedia.org/wiki/Intercepting_filter_pattern
https://en.wikipedia.org/wiki/Interceptor_pattern
官方文档:
推荐阅读:
Struts中异步传送XML和JSON类型的数据
Struts2的入门实例
Struts2学习笔记-Value Stack(值栈)和OGNL表达式
struts2文件上传(保存为BLOB格式)
在Struts2中使用ModelDriven action
Struts2拦截器浅解
Struts2数据验证机制
struts2简单示例
Struts2绑定对象数组
Struts2 s:if标签以及 #,%{},%{#}的使用方法
Struts 的详细介绍:请点这里
Struts 的下载地址:请点这里