Filter概述
过滤器Filter是 JavaWeb三大组件(Servlet Filter Listener)之一,它能够对Web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理。
Filter执行流程

Filter的使用
使用Filter需要创建一个类,实现javax.servlet.Filter接口,并重写里面所有方法

init():服务器启动时,就会创建该Filter,并会执行init方法,进行初始化。
destory():服务器关闭,过滤器被销毁时会执行的方法。
doFilter():该方法是过滤器的核心方法,用户的请求会进入该方法,我们可以编写代码逻辑进行请求的过滤,如果允许请求通过,执行 chain.doFilter(req, resp),该方法会给请求放行,过滤器接收到返回结果后,会执行chain.doFilter()方法之后的代码。

如果不允许通过,不写 chain.doFilter(req, resp)即可,执行执行完当前方法后便会自动返回给前台。
代码示例:
定义一个Serlvet,请求路径为/MyServlet
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
System.out.println("MyServlet执行!!");
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
doPost(request,response);
}
}
定义一个Filter:
@WebFilter 注解,filterName属性定义了该Filter的名称,value属性定义了该Filter的拦截路径
@WebFilter(filterName = "MyFilter",value = "/MyServlet")
public class LoginFilter implements javax.servlet.Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("逻辑代码1");
chain.doFilter(req, resp);
System.out.println("逻辑代码2");
}
public void init(FilterConfig config) throws ServletException {
}
}
# 多个Filter的执行顺序
如果有一条路径被多个过滤器拦截,那么多个过滤器的执行顺序是什么呢?
1:注解配置
当有多个过滤器时,是按照过滤器类的首字母的先后顺序执行
如果AFilter,BFilter都拦截同一条路径,先过滤AFilter,后执行BFilter。
2:web.xml配置
当有多个过滤器时,是按照web.xml中 < filter-mapping>配置的先后先后顺序执行的,以下 的执行顺序为MyServlet---->MyServlet2
```java
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.lg.filter.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>MyServlet2</servlet-name>
<servlet-class>com.lg.filter.MyServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
Filter拦截转发请求
默认情况下,过滤器只能拦截直接访问的资源,不能拦截转发访问的资源.如果想让过滤器拦截转发的资源,需要修改@WebFilter中DispatcherType属性.
DispatcherType:
REQUEST:默认值,代表直接访问某个资源时执行filter
FORWARD:转发时才执行filter。
@WebFilter(value = "/login",dispatcherTypes={DispatcherType.REQUEST,DispatcherType.FORWARD})
Filter的应用-全局乱码解决
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1:解决请求参数乱码
HttpServletRequest request = (HttpServletRequest)req;
String method = request.getMethod();
if(method.equals("POST")) {
req.setCharacterEncoding("UTF-8");
}
resp.setContentType("text/html;charset=UTF-8");
chain.doFilter(req, resp);
}
本文介绍了JavaWeb的Filter过滤器,作为三大组件之一,它能拦截Web资源并进行处理。详细阐述了Filter的执行流程,包括init(), destroy()和doFilter()方法。通过示例代码展示了Filter的创建和使用,以及如何配置Filter来拦截转发请求。最后,讨论了Filter在解决全局乱码问题中的应用。"
110237421,9124535,Postman处理Cookie解析与传递,"['接口测试', 'Postman']
667

被折叠的 条评论
为什么被折叠?



