过滤器无法正常工作

Amr*_*nge -1 java servlets servlet-filters

我已经为servlet过滤器编写了演示程序.这是我的代码

这是我的Test类(servlet)

@WebServlet("/Test")
public class Test extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out=response.getWriter();
        System.out.println("we are in servlet");
        out.println("<h1>hello</h1>");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的TestFilter类(过滤器)

@WebFilter("/TestFilter")
public class TestFilter implements Filter {
    public TestFilter() {}
    public void destroy() {}

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("we are in Filter One");
        chain.doFilter(request, response);
    }
    public void init(FilterConfig fConfig) throws ServletException {}
}
Run Code Online (Sandbox Code Playgroud)

在这两个类中我都写了print语句来检查,TestFilter是在Test(class)之前执行的.

但我得到了输出

we are in servlet
Run Code Online (Sandbox Code Playgroud)

当TestFilter要执行时???

Sot*_*lis 5

在这种情况下,永远不会.你已经映射Filter到了/TestFiler没有被击中的网址/Test.

将其更改为

@WebFilter("/Test")
Run Code Online (Sandbox Code Playgroud)

这样它就匹配你的映射@WebServlet.

为了您的信息,您chain.doFilter在任何servlet 之前执行的任何代码以及之后放置的任何代码都将在servlet之后执行.

System.out.println("we are in Filter One, before");
chain.doFilter(request, response);
System.out.println("we are in Filter One, after");
Run Code Online (Sandbox Code Playgroud)