Java Web开发中,自定义过滤器被执行两次的原因分析及解决办法 .
<!--权限过滤器 --><filter><filter-name>permissionFilter</filter-name><filter-class>blog.csdn.net.chaijunkun.PermissionFilter</filter-class></filter><filter-mapping><filter-name>permissionFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
下面是过滤器的实现代码:
?
?
package blog.csdn.net.chaijunkun;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import org.apache.log4j.Logger;public class PermissionFilter implements Filter {private Logger logger= Logger.getLogger(PermissionFilter.class);@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request= (HttpServletRequest) req; logger.info("过滤器被调用"); filterChain.doFilter(request, resp);}}@Overridepublic void init(FilterConfig config) throws ServletException {}}?
根据规范,这个图标的位置就是在站点根目录下,命名也必须为favicon.ico。
过滤器被执行两次的情况仅限于使用Servlet容器既提供静态访问支持、又提供动态访问支持的情况,当采用动静态分离的场合(例如apache+tomcat,apache将静态请求拦截自己处理,tomcat只处理动态内容),这种问题自然而然就消失了,因为该请求不会到达Servlet容器。
既然知道了原理,解决起来就好办了,写几个正则表达式,按照requestURI的规划进行合理的分配,不同的访问URL采用不同的权限过滤机制即可。但是这种方法并不能阻止doFilter方法被调用两次,只是代码在按照我们指定的请求逻辑上运行。也许,这就是过滤器的不足之处。
也许写到这里你会问,为什么在web.xml配置文件中url-pattern一定要写成"/*"这种形式呢?写成“/*.do”这种形式不是更好么?我又何尝不想这样呢,查了资料并实践后才知道,这样写是不符合JSR-315规范的。有兴趣的朋友可以参阅帖子:
http://topic.csdn.net/u/20100525/12/41569c26-350b-45f9-abc0-2019cbb4641b.html
读一下JSR 315 12.2 节的原文