本文出处:http://blog.csdn.net/chaijunkun/article/details/7646338,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。
在Java Web开发过程中,我们可以使用过滤器和Spring框架提供的拦截器来对请求进行处理,从而实现对整个Web应用的权限控制。在这里我简单介绍一下我在使用过滤器实现权限验证方面的经验。
过滤器作为传统的Web开发技术,不受使用了第三方框架的束缚,所有符合标准的Servlet容器都支持这项技术。URL字符编码过滤器是我们经常使用的,而权限控制过滤器则是过滤器轻量级应用的常见场景。目前我所开发的一个项目中就使用了这项技术,然而在开发时遇到了过滤器被调用了两次的问题,下面说一下我的配置:

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

<!--权限过滤器 --><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 {}}

结果当我访问了一个接口后,在控制台显示了两条“过滤器被调用”的提示。后来在网上寻找原因,偶然看到了有人问同样的问题: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的图标:

根据规范,这个图标的位置就是在站点根目录下,命名也必须为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 Web开发中,自定义过滤器被执行两次的原因分析及解决办法相关推荐

  1. java sessionstate_在Java Web开发中自定义Session

    Session在存储安全性要求较高的会话信息方面是必不可少的,对于分布式Web应用自定义Session支持独立的状态服务器或集群是必须的.本文就来教大家如何在Java Web开发中自定义Session ...

  2. JavaScript中的ParseInt(08)和“09”返回0的原因分析及解决办法

    今天在程序中出现一个bugger ,调试了好久,最后才发现,原来是这个问题. 做了一个实验: alert(parseInt("01")),当这个里面的值为01====>07时 ...

  3. java web开发中Filter使用Annotation配置 (转载)

    为什么80%的码农都做不了架构师?>>>    为了在java中得到request和response对象,搜索到了 <如何在Java的普通类中获取Session以及reques ...

  4. Java Web开发中路径问题小结

    Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...

  5. IOS 开发中 Whose view is not in the window hierarchy 错误的解决办法

    在 IOS 开发当中经常碰到 whose view is not in the window hierarchy 的错误,该错误简单的说,是由于 "ViewController" ...

  6. WampServer + phpcms 开发中,浏览器 localhost 出现 Cannot to connect to mySQL server 的原因分析和解决办法?

    首先,确定你phpcms的文件已经都已经放置在对应的文件目录下! 注意: 本文针对 Wampserver + phpcms 开发中出现的此类问题.其他情况仅供参考. 在安装软件**WampServer ...

  7. 关于java web开发中的很多小问题集锦

    1.导出excel文件,文件名的中文问题 public static void setFileDownloadHeader(HttpServletRequest request, HttpServle ...

  8. Java Web - 服务器中的过滤器和监听器

    一 过滤器 每个servlet都有自己需要处理的资源,这么多的资源我们有时候我们希望统一的进行管理,比如对响应的图片进行加水印处理,对提交和响应的数据的编码进行统一,或者是对提交的数据进行过滤. 解决 ...

  9. AE开发中“无法嵌入互操作类型*****,请改用适用的接口”解决办法

    问题:在AE开发中遇到:"无法嵌入互操作类型*****,请改用适用的接口" 解决办法:在"项目解决方案"中找到"引用",找到报错出现的类对应 ...

最新文章

  1. DADA2中文教程v1.8
  2. javaWeb防止恶意登陆或防盗链的使用
  3. 手机1像素线粗_豪威推出4800万像素手机传感器:1/2大底
  4. 【C++】this指针
  5. CVPR 2021 | 澳洲国立大学提出基于模型的图像风格迁移
  6. Linux纯干货知识总结|面试专用
  7. matlab 次坐标轴 标注,matlab标注坐标轴
  8. 一些关于ROS中move_base的理解
  9. Visual Tracker Benchmark
  10. eclipse代码量统计插件_Android Studio 代码行数统计插件Statistic的简单使用
  11. Bootstrap validation
  12. 广域网宽带接入技术九ADSL技术
  13. nodejs+express留言板功能实现
  14. Unity3d trial version 水印
  15. 新手网站建设优化,这些网站为你提供数之不尽的免费素材!(3)
  16. 文件下载文件中文名问题
  17. Ethernet设备中网络变压器的作用
  18. net以execl做数据库_基于C#.NET实现Excel数据导入数据库技术
  19. jquery H5 好用的编辑器umeditor
  20. Revit SDK EXTENSIONS(软件开发工具包扩展)是什么

热门文章

  1. leetcode刷题笔记(3)(python)
  2. 【Java集合源代码剖析】TreeMap源代码剖析
  3. Scala学习(一):Scala简介与Hello World!
  4. Java程序员的日常 —— 响应式导航Demo
  5. django的json返回值带有汉字的处理
  6. uboot第一阶段详细分析
  7. 【web前端面试题整理05】做几道前端面试题休息休息吧
  8. 软件设计 -- 流程图的重要性
  9. Java 集合 Collection、Iterator
  10. 数据结构之二叉树_二叉排序树(严蔚敏C语言版)