java过滤器——filter的使用和配置
2015-06-28 00:02
507 查看
在做DRP的过程中用到了filter。前几天昌哥和欢姐在小会议室向我们介绍了AOP的思想,用到filter时觉得它们两者特别相似。
如下图:
javaweb开发中,request和response是两个必不可少的对象,他们是在接收到每一次客户端请求后,由web服务器产生的。filter可以在request到达servlet之前和response即离开servlet时分别对它们进行处理。
filter常常用于网站过滤敏感词汇、设置字符集、日志等比较“公共性”的事件处理中。
在我们正常的编程中,每一条线,都是从上到下依次调用,而filter是在每一个完整的调用中横着“切了一刀”。通过配置,它可以对任意代码路径进行过滤。
这里以转码/设置字符集为例,简单了解一下如何使用filter。
建立Filter
CharsetEncodingFilter.java
此过滤器CharsetEncodingFilter实现了javax.servlet.Filter接口(任何filter过滤器也必须实现这个接口);在服务器创建此filter并进行初始化执行init方法时,读取配置文件并存入FilterConfigure的对象中;实现doFilter方法,在请求到达jsp之前将字符集编码设置为utf-8,chain.doFiler()方法的作用是在对request对象进行处理之后,跳转到被拦截的servlet继续执行,执行完之后还要回到此处,chain.doFilter()下面还可以对response对象进行处理。
配置filter
web.xml
此处配置所起的作用是,此filter对所有的jsp页面都有设置字符集的效果,当每次访问jsp页面时,都会执行filter中的doFilter()方法,因此每次访问jsp页面前后,都可以在Console中看到doFilter方法输出的 “ CharsetEncodingFilter---->>>>Begin ” 和 “CharsetEncodingFilter---->>>>End ”。
除此之外还有其他几种对filter作用域配置的方式:
对所有的对象都有过滤效果
至此,无论访问哪个jsp页面,都会事先设置其字符集,不用分别对每个页面都进行设置了。
如下图:
javaweb开发中,request和response是两个必不可少的对象,他们是在接收到每一次客户端请求后,由web服务器产生的。filter可以在request到达servlet之前和response即离开servlet时分别对它们进行处理。
filter常常用于网站过滤敏感词汇、设置字符集、日志等比较“公共性”的事件处理中。
在我们正常的编程中,每一条线,都是从上到下依次调用,而filter是在每一个完整的调用中横着“切了一刀”。通过配置,它可以对任意代码路径进行过滤。
这里以转码/设置字符集为例,简单了解一下如何使用filter。
建立Filter
CharsetEncodingFilter.java
package com.drp.filter; 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; /**采用filter统一处理filter * @author Danny * */ public class CharsetEncodingFilter implements Filter { @Override public void destroy() {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("CharsetEncodingFilter---->>>>Filter开始"); request.setCharacterEncoding("utf-8"); //设置字符集 chain.doFilter(request, response); //继续执行 System.out.println("CharsetEncodingFilter---->>>>Filter结束"); } @Override public void init(FilterConfig config) throws ServletException {} }
此过滤器CharsetEncodingFilter实现了javax.servlet.Filter接口(任何filter过滤器也必须实现这个接口);在服务器创建此filter并进行初始化执行init方法时,读取配置文件并存入FilterConfigure的对象中;实现doFilter方法,在请求到达jsp之前将字符集编码设置为utf-8,chain.doFiler()方法的作用是在对request对象进行处理之后,跳转到被拦截的servlet继续执行,执行完之后还要回到此处,chain.doFilter()下面还可以对response对象进行处理。
配置filter
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <filter> <filter-name>CharsetEncodingFilter</filter-name> <filter-class>com.drp.filter.CharsetEncodingFilter</filter-class> </filter> <filter-mapping><!-- 此filter对所有的jsp页面都有过滤效果 --> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> </web-app>
此处配置所起的作用是,此filter对所有的jsp页面都有设置字符集的效果,当每次访问jsp页面时,都会执行filter中的doFilter()方法,因此每次访问jsp页面前后,都可以在Console中看到doFilter方法输出的 “ CharsetEncodingFilter---->>>>Begin ” 和 “CharsetEncodingFilter---->>>>End ”。
除此之外还有其他几种对filter作用域配置的方式:
对所有的对象都有过滤效果
<filter-mapping> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>对sysmgr下的所有对象都有过滤效果,无论是servlet还是jsp
<filter-mapping> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>/sysmgr/*</url-pattern> </filter-mapping>只对指定的servlet具有过滤效果
<filter-mapping> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>/servlet/LoginServlet</url-pattern> </filter-mapping>
至此,无论访问哪个jsp页面,都会事先设置其字符集,不用分别对每个页面都进行设置了。
相关文章推荐
- CAS 与 Spring Security 3整合配置详解
- Java中代理简述
- 代码即财富之我学Java对象序列化与反序列化(2)
- 代码即财富之我学Java对象克隆(3)
- CAS 与 Spring Security 3整合配置详解
- Java IO流 Properties练习-记录应用程序运行次数
- spring mvc使用MultiActionController时发生No request handling method with name的错误
- 【JavaWeb】(1)JSP基础语法
- Java文件 Properties的一些操作
- 【SpringMVC】<context:include-filter>和<context:exclude-filter>使用时要注意的地方
- 关于Eclipse中通过run on server来运行JSP文件不支持session问题
- java控制多核cpu的占用率
- Java-J2SE学习笔记-字符串转化为二维数组
- 在Eclipse中编写servlet时出现"The import javax.servlet cannot be resolved" 问题解决办法
- 用java语言怎么写hdu题目之next()与nextLine()的区别
- 新手学JAVA(八)----走进JDBC
- Java文件 File练习-建立一个java文件列表文件
- Ubuntu12.04下eclipse提示框黑色背景色的修改方法
- java中OutofMemoryError和JVM内存结构
- Java文件 File练习-递归删除带内容的目录