在没有 Web.xml 的情况下在 JAX-RS 上使用 Shiro 过滤器

Using a Shiro Filter on JAX-RS without Web.xml

我正在使用 JAX-RS,我有一个休息服务,我想使用 shiro basic auth 来保护它。我目前有一个 class 可以根据 Servlet 3 规范扩展应用程序并且一切正常 运行。我似乎无法让 Shiro 基本身份验证过滤器工作,因为我没有 web.xml,它不会让我在那里添加过滤器链。有没有办法以编程方式在我的应用程序 sub class 中添加过滤器?

您可以将网络描述符添加到您的应用程序中。根据 Servlet 3.0 规范,web.xml 是可选的,只是扩展 and/or 覆盖您的注释配置。

然后您可以像往常一样在 web.xml 中定义一个 Shiro 过滤器,并且 JAX-RS 相关配置将通过注释保持配置。这是一种自然的做法。

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
    <init-param>
        <param-name>configPath</param-name>
        <param-value>classpath:shiro.ini</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>ShiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

如果这不是您的选择并且您不希望 web.xml 出现在您的应用程序中,您也可以从 ShiroFilter class 扩展并提供您自己的注释配置以链接 Shiro 过滤器:

@WebFilter(initParams = { @WebInitParam(name = "configPath", value = "classpath:shiro.ini") })
public class MyShiroFilter extends ShiroFilter {
}

我没有测试上面的代码,这只是一种方法。