注:filter也是一个servlet,但是他要实现filter接口
![filter过滤器 filter过滤器]()
并且实现下面的方法
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
request.setCharacterEncoding(“utf-8″);
chain.doFilter(request, response);//这一句是必须的,不然程序会断掉。
}
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
3.web.xml
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.ru.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
一、什么是Servlet过滤器
过滤器是在数据交互之间过滤数据的中间组件,独立于任何平台或者 Servlet 容器。
Servlet过滤器可以应用在客户机和 servlet 之间、servlet 和 servlet 或 JSP 页面之间,以及所包括的每个 JSP 页面之间。
二、实现一个 Servlet 过滤器
Servlet过滤器 API 包含javax.servlet包中的 3 个接口,分别是 Filter 、 FilterChain 和 FilterConfig 。
实现一个 Servlet 过滤器的确要经历三个步骤。
1、编写 Servlet 过滤器实现类。
2、配置 Servlet 过滤器。把该过滤器添加到 Web 应用程序中(通过在 Web 部署描述符 /web.xml 中声明它);
3、部署 Servlet 过滤器。把过滤器与应用程序一起打包并部署它;
Servlet容器对部署描述符中声明的每一个过滤器,只创建一个实例(或实例池)。
与Servlet类似,容器将在同一个过滤器实例上运行多个线程来同时为多个请求服务,因此,开发过滤器时,也要注意线程安全的问题。
三、编写过滤器实现类
1、Filter接口:所有的Servlet过滤器类都必须实现javax.servlet.Filter接口
a、init(FilterConfig):
这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数。
b、doFilter(ServletRequest,ServletResponse,FilterChain):
这个方法完成实际的过滤操作,当客户请求访问于过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器。
c、destroy():
Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源。
2、过滤器实现类创建步骤(过滤器实现类生命周期):
a.实现javax.servlet.Filter接口。
b.初始化:实现init方法,读取过滤器的初始化参数。
c.过滤:实现doFilter方法,完成对请求或响应的过滤。
d.转发或阻塞:调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应。
e.析构:destroy方法销毁过滤器,释放过滤器占用的资源。
四、配置 Servlet 过滤器(在web.xml中配置)
过滤器通过 web.xml 文件中的两个 XML 标签来声明:
1、<filter> : 定义过滤器的名称,并且声明过滤器实现类和 init() 参数。
<filter-name> : 指定过滤器的名字;
<filter-class> : 指定过滤器类的类名,包括类的路径;
<init-param> : 为过滤器实例提供初始化参数,可以有多个;
2、<filter-mapping> : 将过滤器与 servlet 或 URL 模式相关联。
<filter-name> : 指定过滤器的名字,与<filter>中的子元素<filter-name>相对应;
<url-pattern> : 指定和过滤器关联的URL,为”
public class CheckLoginFilter implements Filter {
protected FilterConfig filterConfig = null;
private String redirectURL = null;
private List notCheckURLList = new ArrayList();
private String sessionKey = null;
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
if(sessionKey == null) {
filterChain.doFilter(request, response);
return;
}
if((!checkRequestURIIntNotFilterList(request)) &&
session.getAttribute(sessionKey) == null) {
response.sendRedirect(request.getContextPath() + redirectURL);
return;
}
filterChain.doFilter(servletRequest, servletResponse);
}
public void destroy() {
notCheckURLList.clear();
}
private boolean checkRequestURIIntNotFilterList(HttpServletRequest request) {
String uri = request.getServletPath() + (request.getPathInfo() == null ? “” : request.getPathInfo());
return notCheckURLList.contains(uri);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
redirectURL = filterConfig.getInitParameter(“redirectURL”);
sessionKey = filterConfig.getInitParameter(“checkSessionKey”);
String notCheckURLListStr = filterConfig.getInitParameter(“notCheckURLList”);
if(notCheckURLListStr != null) {
StringTokenizer st = new StringTokenizer(notCheckURLListStr, “;”);
notCheckURLList.clear();
while(st.hasMoreTokens()) {
notCheckURLList.add(st.nextToken());
}
}
}
}