Filter通常在一个web应用上的主要功能之前或之后执行一小段功能,比如判断用户是否有访问的权限。
Filter实现javax.servlet.Filter接口,由方法doFilter实现过滤功能。
Filter指南:
http://www.avajava.com/tutorials/lessons/what-is-a-filter-and-how-do-i-use-it.html
指南中的例子:显示url请求参数
public class MyFilter implements Filter {
FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
…
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
servletResponse.setContentType("text/html");
PrintWriter out = servletResponse.getWriter();
out.println("my-param (InitParameter): " + filterConfig.getInitParameter("my-param"));
out.println("<br/><br/>Parameters:<br/>");
Enumeration<String> parameterNames = servletRequest.getParameterNames();
if (parameterNames.hasMoreElements()) {
while (parameterNames.hasMoreElements()) {
String name = parameterNames.nextElement();
String value = servletRequest.getParameter(name);
out.println("name:" + name + ", value: " + value + "<br/>");
}
} else {
out.println("---None---<br/>");
}
out.println("<br/>Start Regular Content:<br/><hr/>");
filterChain.doFilter(servletRequest, servletResponse);
out.println("<br/><hr/>End Regular Content:<br/>");
}
}
@WebFilter注解
除了在web.xml中配置Filter外,也可以使用@WebFilter注解。
@WebFilter例子
http://www.codejava.net/java-ee/servlet/webfilter-annotation-examples
@WebFilter的urlPatterns属性是必须的,被@WebFilter注解的类必须实现javax.servlet.Filter接口。
@WebFilter(
attribute1=value1,
attribute2=value2,
...
)
public class TheFilter implements javax.servlet.Filter {
// implements Filter's methods
}
Argo中的过滤器
/**
* 利用Filter来实行调度
*/
@WebFilter(urlPatterns = {"/*"},
dispatcherTypes = {DispatcherType.REQUEST},
initParams = {@WebInitParam(name = "encoding", value = "UTF-8")}
)
public class ArgoFilter implements Filter {
private ArgoDispatcher dispatcher;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
ServletContext servletContext = filterConfig.getServletContext();
try {
dispatcher = ArgoDispatcherFactory.create(servletContext);
dispatcher.init();
} catch (Exception e) {
servletContext.log("failed to argo initialize, system exit!!!", e);
System.exit(1);
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpReq = (HttpServletRequest) request;
HttpServletResponse httpResp = (HttpServletResponse) response;
dispatcher.service(httpReq, httpResp);
}
@Override
public void destroy() {
dispatcher.destroy();
}
}
@WebFilter(urlPatterns = {"/*"}表示ArgoFilter将过滤所有请求