`

JAVA开发(7) - filter

阅读更多

filter的意思简单的说就是过滤器,它的作用就是当用户请求一个url之前,可以预先做一些处理,当请求完url返回给用户之前还可以做一些处理(所以filter的功能十分的强大,如果想做的话可以强大到让用户,不能访问请求的url的程度。。。)<?XML:NAMESPACE PREFIX = O ?>

 

接口javax.servlet.Filter

 

   void init(FilterConfig filterConfig)

   可以在此方法中完成Filter需要初始化的内容,在一个filter提供服务之前肯定会先调用此方法

 

       void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

当用户访问的url或者servlet被配置了使用此filter时,servlet/jsp容器会调用此方法,每次访问调用一次。chain参数为一个FilterChain接口的对象,可以简单的理解成chain包含了访问一个url上所有的需要调用的方法。

 

       void destroy()

当不需要一个filter再提供服务时调用,容器会调用此方法

 

filter的工作模式:

 

 

可以看到假如用户访问的一个url有两个filter的时候。

servlet容器会先调用最外层的filter(Filter1)doFilter()方法,然后在由Filter1中调用的chain.doFilter方法将控制权返回给容器,接着容器调用第二层filter(Filter2)doFilter方法,然后在由Filter2中调用的chain.doFilter方法将控制权返回给容器,这个时候容器才能去访问真正的需要请求的servletjsp,但servletjsp执行完毕以后,会运行Filter2doFilter方法调用的chain.doFilter方法后剩余的代码片断,之后再运行Filter1doFilter方法调用的chain.doFilter方法后剩余的代码片断。

 

Filter对应的请求方式有4种:requestforwardincludeerror

 

request:当用户直接请求一个网页时才会通过此filter,当用户通过RequestDispatcher(会再后面详细介绍该类的方法)forward不会通过该filter

forward: 当用户通过RequestDispatcherforward方法访问对应的url时才会通过该filter

include:当用户通过RequestDispatcherinclude方法访问对应的url时才会通过该filter

error:当用户的请求通过错误处理机制的时候才会通过该filter(目前不准备详细论述)

 

一个filter可以对应几种请求方式,但是如果配置时不写请求方式的话,默认方式为request

 

下面先举一个例子看下filter工作的过程:

 

FilterFirst

 

package squall.servlet.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;

 

public class FilterFirst implements Filter

...{

 

       
public void destroy()

       
...{

 

       }


 

       
public void doFilter(ServletRequest request, ServletResponse response,

                     FilterChain chain) 
throws IOException, ServletException

       
...{

              System.out.println(
"Begin First Filter!");

              chain.doFilter(request, response);

              System.out.println(
"After First Filter!");

       }


 

       
public void init(FilterConfig config) throws ServletException

       
...{

 

       }


 

}


 

 

FilterSecond

 

package squall.servlet.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;

 

public class FilterSecond implements Filter

...{

 

       
public void destroy()

       
...{

 

       }


 

       
public void doFilter(ServletRequest request, ServletResponse response,

                     FilterChain chain) 
throws IOException, ServletException

       
...{

              System.out.println(
"Begin Second Filter!");

              chain.doFilter(request, response);

              System.out.println(
"After Second Filter!");

       }


 

       
public void init(FilterConfig config) throws ServletException

       
...{

              

       }


 

}


 

 

部署时修改web.xml如下:

在第一个<servlet>标签前添加:

       

  <filter>

        
<filter-name>FilterFirst</filter-name>

        
<filter-class>squall.servlet.filter.FilterFirst</filter-class>

    
</filter>

    
<filter>

        
<filter-name>FilterSecond</filter-name>

        
<filter-class>squall.servlet.filter.FilterSecond</filter-class>

    
</filter>

    

    
<filter-mapping>

        
<filter-name>FilterFirst</filter-name>

              
<url-pattern>/HelloServlet</url-pattern>

    
</filter-mapping>

    
<filter-mapping>

        
<filter-name>FilterSecond</filter-name>

              
<url-pattern>/HelloServlet</url-pattern>

</filter-mapping>

 

filter标签放置在一起,将filter-mapping标签放在再一起,顺序根据filter-name一致。这里的filter-mapping的顺序即为:假如我们访问的一个url有两个filter时,filter的先后顺序,web.xmlfilter-mapping在前面的filter先被执行。

 

部署完毕之后我们访问:http://127.0.0.1:8080/train/HelloServlet

可以看到tomcat管理控制台输出如下:

Begin First Filter

Begin Second Filter

After Second Filter

After First Filter

 

上面的例子可以看出filter工作的过程和我们上面的图片一致。

 

下面我们来举一个比较贴近实际的例子看一下filter的方便之处。

下面的例子用于常见的解决中文乱码的问题,我们为了防止中文乱码经常需要调用

HttpServletRequestHttpServletResponsesetCharacterEncoding方法,底下的这个filter的例子实现了,采用filter来解决这个问题。

Filterparam.html

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<META http-equiv="Content-Type" content="text/html; charset=GBK" /> 

<script type="text/javascript">...

       

       

function changeaction()

...{

       
var a = document.getElementsByName("filter");

       
for(i = 0; i < a.length; i++)

       
...{

              
if(a[i].checked==true)

              
...{

                     fm.action
=a[i].value;

                     
break;

              }


       }


}


</script>

 

        
<title>filterparameter.html</title>

</head>

 

 

 

<body bgcolor="#FDF5E6">

 

<h2>Filter中文乱码示范</h2>

 

<form name ="fm" method="post" action="FilterShowParameter/No">

  

  
<p>姓名:<input type="text" name="username" size="15" /> </p>

  

  
<p>使用filter:

  
<input name="filter" value="FilterShowParameter/No" type="radio" onclick="changeaction()" checked />

       不使用

  
<input name="filter" value="FilterShowParameter/Yes" type="radio" onclick="changeaction()" />

       使用

  
</p>

  
<p>

  
<input value="确认" type="submit" />

  
<input value="清除" type="reset" />

  
</p>

</form>

 

 

</body>

</html>

 

直接放在train目录下

 

FilterShow

 

 

package squall.servlet.basic;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class FilterShow extends HttpServlet

...{

       
protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              showParam( req,  resp);

       }


 

       
protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              showParam( req,  resp);

       }


       

       
private void showParam(HttpServletRequest req, HttpServletResponse resp) throws IOException

       
...{

              resp.setContentType(
"text/html");

              PrintWriter out 
= resp.getWriter();

              String docType 
= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";

 

              String name 
= req.getParameter("username");

              

              out.println(docType 
+ "<HTML> " + "<HEAD><TITLE> showparam" 

                            
+ "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "

                            
+"     姓名:" + name + "   </br>"

                            );

 

          out.println(
"</body></html>");

       }


}


 

部署时将FilterShow mapping/FilterShowParameter/*

 

EncodingFilter

 

package squall.servlet.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;

 

public class EncodingFilter implements Filter

...{

 

       
public void init(FilterConfig config) throws ServletException

       
...{

              String str 
= config.getInitParameter("encoding");

              
if (str != null && !"".equals(str))

                     encoding 
= str;

       }


 

       
public void doFilter(ServletRequest request, ServletResponse response,

                     FilterChain chain) 
throws IOException, ServletException

       
...{

              System.out.println(
"encoding is " + encoding);

              
if(encoding != null)

              
...{

                     request.setCharacterEncoding(encoding);

                     response.setCharacterEncoding(encoding);

              }


              chain.doFilter(request, response);

       }


 

       
public void destroy()

       
...{

 

       }


 

       
private String encoding = null;

 

}


 

 

EncodingFilter的功能就是将requestresponse setCharacterEncoding为预先定义好的encodinggetInitParameter 将在以后介绍。

 

EncodingFilter部署方式:

web.xml最后一个</filter>下添加

 

 

 

<filter>

        
<filter-name>EncodingFilter</filter-name>

        
<filter-class>squall.servlet.filter.EncodingFilter</filter-class>

        
<init-param>

               
<param-name>encoding</param-name>

               
<param-value>GBK</param-value>

        
</init-param>

</filter>

 

然后在最后一个</filter-mapping>下添加:

 

 

<filter-mapping>

        
<filter-name>EncodingFilter</filter-name>

              
<url-pattern>/FilterShowParameter/Yes</url-pattern>

              
<dispatcher>REQUEST</dispatcher>

              
<dispatcher>FORWARD</dispatcher>

    
</filter-mapping>

 

部署完毕后访问http://127.0.0.1:8080/train/filterparam.html

输入姓名为中文以后,如果使用filter 选择为不使用则会看到乱码

选择使用filter则会看到正确的中文。

 

上面的例子是对REQUESTFORWARD使用filter

关于filter-mappinginclude方式做一个简单的说明,如下:

 

 

<filter-mapping>

        
<filter-name>FilterName</filter-name>

              
<servlet-name>HelloServlet</servlet-name>

              
<dispatcher>INCLUDE</dispatcher>

 
</filter-mapping>

 

include方式时必须将<url-pattern>修改为<servlet-name>

上面的filter-mapping的含义为:

HelloServlet这个servlet里调用RequestDispatcherinclude时,才会通过此filter

 

filter的功能远远不只上面举的例子,filter还可以对servletjsp输出至客户端的内容进行修改,还可以用来判断是否满足一些条件,假如不满足条件就不让访问者访问相应的条件,这里就不做一一的介绍了。

分享到:
评论

相关推荐

    cors-filter-2.5 + java-property-utils-1.9.1.zip

    在这个"cors-filter-2.5 + java-property-utils-1.9.1.zip"压缩包中,主要包含了两个关键组件:CORS Filter和Java Property Utils。 1. CORS Filter: CORS Filter是处理跨域请求的一种解决方案,它作为一个...

    cors-filter-1.7.jar和java-property-utils-1.9.jar

    标题中的“cors-filter-1.7.jar”和“java-property-utils-1.9.jar”是两个Java库的JAR文件,它们在Java开发中扮演着重要角色,特别是对于Web应用程序。这里,我们将深入探讨这两个库的功能和它们在“jasperserver”...

    cors-filter-1.7.jar java-util-1.9.1.jar

    总的来说,这两个Java库文件是Java开发中的重要组件,它们帮助开发者处理跨域问题以及提供实用的工具类。了解并熟练运用这些库,可以显著提升Java应用的效率和质量。在实际项目中,开发者通常会将这些库通过Maven或...

    Tomcat解决跨域的两个jar包java-property-utils-1.9.jar和cors-filter-1.7.jar

    本篇将详细介绍如何利用java-property-utils-1.9.jar和cors-filter-1.7.jar这两个jar包解决Tomcat的跨域问题。 首先,让我们了解`java-property-utils-1.9.jar`。这个库是由Apache Commons项目提供的,主要用来处理...

    cors-filter-1.7.jar,java-property-utils-1.9.jar

    在这个场景中,我们关注的两个jar包——"cors-filter-1.7.jar"和"java-property-utils-1.9.jar"与Geoserver的安装以及CORS配置紧密相关。 首先,让我们了解Geoserver。Geoserver是一款开源的地理信息系统服务器,...

    跨域、cors-filter-1.7、java-property-utils-1.9

    总结来说,解决J2EE应用中的跨域问题,需要理解CORS的工作原理,以及如何利用如`cors-filter-1.7.jar`这样的库和`java-property-utils-1.9.jar`来配置和管理跨域策略。正确实施后,可以确保多个源的网页能够安全地与...

    arcgis server10.2跨域(cors-filter-1.7,java-property-utils-1.9)

    CORS-filter-1.7是一个专门为了解决这种跨域问题而设计的Java过滤器。这个过滤器可以被添加到ArcGIS Server的Java Web应用程序容器(如Tomcat)中,允许来自不同源的请求通过,并且配置相应的响应头,比如`Access-...

    cors-filter-2.6和java-property-utils-1.13

    标题 "cors-filter-2.6和java-property-utils-1.13" 提及了两个关键的Java库,分别是CORS Filter 2.6和Java Property Utils 1.13。这些库在Java开发中有着重要的作用,特别是对于Web应用程序。 **CORS Filter 2.6**...

    cors-filter-1.7.jar,java-property-utils-1.9.jar两个包供学习使用.rar

    总的来说,CORS-filter-1.7.jar和java-property-utils-1.9.jar这两个库在Java Web开发中扮演着重要角色,一个是解决前后端跨域问题,另一个则是处理配置文件的读写。理解并掌握这两个库的使用,对于提升Web应用的...

    cors-filter-1.7.jar,Java-property-utils-1.9.jar

    标题中的"cors-filter-1.7.jar"就是与CORS相关的Java过滤器,它帮助服务器处理来自不同源的请求,以实现跨域访问。这个jar包是ArcGIS Server 10.2在处理跨域请求时所需的一个组件。 ArcGIS Server是一款强大的地理...

    CORS包java-property-utils-1.9.jar和cors-filter-1.7-sources.jar

    总的来说,`java-property-utils-1.9.jar` 和 `cors-filter-1.7-sources.jar` 在ArcGIS Server 10.2中扮演了关键角色,它们使得开发人员能够轻松地实现跨域功能,确保Web应用能够安全、有效地与ArcGIS Server交互。...

    cors-filter-1.7.jar,cors-filter-2.5.jar,cors-filter-2.10.jar

    标题中的“cors-filter-1.7.jar”,“cors-filter-2.5.jar”和“cors-filter-2.10.jar”是针对不同版本的CORS过滤器实现。这些jar包是专门为Tomcat设计的,用于处理跨域请求过滤,确保服务器能够安全地响应来自不...

    解决Tomcat跨域的jar包,java-property-utils-1.9.jar

    &lt;filter-class&gt;org.apache.catalina.filters.CorsFilter&lt;/filter-class&gt; &lt;init-param&gt; &lt;param-name&gt;cors.allowed.origins&lt;/param-name&gt; &lt;param-value&gt;*&lt;/param-value&gt; &lt;/init-param&gt; &lt;!-- 更多配置选项,如:...

    java-property-utils-1.9.1.zip

    总结起来,`java-property-utils-1.9.1.zip` 提供了强大的 Java 属性操作工具,而 `cors-filter-1.7.jar` 则是处理 CORS 配置的过滤器,两者结合可以更好地支持现代 Web 应用的开发需求,尤其是在处理配置文件和跨域...

    java-property-utils-1.9.1.jar

    Java Web 应用在开发过程中,常常会遇到跨域(CORS)问题,这主要是由于浏览器的安全策略限制了不同源的请求。`java-property-utils-1.9.1.jar` 是一个专门针对这种情况设计的Java库,它提供了解决跨域问题的功能。...

    cors-filter-1.7.jar spring解决跨域问题 java

    本篇将详细讲解如何利用Spring解决跨域问题,以及如何使用`cors-filter-1.7.jar`和`java-property-utils-1.9.1.jar`这两个库来辅助实现。 一、Spring解决跨域问题的基本原理 1. CORS定义:跨域是指浏览器遵循同源...

    cors-filter-1.7&java;-property-utils-1.9

    标题中的“cors-filter-1.7&java-property-utils-1.9”暗示了这是一个关于处理跨域问题的Java过滤器,可能与 CORS (Cross-Origin Resource Sharing) 有关,同时提到了“property-utils-1.9”,这可能是用来管理Java...

    tomcat跨域cors相关jar包 java-property-utils-1.9.jar,cors-filter-1.7.jar,java-util-1.9

    首先,我们关注到三个关键的jar包:`java-property-utils-1.9.jar`、`cors-filter-1.7.jar` 和 `java-util-1.9.1.jar`。这些jar包在Tomcat跨域CORS配置中起到关键作用。 1. **java-property-utils-1.9.jar**: 这个...

    jsonp相关jar包 cors-filter-1.7.jar和java-property-utils-1.9.jar

    本文将详细介绍JSONP和CORS的概念、作用以及如何使用`cors-filter-1.7.jar`和`java-property-utils-1.9.jar`这两个jar包来帮助我们实现跨域。 **JSONP** JSONP是一种绕过同源策略的非官方跨域解决方案。它主要依赖...

Global site tag (gtag.js) - Google Analytics