Servlet 过滤器

一、简介
Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
Servlet 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
  • 在客户端的请求访问后端资源之前,拦截这些请求。
  • 在服务器的响应发送回客户端之前,处理这些响应。
根据规范建议的各种类型的过滤器:
  • 身份验证过滤器(Authentication Filters)。
  • 数据压缩过滤器(Data compression Filters)。
  • 加密过滤器(Encryption Filters)。
  • 触发资源访问事件过滤器。
  • 图像转换过滤器(Image Conversion Filters)。
  • 日志记录和审核过滤器(Logging and Auditing Filters)。
  • MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)。
  • 标记化过滤器(Tokenizing Filters)。
  • XSL/T 过滤器(XSL/T Filters),转换 XML 内容。
二、要点
1、过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明,然后映射到您的应用程序的部署描述符中的 Servlet 名称或 URL 模式。
2、当 Web 容器启动 Web 应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例。
3、 Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。
4、 web.xml 中的 filter-mapping 元素的顺序决定了 Web 容器应用过滤器到 Servlet 的顺序。 若要反转过滤器的顺序,您只需要在 web.xml 文件中反转 filter-mapping 元素即可。
5、 在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。


三、实例(字符编码过滤器)
包含的文件:
CharacterEncodingFilter.java  //继承了Filter的过滤器
web.xml               //声明filter,servlet及对应的映射
EncodingFilterServlet.java       //servlet文件,用来接受和打印数据
encodingfliter.jsp    //表单文件,发送数据到 EncodingFilterServlet.java


CharacterEncodingFilter.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;
/*
 * 类描述    字符编码过滤器
 * 类功能    所以处理的中文数据经过统一 utf -8编码后输出;
 */
public class CharacterEncodingFilter implements Filter{
       //字符编码格式参数
       protected String encoding = null ;
       //FilterConfig对象
       protected FilterConfig filterConfig = null ;
      
       @Override //初始化方法
       public void init(FilterConfig filterConfig) throws ServletException {
             //对filterConfig赋值
             this . filterConfig = filterConfig;
             //对初始化参数赋值
             this . encoding = filterConfig.getInitParameter( "encoding" );
            
      }

       @Override
       public void doFilter(ServletRequest request, ServletResponse response,
                  FilterChain chain) throws IOException, ServletException {
             //判断字符串是否有效
             if ( encoding != null ){
                   //设置request字符编码
                  request.setCharacterEncoding( encoding );
                   //设置response字符编码
                  response.setContentType( "text/html;charset=" + encoding );
            }
             //传递下一个过滤器
            chain.doFilter(request, response);
      }
       @Override
       public void destroy() {
            
             //释放资源
             this . encoding = null ;
             this . filterConfig = null ;
            
      }
}

web.xml
<? xml version = "1.0" encoding = "UTF-8" ?>
  < display-name > servlet_spot2 </ display-name >
  < welcome-file-list >
    < welcome-file > index.html </ welcome-file >
    < welcome-file > index.htm </ welcome-file >
    < welcome-file > index.jsp </ welcome-file >
    < welcome-file > default.html </ welcome-file >
    < welcome-file > default.htm </ welcome-file >
    < welcome-file > default.jsp </ welcome-file >
  </ welcome-file-list >
 
  <!-- 设置字符串编码过滤器 -->
  < filter >
  < filter-name > CharacterEncodingFilter </ filter-name >
  < filter-class > com.filter.CharacterEncodingFilter </ filter-class >
  <!-- 设置初始化参数 -->
  < init-param >
      < param-name > encoding </ param-name >
      < param-value > UTF-8 </ param-value >
  </ init-param >
  </ filter >
  <!-- 映射字符编码过滤器 -->
  < filter-mapping >
  < filter-name > CharacterEncodingFilter </ filter-name >
  <!-- 与所以请求关联 -->
  < url-pattern > /* </ url-pattern >
  <!-- 设置过滤器对应请求方式 -->
  < dispatcher > REQUEST </ dispatcher >
  < dispatcher > FORWARD </ dispatcher >
  </ filter-mapping >
 
  < servlet >
    < servlet-name > EncodingFilterServlet </ servlet-name >
    < servlet-class > com.filter.EncodingFilterServlet </ servlet-class >
  </ servlet >
  < servlet-mapping >
    < servlet-name > EncodingFilterServlet </ servlet-name >
    < url-pattern > /encoding </ url-pattern >
  </ servlet-mapping >
 
</ web-app >

  EncodingFilterServlet.java
package com.filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class EncodingFilterServlet
*/
@WebServlet("/EncodingFilterServlet")
public class EncodingFilterServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public EncodingFilterServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        String name = request.getParameter("name");
        if(name!=null && !name.isEmpty()){
            out.print("你好!"+name);
            out.print("<br>");
        }else{
            out.print("请输入你的姓名!");
        }
        out.flush();
        out.close();
    }
}


encodingfliter.jsp
<%@ page language = "java" contentType = "text/html; charset=ISO-8859-1"
    pageEncoding = "ISO-8859-1" %>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " http://www.w3.org/TR/html4/loose.dtd" ; >
< html >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=ISO-8859-1" >
< title > Insert title here </ title >
</ head >
< body >
< form action = "EncodingFilterServlet" method = "post" >
请输入你的名称:
< input type = "text" name = "name" >
< input type = "submit" value = "提交" >
</ form >
</ body >
</ html >





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值