1、一个Filter的简单使用方法
Servlet为:
package servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Exec extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doGet(request, response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>Get</body></html>");
System.out.println("Executing Exec.doGet()");
}
}
Filter为:
package web;
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;
public class MyFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Pre MyFilter.doFilter()");
chain.doFilter(request, response);
System.out.println("Post MyFilter.doFilter()");
}
public void destroy() {
}
}
web.xml为:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>web.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/Exec</url-pattern>
</filter-mapping>
注意观察运行的输出,并尝试去除chain.doFilter(request, response)并观察效果
2、多个Filter的使用方法
增加Filter,为:
package web;
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;
public class YourFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Pre YourFilter.doFilter()");
chain.doFilter(request, response);
System.out.println("Post YourFilter.doFilter()");
}
public void destroy() {
}
}
增加web.xml为:
<filter>
<filter-name>yourFilter</filter-name>
<filter-class>web.YourFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>yourFilter</filter-name>
<url-pattern>/Exec</url-pattern>
</filter-mapping>
观察输出次序(嵌套)
3、多个Servlet和Filter的复杂调用
增加Servlet为:
package servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AnotherExec extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doGet(request, response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>AnotherExec.doGet</body></html>");
System.out.println("Executing AnotherExec.doGet()");
}
}
修改Exec,为:
package servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Exec extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doGet(request, response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>Exec.doGet</body></html>");
System.out.println("Executing Exec.doGet()");
try {
RequestDispatcher disp = request
.getRequestDispatcher("/AnotherExec");
disp.forward(request, response);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
增加web.xml为:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>web.MyFilter</filter-class>
</filter>
<filter>
<filter-name>yourFilter</filter-name>
<filter-class>web.YourFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/Exec</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>yourFilter</filter-name>
<servlet-name>AnotherExec</servlet-name>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
可以直接请求AnotherExec和Exec,分别查看输出
也可以删除<dispatcher>FORWARD</dispatcher>观察请求AnotherExec的效果
4、应用
4、1 查看执行时间
Filter为:
package web;
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.http.HttpServletRequest;
public class MyFilter implements Filter {
private FilterConfig config;
private String logPrefix;
public void init(FilterConfig config) throws ServletException {
this.config = config;
logPrefix = config.getInitParameter("Log Entry Prefix");
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
long begin = System.currentTimeMillis();
chain.doFilter(request, response);
long end = System.currentTimeMillis();
StringBuffer logMessage = new StringBuffer();
if (request instanceof HttpServletRequest) {
logMessage = ((HttpServletRequest) request).getRequestURL();
}
logMessage.append(": ");
logMessage.append(end - begin);
logMessage.append(" ms");
if (logPrefix != null) {
logMessage.insert(0, logPrefix);
}
System.out.println(logMessage.toString());
config.getServletContext().log(logMessage.toString());
//localhost_log.XXXX-XX-XX.txt
}
public void destroy() {
config = null;
logPrefix = null;
}
}
增加web.xml为:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>web.MyFilter</filter-class>
<init-param>
<param-name>Log Entry Prefix</param-name>
<param-value>Performance: </param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/Exec</url-pattern>
</filter-mapping>
4、2 Error处理
Filter为:
package web;
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;
public class MyFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Pre MyFilter.doFilter()");
chain.doFilter(request, response);
System.out.println("Post MyFilter.doFilter()");
}
public void destroy() {
}
}
修改web.xml为:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>web.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/error.jsp</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
此时请求不存在资源时会发生过滤,但是如果请求存在资源,如果页面中有response.sendError(404,"出错了!"),那么该错误页面仍然会被调用,过滤器也会工作
如修改index.jsp文件为:
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
</head>
<body>
<%
response.sendError(404, "Error");
%>
</body>
</html>
此时不会postfilter,只有prefilter