过滤器
过滤器的介绍
filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目 标资源访问前后进行逻辑处理
过滤的目的:
实际上在JavaEE中,使用过滤器的目的也就是这两个,过滤器在java EE中也叫做Servlet程序,后面讲解的监听器也属于Servlet范畴
- 安全
- 干净
Servlet有三种:
- 标准的Servlet
- 过滤的Servlet
- 监听的Servlet
过滤器是在Servlet2.3加入的新功能,当用户需要限制某些操作的时候,就可以进行过滤器进行过滤,是以一种组件的形式绑定到web程序中,与其他组件不同的是,过滤器采用的是链式的方式进行处理。
作用
过滤器目前在开发中,主要的作用有三个:
- 过滤非法文字
- 请求请求统一编码的设置
- 过滤非法用户
过滤器的实现
在java EE中过滤器的实现非常简单,只需要实现一个过滤接口:Filter接口,这个接口中有三个方法:
- 过滤器服务方法:void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- 过滤器的销毁:void destroy()
- 过滤器的初始化:void init(FilterConfig filterConfig)
1 | import java.io.IOException; |
过滤器写好了之后,目前没有运行,因为过滤器还需要进行配置,配置的形式有两种:
- 配置web.xml文件
- 使用注解
第一种:在web.xml中配置过滤器
1
2
3
4
5
6
7
8
9
10<!-- 配置过滤器 -->
<filter>
<filter-name>过滤器名字</filter-name>
<filter-class>过滤器的类的地址</filter-class>
</filter>
<filter-mapping>
<filter-name>过滤器名字</filter-name>
<!-- 表示过滤器仅仅过滤/index.jsp 这个请求地址 * 表示过滤所有的请求地址 -->
<url-pattern>过滤的请求地址</url-pattern>
</filter-mapping>
以上配置的Servlet只能在地址栏请求index.jsp的时候才会执行,但是在开发中,过滤器一般都是配置所有请求,也就是说过滤器会过滤所有的请求。1
2
3
4
5
6
7
8@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("过滤器doFilter");
//如果想要继续执行操作的话可以使用
filterChain.doFilter(request, response);//继续向下执行
//这个时候过滤器的操作就很明显了 只要按照特定的要求是否能够继续向下执行问题
}
第二种:通过注解的方式完成过滤器配置
1
@WebFilter("*")
通过运行发现过滤器的生命周期:
- 在tomcat启动的时候Filter会进行初始化
- 每次浏览器访问过滤器过滤的地址的时候,过滤器的doFilter方法都会执行
- 过滤器的销毁是在tomcat关闭的时候销毁
过滤具体的使用
过滤非法文字:比如提交的内容中,还有反动话语,或者骂人的脏话,不能够向下执行。
1
2
3
4
5
6
7
8
9
10
11
12
13System.out.println("过滤器doFilter");
boolean flag = true;
Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()) {
if(request.getParameter(names.nextElement()).equals("TMD")) {
System.out.println("非法文字");
flag = false;
}
}
if(flag) {
chain.doFilter(request, response);
}对请求编码进行统一的设置
1
2
3
4
5
6
7public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("过滤器doFilter");
request.setCharacterEncoding("utf-8");//设置请求的统一编码
filterChain.doFilter(request, response);//继续向下执行
}过滤非法用户:比如我们网银系统,没有登录的人是不能够查询账户信息、余额、交易记录的,再比如我们的教务系统,没有登录是什么也不能做的。
1 | import java.io.IOException; |
小结
- 过滤器属于一种自动的Servlet,能够自动的执行
- 过滤器的配置有两种方式,一种是通过web.xml配置,第二种是通过注解的形式完成
- 过滤的常见的操作就是过滤非法文字、非法用户和设置统一的编码