使 servlet 过滤器适用于所有 Web 应用程序

Posted

技术标签:

【中文标题】使 servlet 过滤器适用于所有 Web 应用程序【英文标题】:make servlet filter applicable for all web applications 【发布时间】:2013-04-05 19:58:16 【问题描述】:

我正在使用 JSP 和 Servlet 开发一个 Web 应用程序。

我为Login 开发了一个servlet filter。它检查用户是否已登录,如果用户已登录,则它允许访问所请求的资源,否则它将请求重定向到Login page。而且效果很好。

过滤器

public class MyFilter implements Filter

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 
    
        //code here
    

web.xml

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.myfilter.MyFilter</filter-class>
    <init-param>
        <param-name>PARAM_NAME_HERE</param-name>
        <param-value>PARAM_VALUES_HERE</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

现在我已经在Tomcat 7 上部署了这个名为Login 的应用程序。这个servlet filter 非常适合此 Web 应用程序中的资源(JSP、Servltes、.css、.js)。

所以现在在 Tomcat 中还有其他 Web 应用程序,例如 ProfilesDistribution 等。所以现在我想要在 Login 应用程序中应用 Filter 以供所有人使用适用其他应用程序部署在Tomcat。意味着对其他应用程序资源的每个请求都应该通过我开发的Filter

因此,我们将不胜感激任何建议!

编辑1

我不想将包含Filter 的包放在其他应用程序中。因为在 Tomcat 服务器中部署了 10 多个应用程序,而且还会部署更多应用程序。所以假设如果我将包含Filter 的包放在所有其他应用程序中并进行 servlet 映射,但是如果几天后我想在过滤器中进行一些更改,那么我将需要在所有应用程序中进行更改,然后重新部署它们将需要。

【问题讨论】:

【参考方案1】:

将您的 &lt;filter&gt;&lt;filter-mapping&gt; 定义放在 $CATALINA_HOME/conf/web.xml

这些定义由所有 Web 应用程序共享。

您必须将所有与登录相关的逻辑打包到一个 jar 中,并将其放在 $CATALINA_HOME\lib 下,以便您的所有 Web 应用程序都可以访问它。

【讨论】:

在 weblogic 和 OHS 中有什么方法可以做到这一点?【参考方案2】:

将此代码添加到其他两个应用程序的 web.xml 中。

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.myfilter.MyFilter</filter-class>
    <init-param>
        <param-name>PARAM_NAME_HERE</param-name>
        <param-value>PARAM_VALUES_HERE</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

过滤器

public class MyFilter implements Filter

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 
    
        //code here
    

【讨论】:

感谢您的回答,但它不起作用,它在启动Tomcat服务器java.lang.ClassNotFoundException: com.myfilter.MyFilter时出现异常,我的包含过滤器的包在Login应用程序中。 @Bhushan Ya 它会给出该错误,因为您没有将此包 com.myfilter.Myfilter 添加到其他两个应用程序中。试试看吧。 是的,我知道如果在这些应用程序中添加这个包,那么它将完美运行,但我的问题是我应该如何将 Filter 中的 Login 应用程序 Applicable 添加到部署在 tomcat 中的所有其他应用程序 @Bhushan 这样做有什么需要。 @Bhushan 这样做没有意义,在我看来这是不可能的。

以上是关于使 servlet 过滤器适用于所有 Web 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Servlet 过滤器 - 上下文初始化

filter的使用

Filter及FilterChain的详解

Global Java Servlet Filter,有可能吗?

Servlet 过滤器 - 不要将过滤器应用于特定的过滤器

如何使依赖注入适用于 NestJS 中的全局异常过滤器?