使 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 应用程序,例如 Profiles
、Distribution
等。所以现在我想要在 Login
应用程序中应用 Filter
以供所有人使用适用其他应用程序部署在Tomcat
。意味着对其他应用程序资源的每个请求都应该通过我开发的Filter
。
因此,我们将不胜感激任何建议!
编辑1
我不想将包含Filter
的包放在其他应用程序中。因为在 Tomcat 服务器中部署了 10 多个应用程序,而且还会部署更多应用程序。所以假设如果我将包含Filter
的包放在所有其他应用程序中并进行 servlet 映射,但是如果几天后我想在过滤器中进行一些更改,那么我将需要在所有应用程序中进行更改,然后重新部署它们将需要。
【问题讨论】:
【参考方案1】:将您的 <filter>
和 <filter-mapping>
定义放在 $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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章