1、简介
需要统一处理一些请求或者相应的操作
过滤器:filter
过滤器本质上就是一个servlet,本身就是一个特殊的servlet。
2、创建过滤器
写一个类,实现Filter,接口,实现Filter中的三个方法
- init
- doFilter
- destroy
MyFilter 类
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.annotation.WebFilter;
//@WebFilter("/*")
public class MyFilter implements Filter {
/**
* 初始化方法
*/
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("只会触发一次,而且是第一次");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
System.out.println("请求之前我们需要做的,过滤在进入servlet之前"); //客户端请求到服务端请求的时候
//继续放行
chain.doFilter(req, resp);//正常情况下,这个方法一定要写,不然相当于把客户端请求打回去了,使不能进入servlet
System.out.println("请求响应后的操作");//服务端--客户端
}
@Override
public void destroy() {
System.out.println("只会触发一次,服务器停止运行时销毁资源");
}
}
MyServlet类
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = {"/us","/ua"},initParams = {
@WebInitParam(name="age",value = "16"),
@WebInitParam(name="gender",value = "男")
})
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Hellow world");
}
}
如果在doFilter()方法中不加放行的效果
chain.doFilter(req, resp);
访问不到servlet
3、过滤器的配置
和servlet保持相同
Filter配置文件
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.oplab.servlet.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<!-- /*表示拦截所有请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
Filter的注解
@WebFilter("/*")
web.xml配置初始化参数(有参数建议使用这个)
<servlet>
<servlet-name>Myservlet</servlet-name>
<servlet-class>com.oplab.servlet.filter.MyServlet</servlet-class>
<init-param>
<param-name>age</param-name>
<param-value>16</param-value>
</init-param>
<init-param>
<param-name>gender</param-name>
<param-value>男</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Myservlet</servlet-name>
<url-pattern>/ma</url-pattern>
</servlet-mapping>
注解配置初始化参数
@WebServlet(urlPatterns = {"/us","/ua"},initParams = {
@WebInitParam(name="age",value = "16"),
@WebInitParam(name="gender",value = "男")
})
4、Filter的使用场景
- 权限过滤
- 编码过滤
- 认证过滤
- …
如果需要对一系列请求需要操作的时候,建议使用filter统一操作
通用过滤器post请求中文乱码问题
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.annotation.WebFilter;
public class CharacterEncodingFilter implements Filter {
private String encoding;
public void init(FilterConfig fConfig) throws ServletException {
encoding=fConfig.getInitParameter("encoding");
if(encoding==null||"".equals(encoding.trim())) {
encoding="utf-8";
}
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//将请求头响应的编码默认设置
request.setCharacterEncoding("encoding");
response.setCharacterEncoding(encoding);
chain.doFilter(request, response);
//response.setContentType("text/html;charset=utf-8");
}
public void destroy() {
}
}
配置文件
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.oplab.servlet.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>
</filter-mapping>