1、介绍
Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态资源文件等进行拦截,从而实现一些特殊的功能。例如实现URL的权限访问控制、过滤敏感词汇、压缩响应信息等功能。
它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。
2、Filter开发步骤: 1)编写java类实现Filter接口,并实现其doFilter方法。 2)在web.xml文件中注册filter类,并设置它所能拦截的资源
使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
3、Filter的生命周期
1)服务器启动时,web服务器创建Filter的实例对象,并调用其init方法,完成对象的初始化功能。filter对象只会创建一次,init方法也只会执行一次。
2)拦截到请求时,执行doFilter方法。可以执行多次。
3)服务器关闭时,web服务器销毁Filter的实例对象。
二、简单Demo1、filter类
public class EncodeFilter implements Filter{
private String encode;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//设置编码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//禁用浏览器缓存
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", -1);
//放行通过,如果后续还有其它过滤器,则进入到下一个过滤器,如果没有其它过滤器了,则到达目标访问资源
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
encode = filterConfig.getInitParameter("encode");
System.out.println(encode);
}
}
public class AuthFilter implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String path = request.getServletPath();
System.out.println("path="+path);
String uri = request.getRequestURI().toLowerCase();
System.out.println("uri="+uri);
//对uri进行一些判断操作
if (UrlUtils.isDynamicUrl(uri) && !UrlUtils.isNoLoginUrl(uri)) {
// 判断用户是否登录
Object user = request.getSession().getAttribute("user");
if (user == null) {// 未登录,响应登录界面
response.sendRedirect(request.getContextPath() + "/login.jsp");
return;
}
}else {
chain.doFilter(req, resp);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
2、web.xml 注册filter类
EncodeFilter
cn.jq.myservlet.filter.EncodeFilter
encode
UTF-8
EncodeFilter
/*
AuthFilter
cn.jq.myservlet.filter.AuthFilter
AuthFilter
/*
三、Filter对象——FilterConfig
在web.xml注册filter时,可使用为filter配置一些初始化参数,当web容器实例化Filter对象,调用其 init方法获取参数。
filterConfig对象的方法:
1)String getFilterName():得到filter的名称。
2)String getInitParameter(String name):返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
3)Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
4)public ServletContext getServletContext():返回Servlet上下文对象的引用。
四、过滤器链——FilterChain一个web应用中可以注册多个过滤器对某些web资源进行拦截,这些过滤器就称为过滤器链。
1、过滤器链作用:
当一个filter收到请求的时候,调用chain.doFilter才可以访问下一个匹配的filter,若当前的filter是最后一个filter,调用chain.doFilter才能访问目标资源
2、过滤器链的执行顺序:
多个filter的执行顺序是由web.xml中 filter-mapping的位置顺序决定(谁在前先执行谁)。
java web 过滤器跟拦截器的区别和使用
ends~