码迷,mamicode.com
首页 > 编程语言 > 详细

记性不如烂笔头29-java应用中的过滤器Filter(1)

时间:2015-02-05 18:30:44      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:servlet   filter   过滤器   

过滤器(Filter),功能非常的强大,是Servlet中最重要的技术之一,WEB应用的开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。

1、Filter实现拦截的方法

Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

调用目标资源之前,让一段代码执行。

是否调用目标资源(即是否让用户访问web资源)。

调用目标资源之后,让一段代码执行。

web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对 象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方 法,即web资源就会被访问,否则web资源不会被访问。

2、Filter开发步骤

Filter开发分为二个步骤:

编写java类实现Filter接口,并实现其doFilter方法。

在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。

3、JAVA实现的过滤器的范例

过滤器的JAVA代码:

package com.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;

/**

 *一个简单的过滤器

 *@author 范芳铭

 */

public class EasyFilter implementsFilter{

   @Override

   public void init(FilterConfig filterConfig) throws ServletException {

       System.out.println("----过滤器初始化----");

   }

 

   //过滤器功能在这里实现

   @Override

   public void doFilter(ServletRequest request, ServletResponse response,

            FilterChain chain) throwsIOException, ServletException {

       

       //对request和response进行一些预处理

       request.setCharacterEncoding("UTF-8");

       response.setCharacterEncoding("UTF-8");

       response.setContentType("text/html;charset=UTF-8");

       System.out.println("###过滤器执行前!!!");

       chain.doFilter(request, response); //让目标资源执行,放行

       System.out.println("---过滤器执行后!!!");

   }

 

   @Override

   public void destroy() {

       System.out.println("----过滤器销毁----");

   }

}

4、将过滤器添加到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">

 <display-name></display-name>

 <welcome-file-list>

   <welcome-file>index.jsp</welcome-file>

 </welcome-file-list>

 

   <!--配置过滤器-->

 <filter>

     <filter-name>easyFilter</filter-name>

     <filter-class>com.filter.EasyFilter</filter-class>

 </filter>

 

 <!--映射过滤器-->

 <filter-mapping>

     <filter-name>easyFilter</filter-name>

     <!--“/*”表示拦截所有的请求 -->

     <url-pattern>/*</url-pattern>

 </filter-mapping>

 

   <servlet> 

   <servlet-name>change</servlet-name> 

   <servlet-class>com.servlet.RequestDispatcher</servlet-class> 

 </servlet> 

 

  <servlet-mapping> 

   <servlet-name>change</servlet-name> 

   <url-pattern>/change</url-pattern> 

 </servlet-mapping> 

 

</web-app>

 

5、测试过滤器的servlet

package com.servlet;

 

import java.io.IOException;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

 

/**

 *通过request对象获取客户端请求信息,并且进行转发到另外一个页面中

 *@author 范芳铭

 */

public class RequestDispatcher extendsHttpServlet {

    privatestatic final long serialVersionUID = -4150164731865037680L;

 

    publicvoid doGet(HttpServletRequest request, HttpServletResponse response)

            throwsServletException, IOException {

        StringrealIp = this.getRealIp(request);

        request.setAttribute("realIp",realIp);

        //请求转发到change.jsp

        request.getRequestDispatcher("/change.jsp").forward(request,response);

    }

 

    publicvoid doPost(HttpServletRequest request, HttpServletResponse response)

            throwsServletException, IOException {

        doGet(request,response);

    }

 

    //如果通过代理等方式,IP地址会变化

    publicString getRealIp(HttpServletRequest request) {

        Stringip = request.getHeader("x-forwarded-for");

        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

            ip= request.getHeader("Proxy-Client-IP");

        }

        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

            ip= request.getHeader("WL-Proxy-Client-IP");

        }

        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

            ip= request.getRemoteAddr();

        }

        returnip;

    }

}

6、测试结果

###过滤器执行前!!!

---过滤器执行后!!!

过滤器得到了执行。

 

 

记性不如烂笔头29-java应用中的过滤器Filter(1)

标签:servlet   filter   过滤器   

原文地址:http://blog.csdn.net/ffm83/article/details/43530245

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!