使用 java EE 6 注释的 Servlet 过滤?

Posted

技术标签:

【中文标题】使用 java EE 6 注释的 Servlet 过滤?【英文标题】:Servlet Filtering using java EE 6 annotation? 【发布时间】:2011-12-30 02:21:51 【问题描述】:

是否可以在 EE 6 中使用 @ApplicationPath 和 @Path 注解来模拟 servlet 过滤器链?

例子:

@ApplicationPath("/api")
class Filter extends Application  
    @Path("/*")
    public void filter() 
        log.info("Request to API");
    

...

@Path("/foo")
class Foo 
    @GET
    @Path("/bar")
    @Produces("text/plain")
    public String bar() 
        return "Hello World";
    

URL 应该是http://foobar.com/api/foo/bar,但是“filter”方法会被调用,就好像它是一个 servlet 过滤器链一样。我知道上面的方法行不通,但是这种方法中是否有注释方法可以实现与从 web.xml 文件配置“过滤器”相同的效果?

【问题讨论】:

【参考方案1】:

JBoss 7(甚至已经是 JBoss 6)支持 Java EE 6,而后者又涵盖了 Servlet 3.0。也许您的 web.xml 被错误地声明为符合 Servlet 2.5,导致 @WebFilter 根本无法工作。确保您的 web.xml 的根声明已声明符合 Servlet 3.0,如下所示:

<web-app 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

那么你就可以使用@WebFilter:

@WebFilter("/api/*")
public class FooFilter implements Filter 

    // ...


顺便说一下,您在此处展示的示例是 JAX-RS 的一部分,它是构建在 Servlet 之上的另一个 API(一种 RESTful Web 服务 API)。要了解有关 JAX-RS 的更多信息,Jersey user guide 可能会很有用。

另见:

Our Servlet-Filters wiki page

【讨论】:

这是否允许我在没有 web.xml 文件的情况下配置过滤器,或者我可以只使用注释吗? 您不需要在web.xml 中通过&lt;filter&gt;&lt;filter-mapping&gt; 指定它们。但是,如果您还没有web.xml,那也很好。无法使用 @WebFilter 并声明您正在使用 Servlet 2.5,但表明您已经拥有 web.xml,而 web.xml 又被错误地声明为符合 Servlet 2.5。还是您自己根本没有尝试过任何事情? 感谢您澄清我所说的!是的,我自己已经尝试了很多 - 将软件从 JBoss 6 移植到 Jboss 7。现在回到问题:“......在同类中是否有一种带注释的方法可以实现与配置“过滤器”相同的效果web.xml 文件?”。很明显,我正在寻找不需要 web.xml 文件的解决方案。谢谢 我已经回答过:使用@WebFilter。阅读注释的所有选项的文档:download.oracle.com/javaee/6/api/javax/servlet/annotation/… 您唯一无法控制的是过滤器的顺序。为此你仍然需要web.xml,另请参阅***.com/questions/6560969/…

以上是关于使用 java EE 6 注释的 Servlet 过滤?的主要内容,如果未能解决你的问题,请参考以下文章

Java EE 1.5 Servlet – http 方法 OPTIONS 给出“405 Method Not Allowed”

Java知识总结-6

Java EE - Servlet 小结

Java EE 6 安全性和重定向

Java EE - Servlet 3.0 和 Spring MVC

互联网大厂(字节华为)Java EE面试题:Servlet/JSP 部分解析+答案,最强八股文