`

Java Web开发中,自定义过滤器被执行两次的原因分析及解决办法 .

 
阅读更多
原文地址:http://blog.csdn.net/chaijunkun/article/details/7646338
在Java Web开发过程中,我们可以使用过滤器和Spring框架提供的拦截器来对请求进行处理,从而实现对整个Web应用的权限控制。在这里我简单介绍一下我在使用过滤器实现权限验证方面的经验。
过滤器作为传统的Web开发技术,不受使用了第三方框架的束缚,所有符合标准的Servlet容器都支持这项技术。URL字符编码过滤器是我们经常使用的,而权限控制过滤器则是过滤器轻量级应用的常见场景。目前我所开发的一个项目中就使用了这项技术,然而在开发时遇到了过滤器被调用了两次的问题,下面说一下我的配置:

在web.xml中我指定了过滤器:

 

[html]
<!--权限过滤器 -->
	<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>

下面是过滤器的实现代码:

 

 

[java]
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);

	@Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain filterChain) throws IOException, ServletException {
		HttpServletRequest request= (HttpServletRequest) req;
		    logger.info("过滤器被调用");
		    filterChain.doFilter(request, resp);
		}
		
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
	}

}

结果当我访问了一个接口后,在控制台显示了两条“过滤器被调用”的提示。后来在网上寻找原因,偶然看到了有人问同样的问题:http://topic.csdn.net/u/20110930/22/d8741022-53eb-4df1-ace0-357f6edabee1.html
按照“xiaobluesky”说的方法,打印了一下请求的URL地址:System.out.println(request.getRequestedURI());
发现两次打印的内容不一样:
第一次打印的是我请求的Servlet,第二次打印的是/favicon.ico,此时才恍然大悟,很多浏览器都支持“站点图标”的功能。例如我当前正在编辑这篇文章,使用的是Chrome浏览器,标签页上就显示了一个这样的CSDN的图标:

 

CSDN图标

根据规范,这个图标的位置就是在站点根目录下,命名也必须为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 节的原文

分享到:
评论

相关推荐

    java过滤器和验证码

    过滤器和验证码是Java Web开发中的重要组成部分,主要用于提高应用程序的安全性和用户体验。下面将详细讲解这两个概念。 2.1.1 过滤器简介 过滤器(Filter)是Java Servlet API的一部分,它允许开发者在HTTP请求...

    spring-boot 过滤器 filter

    本篇文章将深入探讨Spring Boot中的过滤器机制,以及如何创建和注册自定义过滤器。 一、Filter的基本概念 Filter是Java Servlet规范的一部分,它提供了一种机制,可以在请求到达目标Servlet或者响应离开Servlet...

    过滤器与拦截器的区别

    在Java Web开发中,过滤器(Filter)和拦截器(Interceptor)是两种常见的处理请求和响应的机制,它们各自有着不同的特性和应用场景。下面将详细解释这两种技术的区别以及它们在SSH(Spring、Struts和Hibernate)...

    过滤器filter和监听器listener的应用总结

    在Java Web开发中,过滤器(Filter)和监听器(Listener)是两个非常重要的概念,它们主要用于增强应用程序的功能和管理应用程序的状态。这篇文章将对这两者的应用进行深入的总结。 **过滤器Filter** 过滤器是在...

    java中文乱码分析

    ### Java中文乱码分析 #### 一、概述 在Java Web开发中,中文乱码问题是一个常见的技术难题,尤其在处理HTTP...通过上述分析和建议,我们可以有效地解决Java Web应用中的中文乱码问题,提高系统的稳定性和用户体验。

    java web sso 实现

    Java Web SSO(Single Sign-On)实现主要涉及的是在多个应用系统之间实现用户单点登录的功能,即用户只需要登录一次,就能在多个相互信任的应用系统中自由切换,无需再次进行身份验证。SSO的核心思想是将认证过程...

    过滤器 spring4.1+jdk1.7版本

    总结,这个"过滤器 spring4.1+jdk1.7版本"的压缩包提供了一个学习和实践Spring Filter和Interceptor的平台,通过分析和运行其中的代码,开发者可以深入理解这两种机制在Java Web开发中的应用和重要性。同时,对于...

    Web Development with JavaServer Pages, 2nd Ed

    《Web开发与JavaServer Pages(第二版)》一书由Duane K. Fields、Mark A. Kolb和Shawn Bayern三位作者共同编写,是Manning出版社出版的一本深入讲解JavaServer Pages(JSP)技术的专业书籍。JSP是一种用于创建动态...

    基于JSP的Java Web项目的CSRF防御示例

    在Java Web项目中,我们可以结合Spring Security或自定义过滤器实现CSRF防护。以下是一个基本的步骤: 1. **引入依赖**:如果使用Spring Security,需要在Maven的pom.xml文件中添加相应的依赖。 2. **配置Spring ...

    java开源包101

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包8

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包10

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包6

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包9

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包4

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包5

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包11

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java单点登录流程及其他

    在上面的配置中,我们首先配置了 Security 框架不使用 Session,然后将自定义的解析 JWT 的过滤器添加到 Security 框架的过滤器链中。接着,我们配置了跨域访问和处理“无认证信息却访问需要认证的资源时”的响应。...

    java开源包1

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包3

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

Global site tag (gtag.js) - Google Analytics