Filter过滤器开发

一.什么是Filter

filter,中文名为过滤器。是用来过滤的。通过它可以改变请求和响应信息。Filter并不能产生响应信息,而只能在一个请求到达之前预处理该请求,也可以在请求离开之前处理响应。

借助于过滤器可以实现以下功能:
1.过滤非法文字和信息
2.设置统一字符编码
3.对用户进行登录验证
4.改变图片文件格式
5.对相应内容做压缩处理
6.对XML的输出使用XSLT来进行转换

二.实现一个过滤器

Filter也是一个Java类。自定义的Filter类必须实现Filter接口,还必须实现Filter接口中定义的init()方法,doFilter()方法,destroy()方法。

方法名描述
init()用于初始化
doFilter()用来实现过滤,所有的处理代码都放在该方法中
destroy()用来销毁

doFilter方法的参数解释:

参数名描述
request用来传递给下一个Filter或者JSP和Servlet
response用来传递给下一个Filter或者JSP和Servlet
chain通过调用其doFilter方法来调用下一个Filter,获得调用原始的JSP或者Servlet等其他内容

范例: 演示如何定义一个Filter,并过滤整个web项目

package com.javaweb.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 HelloFilter implements Filter{
       public void init(FilterConfig arg0) throws ServletException {
    	// TODO Auto-generated method stub
    	//初始化代码
    }
       public void destroy() {
    	// TODO Auto-generated method stub
    	//销毁代码
    }
       public void doFilter(ServletRequest request, ServletResponse response,
    		FilterChain chain) throws IOException, ServletException {
    	// TODO Auto-generated method stub
    	   //过滤代码
    	System.out.println("执行过滤");//过滤处理代码
    	chain.doFilter(request, response);//调用下一个Filter或者其他原始内容
    }
}

如果要是该Filter起作用,还必须在web.xml文件中配置该Filter,代码如下:

 <!-- 定义Filter本身 -->
  <filter>
          <!-- 指定Filter的名称 -->
          <filter-name>HelloFilter</filter-name>
          <filter-class>com.javaweb.Filter.HelloFilter</filter-class>
  </filter>
  <!-- 定义Filter映射信息 -->
  <filter-mapping>
                  <!-- 指定Filter的名称 -->
                  <filter-name>HelloFilter</filter-name>
                  <!-- 指令过滤URL -->
                  <url-pattern>/*</url-pattern>
  </filter-mapping>

filter的配置和servlet很相似,只要将servlet换成filter就可以了。

在浏览器输入http://localhost:8080/JavaWeb05/*,在后台console会看到如下图:
在这里插入图片描述

三.Filter生命周期

Filter的生命周期和Servlet很相似。过程如下:
1.服务器启动时就加载Filter
2.加载完成后立即调用init()方法进行初始化操作
3.过滤用户请求,调用doFilter()方法
4.调用destroy()方法
5.通过垃圾收集器进行收集清理

Filter的生命周期与Servlet的生命周期的区别:
第一点和第三点不同。
第一点区别:Filter是在服务器启动时就加载并完成初始化,Servlet是用户执行该Servlet时才会进行加载并初始化。
第三点区别:Filter可以根据配置文件来过滤多个用户请求URL,Servlet只能处理一个指定的URL。

总结:不管是Filter还是Servlet,在加载和初始化完成后,再次调用时不需要再进行初始化。只有重新加载项目或者重启服务器后才需要重新初始化。

四.IP地址过滤器

当一个用户发出访问请求时,首先通过过滤器进行判断,如果用户的IP地址被限制,则禁止访问,否则为合法IP,可以继续访问。

范例: 定义一个IP过滤器,它能够获得用户的IP地址,并对用户的IP进行判断。如果用户的IP被限制,则无法访问整个web项目。
IPFilter.java

package com.javaweb.Filter;

import java.io.IOException;
import java.io.PrintWriter;

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 IPFilter implements Filter{
       protected FilterConfig filterConfig;//包含了过滤器的配置信息
       protected String ip;//ip属性存放被限制的恶ip信息
       public void init(FilterConfig filterConfig) throws ServletException {
    	// TODO Auto-generated method stub
    	this.filterConfig = filterConfig;//设置属性filterConfig
    	this.ip = this.filterConfig.getInitParameter("ip");//获得初始化参数ip
    }
       public void doFilter(ServletRequest request, ServletResponse response,
    		FilterChain chain) throws IOException, ServletException {
    	// TODO Auto-generated method stub
    	String remoteIP = request.getRemoteAddr();//获得客户IP
    	if(remoteIP.equals("ip")){//判断IP是否被禁止
    		response.setContentType("text/html; charset = UTF-8");//设置Content-t字段值
    		response.setCharacterEncoding("gb2312");//设置输出内容编码格式
    		PrintWriter out = response.getWriter();//获得输出流
    		out.println("<b>该IP地址被禁止访问,请联系管理员!</b>");//输出不能访问的信息
    	}else{
    		chain.doFilter(request,	response);//向下传递
    	}
    }
       public void destroy() {
    	// TODO Auto-generated method stub
    	//销毁方法
    }
}

在web.xml中配置该过滤器,跟前面不同的是多了一个初始化参数的配置,代码如下:

 <!-- 定义Filter本身 -->
  <filter>
          <!-- 指定Filter的名称 -->
          <filter-name>IPFilter</filter-name>
          <filter-class>com.javaweb.Filter.IPFilter</filter-class>
          <init-param>
                      <param-name>ip</param-name>
                      <param-value>127.0.0.1</param-value>
          </init-param>
  </filter>
  <!-- 定义Filter映射信息 -->
  <filter-mapping>
                  <!-- 指定Filter的名称 -->
                  <filter-name>IPFilter</filter-name>
                  <!-- 指令过滤URL -->
                  <url-pattern>/*</url-pattern>
  </filter-mapping>

打开浏览器,访问该项目下的任何一个servlet或者jsp,后台console会显示“该IP地址被禁止访问,请联系管理员”

摘自《Java Web 程序设计与项目实践》,电子工业出版社

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值