Filter的入门
发布日期:2021-05-08 02:59:15 浏览次数:23 分类:精选文章

本文共 4370 字,大约阅读时间需要 14 分钟。

1.什么是Filter

  • Filter称为过滤器,它是Servlet技术中最实用的技术,web开发人员通过Filter技术,对web服务器所管理的资源(JSP,Servlet,静态图片或静态html文件)进行拦截
  • 拦截以后要放行,不然啥都没有hh

在这里插入图片描述

2.入门案例

MyFilter类实现Filter接口:

public class MyFilter implements Filter{   	@Override	public void init(FilterConfig filterConfig) throws ServletException {   			}	@Override	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)			throws IOException, ServletException {   		System.out.println("MyFilter执行了……");		//放行		chain.doFilter(request, response);	}	@Override	public void destroy() {   	}}

Filter配置跟Servlet类同

MyFilter
com.abc.filter.MyFilter
MyFilter
/*

3.什么是FilterChain

  • FilterChain过滤器链:在一个web应用中,可以开发编写多个Filter,形成一个链。
  • 顺序为web.xml文件中从上而下

4.Filter的生命周期

  • 创建和销毁由web服务器负责,当它启动的时候就会创建一个Filter实例对象,并调用init方法进行初始化(只有一次)。
  • 每次filter进行拦截的时候,都会执行doFilter方法。
  • 关闭服务器会销毁Filter对象。

FilterConfig对象的作用

  • 获取Filter程序在web.xml文件中的配置信息
public class MyFilter implements Filter{   	@Override	public void init(FilterConfig filterConfig) throws ServletException {   //		过滤器的名字		String filterName = filterConfig.getFilterName();//		获取初始化参数		String username = filterConfig.getInitParameter("username");		String password = filterConfig.getInitParameter("password");//		获取所有初始化参数的名称		Enumeration
names = filterConfig.getInitParameterNames(); while(names.hasMoreElements()) { String name = names.nextElement(); String value = filterConfig.getInitParameter(name); System.out.println(name + " " + value); } } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { } @Override public void destroy() { }}
MyFilter
com.abc.filter.MyFilter
username
leidaoge
password
abc
MyFilter
/*

5.过滤器的相关配置

* 
的配置* 完全路径匹配:/aaa /aa/bb* 目录匹配:/* /aa/* * 扩展名匹配:*.html,*.jsp* *
的配置* 专门以Servlet的配置的名称拦截Servlet* *
的配置* 默认:REQUEST 过滤器会拦截请求* FORWARD:转发* INCLUDE:页面包含的时候进行拦截* ERROR:页面出现全局错误跳转的时候拦截

6.通用字符集编码过滤器

  • 目的:解决多个Servlet程序都要设置编码的繁琐

解决方法:增强request.getParameter()方法

增加一个类的方法

  • 继承:必须要控制这个类的构造
  • 造个类实现接口

继承包装类HttpServletRequestWrapper

package com.abc.filter;import java.io.UnsupportedEncodingException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class CharacterRequest extends HttpServletRequestWrapper{   	private HttpServletRequest request;	public CharacterRequest(HttpServletRequest request) {   		super(request);		this.request = request;	}	@Override	//增强request.getParameter()方法:	public String getParameter(String name) {   		//获得请求方式:		String method = request.getMethod();		if("GET".equalsIgnoreCase(method)) {   			//get方式的请求			String value = super.getParameter(name);			try {   				value = new String(value.getBytes("ISO-8859-1"),"UTF-8");			} catch (UnsupportedEncodingException e) {   				// TODO Auto-generated catch block				e.printStackTrace();			}			return value;		}else if("POST".equalsIgnoreCase(method)) {   			//post方式的请求			try {   				request.setCharacterEncoding("UTF-8");			} catch (UnsupportedEncodingException e) {   				// TODO Auto-generated catch block				e.printStackTrace();			}		}		return super.getParameter(name);	}}

过滤器:

public class CharacterFilter implements Filter{   	@Override	public void init(FilterConfig filterConfig) throws ServletException {   	}	@Override	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)			throws IOException, ServletException {   		//在过滤器中增强request对象,并将增强后的request对象传递给Servlet		HttpServletRequest req = (HttpServletRequest)request;		//增强req		CharacterRequest add_req = new CharacterRequest(req);		chain.doFilter(add_req, response);	}	private void destry() {   	}}

配置filter:

CharacterFilter
com.abc.filter.CharacterFilter
CharacterFilter
/*

提交页面(测试):

用于获取当前工程路径

pageContext.request.contextPath

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
Insert title here

get提交方式

姓名:

post提交方式

姓名:
上一篇:JDBC的入门
下一篇:Servlet技术入门

发表评论

最新留言

不错!
[***.144.177.141]2025年03月22日 17时36分47秒