JavaWeb三大组件之过滤器Filter
程序员文章站
2024-02-09 17:12:16
...
过滤器
- 简述
- 过滤器同Servlet结构大致相同,但功能上有着很大差异,在JavaWeb中它负责拦截一些没必要或被限制的访问,即过滤请求或进行一些初始化的设置。
注:当用户访问某个Servlet或者其它文件时,首先会执行部署在这个请求上的Filter,如果Filter“放行”,则请求成功,如果“不放行”,则请求被拦截,访问失败! - 如何实现
- 1.新建类实现Filter接口
- 2.在web.xml中注册(与Servlet相似)
- 过滤的内容:
- jsp、Servlet、css、js等都可以过滤
xml配置内容及过滤器的实现
xml配置内容
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>tqb.filter.demo1.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<!-- <url-pattern>/*</url-pattern>指的是过滤所有内容 -->
<!-- <url-pattern>/AServlet</url-pattern>指的是过滤AServlet -->
<url-pattern>/AServlet</url-pattern>
</filter-mapping>
过滤器的实现
package tqb.filter.demo1;
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;
public class MyFilter implements Filter {
/**
* 过滤器销毁之前执行
*/
@Override
public void destroy() {
System.out.println("destroy()...");
}
/**
* 每访问一次被过滤的内容,执行一次该方法
* FilterChain:过滤器链,负责“放行”
*/
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain fc)
throws IOException, ServletException {
System.out.println("执行doFilter()...过滤!");
//对过滤的内容进行"放行"
fc.doFilter(req, resp);
System.out.println("放行成功!!!");
}
/**
* 过滤器创建之后执行,可进行一些初始化的设置
*/
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("init()...");
}
}
Filter#FilterConfig介绍
该类同ServletConfig类似,具体方法如下
方法 | 作用 |
---|---|
getFilterName() | 获取过滤器的名称 |
getInitParameter() | 获取初始化参数值 |
getInirParameterNames() | 获取初始化参数 |
getServletContext() | 获取application(若不了解,请看Servlet相关内容) |
Filter#FilterChain介绍
方法 | 作用 |
---|---|
doFilter(ServletRequest req,ServletResponse resp) | 对过滤的内容进行放行(执行目标资源,或者执行下一个过滤器) |
多个过滤器的执行顺序
注:与filter-mapping在xml文件的顺序有关,谁在前先执行谁
新建Filter2过滤器
xml配置文件
<filter>
<filter-name>Filter2</filter-name>
<filter-class>tqb.filter.demo1.Filter2</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
java文件
package tqb.filter.demo1;
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;
public class Filter2 implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain fc)
throws IOException, ServletException {
System.out.println("Filter2_start");
fc.doFilter(arg0, arg1);
System.out.println("Filter2_stop");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
更改MyFilter中的doFilter方法为
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain fc)
throws IOException, ServletException {
System.out.println("Filter1_start");
//对过滤的内容进行放行
fc.doFilter(req, resp);
System.out.println("Filter1_stop");
}
浏览器访问AServlet的输出结果
Filter的四种拦截方式
请求(REQUEST)
转发(FORWARD)
包含(INCLUDE)
错误(ERROR)
如何配置?
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/AServlet</url-pattern>
<!-- 默认方式,即过滤请求 -->
<dispatcher>REQUEST</dispatcher>
<!-- 过滤转发 -->
<dispatcher>FORWARD</dispatcher>
<!-- 过滤包含 -->
<dispatcher>INCLUDE</dispatcher>
<!-- 过滤错误,如我们设置好的error页面(如下) -->
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<!--
<error-page>
<error-code>404</error-code>
<location>xxx</location>
</error-page>
-->
推荐阅读
-
JavaWeb三大组件之过滤器Filter
-
JavaWeb三大核心组件 - Servlet、Filter、Listener
-
JavaWeb三大组件(Servlet、Filter、Listener)
-
JavaWeb三大组件——Filter & Listener
-
JAVAWEB过滤器Filter的使用
-
javaweb三大组件Servlet Filter Listenser
-
JavaWeb三大组件之Filter
-
JavaWeb三大组件(Servlet、Filter、Listener)
-
Syong : JavaWeb三大组件Servlet,Filter,Listener
-
Servlet笔记 —— JavaWeb三大组件 Servlet,Filter,Listener