filter简介:
是在服务器中的一个web组件,他可以过滤客户端和web资源之间的请求和响应信息。
作用:
检查用户访问权限
设置请求响应编码,解决乱码问题
声明周期:
filter的声明周期大致和servlet一致,只不过实现了filter类的那个类的实例化在servlet之前。
先执行Filter的构造方法
然后执行Filter的init()方法,对象创建后,马上就被调用,对Filter做一些初始化操作
执行Filter的doFilter()方法,每次访问目标资源,只要匹配过滤的地址,就会调用。
执行Filter的destroy()方法,服务器停止时调用,用来释放资源。
应用 实现filter接口:
@WebFilter("/*")//是以一个注解,大致意思是,在所有路径加都要进入这个过滤器,(路径问题看后面)
当然也可以在web.xml中配置(放在了这两段代码后)
package com.thekingqj.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet Filter implementation class SetCharFilter
*/
@WebFilter("/*")
public class SetCharFilter extends HttpFilter {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
chain.doFilter(request, response);//必须要有这个方法,不然过滤器不会放开往后执行
//不带用这个chain.doFilter方法会阻止用户继续向下访问
}
}
下面这个相当于HTTPServlet类中的实现方式
package com.thekingqj.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet Filter implementation class HttpServlet
*/
public abstract class HttpFilter implements Filter {
private FilterConfig filterConfig;
public FilterConfig getFilterConfig() {
return filterConfig;
}
public ServletContext getServletContext() {
return filterConfig.getServletContext();
}
public HttpFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response;
doFilter(req, res, chain);
}
public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException;
public void init(FilterConfig fConfig) throws ServletException {
filterConfig=fConfig;
}
}
<filter>
<!-- 给SetCharFilter起一个名字 -->
<filter-name>SetCharFilter</filter-name>
<!-- 是哪一个Filter类 -->
<filter-class>com.thekingqj.filter.SetCharFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SetCharFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
filter的拦截路径的设置:
-
第一种:通过filter-mapping的url-pattern来配置(与Servlet的url-pattern的规则相同)
-
精确匹配:/路径/资源名
比如:/index.html、/hello/index.jsp 、 /client/LoginServlet 等,只要在请求地址完全一样时才会调用Filter
-
目录匹配:/路径名/*
比如1:/abc/* 表示可以拦截abc目录下的所有资源,甚至是abc目录下的其他目录。其中:/* 表示访问 当前工程下所有资源
比如2:/* 表示只要访问项目根目录下的资源就会调用Filter
-
后缀名匹配:*.后缀名
比如:*.jsp 表示拦截所有后缀为jsp文件资源
-
-
第二种:通过filter-mapping中的servlet-name来指定要过滤的Servlet
-
在项目中有一个Filter加做HelloFilter,一个Servlet叫做HelloServlet。在Filter的filter-mapping中增加了一个servlet-name标签,将该标签的值设置成Servlet的名字,在访问Servlet时就会调用该过滤器过滤请求。
-