【问题标题】:How to create a servlet filter in Eclipse?如何在 Eclipse 中创建一个 servlet 过滤器?
【发布时间】:2015-06-24 14:21:03
【问题描述】:

我是 servlet 技术的新手。我设置了 Java 7、Tomcat8 和 Eclipse。我在 Eclipse 上创建了几个 servlet 一切正常。

今天我创建了一个简单的 servlet 过滤器。但它没有在任何 servlet 之前执行。我可以看到使用 init 方法执行 控制台消息。根据 servlet 3.0,我没有使用 web.xml,而是使用 @WebFilter("/FilterDemo") 注释。

这里是servlet过滤器代码,

package net.codejava;

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.annotation.WebFilter;

/**
 * Servlet Filter implementation class FilterDemo
 */
@WebFilter("/FilterDemo")
public class FilterDemo implements Filter {

/** 
 * Default constructor. 
 */
public FilterDemo() {
    // TODO Auto-generated constructor stub
}

/**
 * @see Filter#destroy()
 */
public void destroy() {
    // TODO Auto-generated method stub
    System.out.println("Destroy is called.");
}

/**
 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
 */
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    // TODO Auto-generated method stub
    // place your code here

    String ipAddress = request.getRemoteAddr();
    System.out.println("Do Filter is called.");
    System.out.println(ipAddress);

    // pass the request along the filter chain
    chain.doFilter(request, response);
}

/**
 * @see Filter#init(FilterConfig)
 */
public void init(FilterConfig fConfig) throws ServletException {
    // TODO Auto-generated method stub
    System.out.println("Filter Init is called."); 
}

}

工作区截图:

任何帮助将不胜感激。

【问题讨论】:

  • 请分享过滤器触发的servlet的映射
  • @Mudassar:我知道我们需要为过滤器将触发的 servlet 添加映射。我认为 Eclipse 会自动为我创建。你能告诉我我需要在哪里添加该映射
  • :) 是的,我们确实需要像这样的 servlet 映射 @WebServlet("/FilterDemo") public class AnyServlet extends HttpServlet

标签: java eclipse servlets tomcat8


【解决方案1】:

过滤器位于 servlet 前面。在您的注释中,您指定过滤器应该只过滤去往/FilterDemo 的请求。您需要做的是将过滤器映射到与您的 servlet 之一相同的 URL,或者指定您希望过滤器对其进行处理的 servlet 的名称(使用 @WebFilterservletNames 参数注释。

【讨论】:

  • 非常感谢 Ian,我已经使用了 @WebFilter(filterName = "/FilterDemo",urlPatterns = "/HelloServlet" ) ,现在一切正常。
【解决方案2】:

尽管您使用的是@WebFilter 注释,但您必须在web.xml 中声明您的过滤器映射。

【讨论】:

  • Web.xml 不是强制性的,这对我有用@WebFilter(filterName = "/FilterDemo",urlPatterns = "/HelloServlet" )
  • 不,你没有。如果您需要过滤器以特定顺序执行,则仅需要 web.xml 文件。
  • 是的,但我认为这是推荐的,因为当您有多个过滤器时,您在 web,xml 中列出过滤器的顺序就是执行它们的顺序。跨度>
【解决方案3】:

根据 servlet 3.0

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet{...}

@WebFilter(filterName="filter1", urlPatterns={ "/LoginServlet" })
public class AuthenticationFilter implements Filter {..}

但您仍应将<url-pattern> 保留在 web.xml 中,因为它是 XSD 所必需的,尽管它可以为空:

<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern />
</filter-mapping>

另请参阅使用 Tomcat,@WebFilter doesn't work with inside web.xml

【讨论】:

    【解决方案4】:

    了解如何将 Servlet 映射到过滤器。

    web.xml:

    <filter>  
    <filter-name>f1</filter-name>  
    <filter-class>MyFilter</filter-class>  
    </filter>  
    
    <filter-mapping>  
    <filter-name>f1</filter-name>  
    <url-pattern>/servlet1</url-pattern> 
    </filter-mapping>  
    

    这里 /servlet1 是您的 servlet 的 url 模式(您要执行的)。

    【讨论】:

      猜你喜欢
      • 2014-07-05
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      相关资源
      最近更新 更多