一、什么是过滤器(作用)?
二、编写过滤器步骤:
三、Filter过滤器的三个方法:
a) Init方法。创建Filter时被调用,只调用一次,在该方法中做一些数据的准备工作,可通过传入的FilterConfig参数获取web.xml文件中配置提供给过滤器的参数;
b) doFilter方法。该方法内编写过滤器的具体处理逻辑,会多次执行。此方法共三个参数:请求、响应和FilterChain。请求和响应用于获取数据和追加数据;FilterChain是过滤器链,负责过滤器的传递。
c) destroy方法。只在销毁过滤器对象时被调用一次,用于释放一些资源的操作。
四、Filter的工作原理:
实现Filter接口时,重写了三个方法:init()、doFilter()、destroy()。执行实现此接口的类时,init方法首先被执行,初始化此过滤器。其中init方法中传入了FilterConfig参数,可以获取web.xml中此过滤器的初始化参数。
然后执行doFilter方法,此方法传入三个参数ServletRequest、ServletResponse、FilterChain。FilterChain对象也提供了一个doFilter方法,其中web资源会不会被访问取决于是否调用了FilterChain对象的doFilter方法。调用此方法,web资源被访问(web资源的service方法被访问),否则web资源不会被访问。
当Filter被销毁时,调用destroy方法。且仅被调用一次,用于释放一些资源。
五、Filter的优先级:
一个web应用中可有多个过滤器,其优先级由web.xml中的配置顺序决定(按<filter-mapping>的顺序决定),先配置的先执行。
六、多个Filter的优先级:
七、过滤器拦截路径的设置:
a) /* 拦截所有
b) *.jsp 拦截所有jsp页面的请求和响应
c) /jsps/* 拦截jsps文件夹下的所有的资源
d) /LoginServlet 拦截映射路径(url-pattern)为/ LoginServlet的Servlet
e) Login 只拦截name为login的Servlet(可把jsp页面配成Servlet)
八、用过滤器配置统一编码格式的代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/TestServlet" method="post">
姓名:<input type="text" name="name"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
CharacterFilter.java
package bgs.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; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CharacterFilter implements Filter { private String encode ; @Override public void init(FilterConfig filterConfig) throws ServletException {
//调用CharacterFilter 的初始化参数 encode = filterConfig.getInitParameter("character"); System.out.println(encode); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response;
if(encode!=null){ req.setCharacterEncoding(encode); } chain.doFilter(req, resp); } @Override public void destroy() { // TODO Auto-generated method stub } }
TestServlet.java
package bgs.com.FilterServlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("get请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//在jsp页面获取提交过来的name并输出
String name = req.getParameter("name");
System.out.println(name);
}
}
web.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Filter718</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>TestFilter</filter-name>
<filter-class>bgs.com.Filter.TestFilter</filter-class>
</filter> -->
<filter>
<filter-name>CharacterFilter</filter-name>
<filter-class>bgs.com.Filter.CharacterFilter</filter-class>
<init-param>
<param-name>character</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>bgs.com.FilterServlet.TestServlet</servlet-class>
</servlet>
<filter-mapping>
<filter-name>CharacterFilter</filter-name>
<url-pattern>/*</url-pattern>// /*设置拦截所有的资源
</filter-mapping>
<!-- <filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/TestServlet</url-pattern>
</filter-mapping> -->
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
<!-- <listener>
<listener-class>bgs.com.listener.TestServletContextListener</listener-class>
</listener> -->
</web-app>