文章目录
一、Filter过滤器
web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
过滤器的作用:一般用于完成通过的操作。(如:登录验证,统一编码处理,敏感字符过滤)
二、实现Filter的步骤
1.定义类实现接口Filter
创建一个类实现Filter方法
package com.gql.filter;
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;
/**
* 类说明:
* Filter演示
* @author qianliangguo
*/
public class FilterDemo1 implements Filter {
}
2.复写方法
复写Filter接口中的三个方法。
filterChain.doFilter(servletRequest, servletResponse);
是放行语句。
package com.gql.filter;
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;
/**
* 类说明:
* Filter演示
* @author qianliangguo
*/
public class FilterDemo1 implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("Filter执行了...");
// 放行
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
3.配置拦截路径
xml的拦截路径相比注解配置麻烦一点,不过可以类比之前设置url-pattern为访问路径,只不过这里将访问路径变成了拦截路径。
(1)注解配置
比如,@WebFilter("/*")
:表示过滤掉所有的资源。
(2)xml配置
此处url-pattern中填的是拦截路径,而不是访问路径。
<filter>
<filter-name>demo1</filter-name>
<filter-class>com.gql.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
三、Filter的生命周期
下面的代码演示了Filter的生命周期:①先执行一次filter过滤器。②然后执行放行后的服务器中的资源③最后回来时再执行过滤器放行代码下的代码。
Filter的三个方法 | 说明 |
---|---|
init() | 在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次,用来加载资源。 |
doFilter() | 每一次请求被拦截资源时执行,执行多次。 |
destory | 服务器关闭后,Filter对象被销毁。如果服务器正常关闭,执行destory方法。只执行一次,用来释放资源。 |
package com.gql.filter;
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;
/**
* 类说明:
* Filter演示
* @author qianliangguo
*/
@WebFilter("/*")
public class FilterDemo1 implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
//对request请求消息增强
System.out.println("Filter执行了...");
// 放行
filterChain.doFilter(servletRequest, servletResponse);
//对response响应消息增强
System.out.println("Filter回來了...");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
JSP页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equive="content-type" content="text/html,charset=utf-8" />
</head>
<body>
<%
System.out.println("jsp中的Java代码执行了...");
%>
login页面
</body>
</html>
执行结果如下:
四、过滤器的配置
1.拦截路径配置
(1)拦截具体资源路径
/index.jsp
,只有访问index.jsp资源时,过滤器才会执行。
(2)拦截目录
/user/*
:访问/user下的所有资源时,过滤器都会执行。
(3)后缀名拦截
*.do
,访问所有后缀名为do的资源时,过滤器都会被执行。
(4)拦截所有资源
/*
,访问所有资源时,过滤器都会执行。
2.拦截方式配置
拦截方式:被资源访问的方式。(直接发送请求访问、转发访问、重定向等),可以使用注解配置和xml配置。
需要设置DescriptorFields属性,其取值有下面五种:
descriptorFields的取值 | 说明 |
---|---|
REQUEST | 默认值,浏览器直接请求资源。 |
FORWARD | 转发访问资源。 |
INCLUDE | 包含访问资源。 |
ERROR | 错误跳转资源 |
ASYNC | 异步访问资源 |
- xml的配置是在dispatcher标签中,也是上面五种取值
<filter>
<filter-name>demo1</filter-name>
<filter-class>com.gql.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
五、过滤器链
多个过滤器的执行顺序
是按照顺序执行的。
假设有两个过滤器,name执行顺序就是
- ↓过滤器1
- ↓过滤器2
- ↓资源执行
- ↓过滤器2
- ↓过滤器1
过滤器先后顺序问题:
(1)注解配置
注解配置是按照类名的字符串比较规则比较,值小的先执行。
(2)xml配置
谁的<filter-mapping>
定义在上面,谁就先执行。