1. 过滤器Filter
1.1. Filter介绍
Filter也称之为过滤器,是JAVA WEB中一门十分实用的技术,通过Filter可以对we5资源进行控制和管理,例如可以对Jsp,Servlet等进行拦截。
Filter过滤器运行流程:优先于servlet以及jsp之前运行。
应用场景:可以实现URL级别的权限访问控制、过滤敏感词汇等一些高级功能。
1.2. 创建一个过滤器
1.2.1. 手动创建
(1)新建FirstFilter
package zzs.filter.filter;
import javax.servlet.*;
import java.io.IOException;
public class FirstFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// String filterName = filterConfig.getFilterName();
// String initParameter = filterConfig.getInitParameter("param");
// ServletContext servletContext = filterConfig.getServletContext();
// System.out.println(filterName+"--"+initParameter);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filter运行了");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
(2)配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>first</filter-name>
<filter-class>zzs.filter.filter.FirstFilter</filter-class>
<init-param>
<param-name>param</param-name>
<param-value>value</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>first</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
(3)新建TestFilterServlet
package zzs.filter.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "TestFilterServlet", urlPatterns = "/testFilter")
public class TestFilterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// response.setContentType("text/html;charset=utf-8");
response.getWriter().write("testFilter已经被访问了");
// request.getRequestDispatcher("/servlet2").forward(request,response);
}
}
(4)运行
已被过滤
(5)放行运行
放行
filterChain.doFilter(servletRequest,servletResponse);//放行
1.2.2. 自定创建
New–>Create New Filter
package zzs.filter.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "TestFilter",urlPatterns = "/*",dispatcherTypes =DispatcherType.REQUEST)
public class TestFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
1.3. Filter生命周期和API
1.3.1. Filter生命周期
(1)Filter何时创建:服务器启动时就创建该Filter对象
(2)Filter何时销毁:服务器关闭时Filter销毁
1.3.2. Filter API
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//获取 filter名字
String filterName = filterConfig.getFilterName();
//获取 filter参数(初始化信息)
String initParameter = filterConfig.getInitParameter("param");
//获取 filter上下文对象
ServletContext servletContext = filterConfig.getServletContext();
System.out.println(filterName+"--"+initParameter);
}
FilterChain
FilterChain:过滤器链对象,通过该对象的doFilter方法可以放行该请求–经常使用,当有多个过滤器的时候doFilter方法会将请求发送给下一个过滤器,直至发送给对应的servlet后者jsp处理。
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain)
throws IOException, ServletException {
System.out.println("filter运行了");
filterChain.doFilter(servletRequest,servletResponse);//放行
}
1.4. Filter的基本配置
1.4.1. url-pattern配置
(1)以“/”字符开头,并以“/”结尾的字符串用于路径映射
例如:/net/zixue/
(2)以“*.”开头的字符串被用于扩展名映射。
例如 *.jsp
(3)空字符串(””)是用于指定精确映射应用程序 contextroot 的 URL 模式,例如从 http://www.baidu.com/ 来的请求。
(4)字符串中仅有“/”字符时,表示应用程序“默认”的servlet。在这种情况下 servlet 路径是请求 URI 去掉context 路径,且路径信息为 null。
1.4.2. dispatcher配置
dispatcher:访问的方式(了解)
(1)REQUEST:默认值,代表直接访问某个资源时执行filter。
(2)FORWARD:转发时才执行filter。
(3)INCLUDE:包含资源时执行filter。
(4)ERROR:发生错误时 进行跳转是执行fi1terASYNC:异步servlet的时候需要使用。
1.4.3. 注解方式和web.xml形式
注解方式配置:
@WebFilter(filterName ="FirstFilter",urlpatterns ="/*",dispatcherTypes =DispatcherType.REQUEST)
package zzs.filter.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "TestFilter",urlPatterns = "/*",dispatcherTypes =DispatcherType.REQUEST)
public class TestFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
1.5. 案例解决中文输出乱码问题
1.5.1. 案例 字符编码Filter
背景知识:我们在学习过程中发现乱码问题比较常见,比如我们通过response.getWriter0.writer()方法输出汉字的时候必须设置setContentType(),那如果开发过程中每个servlet都要书写这个就很麻烦,因此我们通过Fi1ter过滤器,将所有输入和输的的内容都设置一次编码方式,这样就方便的解决了乱码问题。
1.5.2. 示例
(1)创建过滤器CharsetFilter
package zzs.filter.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;
@WebFilter(filterName = "CharsetFilter", urlPatterns = "/*",
initParams = {@WebInitParam(name = "encoding",
value = "text/html;charset=utf-8")})
public class CharsetFilter implements Filter {
private String encoding;
public void destroy() {
encoding = null;
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
if (encoding != null) {
resp.setContentType(encoding);
}
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
encoding = config.getInitParameter("encoding");
}
}
(2)创建TestFilterServlet
package zzs.filter.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "TestFilterServlet", urlPatterns = "/testFilter")
public class TestFilterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
//response.setContentType("text/html;charset=utf-8");
response.getWriter().write("testFilter已经被访问了");
//请求转发
//request.getRequestDispatcher("/servlet2").forward(request, response);
}
}
(3)运行
@WebFilter(filterName = "CharsetFilter", urlPatterns = "/",
initParams = {@WebInitParam(name = "encoding",
value = "text/html;charset=utf-8")})
@WebFilter(filterName = "CharsetFilter", urlPatterns = "/*",
initParams = {@WebInitParam(name = "encoding",
value = "text/html;charset=utf-8")})