过滤器的处理方式
Servlet过滤器主要用于过滤客户端的请求,可以改变请求中的内容来满足实际开发的需要,然后将过滤后的请求转交给下一资源。
在Web容器中部署了过滤器后,不仅客户端发送的请求会经过过滤器的处理,而且请求在发送到目标资源处理以后其回应的信息也同样要经过过滤器。
如果一个过滤器不能满足业务需要,那么可以部署多个过滤器进行多次处理,这样就组成了一个过滤器链,WEB容器按过滤器的先后顺序处理请求。
过滤器的核心对象
过滤器对象放置在javax.servlet包中,其名为Filter,它是一个接口。出这个接口外,与过滤器相关的对象还有FilterConfig与FilterChain对象,这两个对象也是接口对象,位于javax.servlet包中,分别为过滤器的配置对象与过滤器的传递工具。定义过滤器只需要直接或间接的实现Filter接口。
- Filter接口的主要方法
public class myFilter implements Filter {
//过滤器初始化方法,此方法在初始化过滤器时直接使用
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
//对请求进行过滤处理
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
//销毁方法以释放资源
@Override
public void destroy() {
}
}
- FilterConfig接口的主要方法
class myFilterConfig implements FilterConfig{
//用于获取过滤器名称
@Override
public String getFilterName() {
return null;
}
//获取过滤器上下文
@Override
public ServletContext getServletContext() {
return null;
}
//获取过滤器的初始化参数值
@Override
public String getInitParameter(String s) {
return null;
}
//获取过滤器的所有初始化参数
@Override
public Enumeration<String> getInitParameterNames() {
return null;
}
}
- FilterChain接口的方法
class myFilterChain implements FilterChain{
//此方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器是过滤链中的最后一个过滤器,那么请求将传送给目标资源
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException, ServletException {
}
}
配置过滤器
/**
* filterName:用于指定Servlet过滤器名。
* urlPatterns:用于指定哪些URL使用该过滤。/*表示所有页面。
* initParams:用于指定初始化参数。
*/
@WebFilter(filterName = "DemoFilter",urlPatterns = {"/*"},initParams = {@WebInitParam(name = "mood",value = "awake")})
public class myFilter implements Filter {
}
//例如采用注解的方式配置一个作用于index.jsp文件的过滤器myFilter
@WebFilter(filterName = "myFilter",urlPatterns = {"/index.jsp"})
public class myFilter implements Filter {
}
创建一个过滤器,实现网站访问统计量的功能,并在配置过滤器时,将网站访问量的初始值设置为100.
创建并配置过滤器:
@WebFilter(filterName = "myFilter",urlPatterns = {"/index.jsp"},initParams = {@WebInitParam(name = "visitCount",value = "100")})
public class myFilter implements Filter {
private int visitCount;
//过滤器初始化方法,此方法在初始化过滤器时直接使用
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String param=filterConfig.getInitParameter("visitCount");
visitCount=Integer.valueOf(param);
}
//对请求进行过滤处理
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
visitCount++;
//将ServletRequest转化为HttpServletRequest
HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
//获取SevrletContext
ServletContext context=servletRequest.getServletContext();
context.setAttribute("visitCount",visitCount);
filterChain.doFilter(servletRequest,servletResponse);
}
//销毁方法以释放资源
@Override
public void destroy() {
}
}
index.jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
您是第【<%=application.getAttribute("visitCount")%>】位访客。
</body>
</html>
字符编码过滤器
@WebFilter(filterName = "myFilter",urlPatterns = {"/*"},initParams = {@WebInitParam(name = "encoding",value = "UTF-8")})
public class myFilter implements Filter {
private String encoding=null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
encoding=filterConfig.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if(encoding!=null){
servletRequest.setCharacterEncoding(encoding);
servletResponse.setContentType("text/html;charset="+encoding);
}
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}