Java webapp 过滤器导致无法在 Tomcat 上启动服务器

Posted

技术标签:

【中文标题】Java webapp 过滤器导致无法在 Tomcat 上启动服务器【英文标题】:Java webapp Filter causes failure to startup server on Tomcat 【发布时间】:2012-06-25 02:49:36 【问题描述】:

我的 Tomcat 上安装了 3 个应用程序,并且一切正常,导致出现这种混乱。 在开始之前,我需要重新配置我的 tomcat 日志记录,因为这可能无法正常工作,但我觉得我的应用程序无法启动,原因可能是我今天作为第一个计时器实现的过滤器配置错误:

package org.thejarbar.web.filters;

import java.io.*;
import java.util.regex.Pattern;
import javax.servlet.*;
import javax.servlet.http.*;

public final class JSessionFilter implements Filter 

    public void init(FilterConfig filterConfigObj) 

    

    public void doFilter(ServletRequest _req, ServletResponse _res,
                         FilterChain chain) throws IOException, ServletException 
        HttpServletRequest req = (HttpServletRequest) _req;
        HttpServletResponse res = (HttpServletResponse) _res;
        String url =req.getRequestURL().toString();

        if(Pattern.compile(Pattern.quote("jsessionid"), Pattern.CASE_INSENSITIVE).matcher(url).find())

            String redirectURL = "http://thejarbar.org";
            res.setStatus(res.SC_MOVED_PERMANENTLY);
            res.setHeader("Location",redirectURL);
            res.setHeader( "Connection", "close" );
        

        chain.doFilter(req, res);
    

    public void destroy()  
 

在 web.xml 中配置:

<filter>
    <filter-name>sessionFilter</filter-name>
    <filter-class>org.thejarbar.web.filters.JSessionFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>sessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

我怀疑存在内存问题,但不知道为此在我的 Unix 客户机上运行什么命令,并且删除我的主应用程序旁边的最大应用程序并不能解决此问题(这应该会释放足够的资源)。

在我发布的内容中是否有任何可以归咎和纠正的地方? 应用程序:enter link description here 和 enter link description here 似乎已部署但无法访问(如果您尝试)。

在我的开发系统上一切运行顺利。

编辑设法再次获取日志文件:

INFO | jvm 1 | 2012/06/23 01:19:58 | Jun 23, 2012 1:19:58 AM org.apache.catalina.startup.Catalina start
INFO | jvm 1 | 2012/06/23 01:19:58 | SEVERE: Catalina.start:
INFO | jvm 1 | 2012/06/23 01:19:58 | org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]
INFO | jvm 1 | 2012/06/23 01:19:58 | at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
INFO | jvm 1 | 2012/06/23 01:19:58 | at org.apache.catalina.startup.Catalina.start(Catalina.java:624)
INFO | jvm 1 | 2012/06/23 01:19:58 | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
INFO | jvm 1 | 2012/06/23 01:19:58 | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
INFO | jvm 1 | 2012/06/23 01:19:58 | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
INFO | jvm 1 | 2012/06/23 01:19:58 | at java.lang.reflect.Method.invoke(Method.java:597)
INFO | jvm 1 | 2012/06/23 01:19:58 | at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
INFO | jvm 1 | 2012/06/23 01:19:58 | at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:450)
INFO | jvm 1 | 2012/06/23 01:19:58 | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
INFO | jvm 1 | 2012/06/23 01:19:58 | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
INFO | jvm 1 | 2012/06/23 01:19:58 | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
INFO | jvm 1 | 2012/06/23 01:19:58 | at java.lang.reflect.Method.invoke(Method.java:597)
INFO | jvm 1 | 2012/06/23 01:19:58 | at org.tanukisoftware.wrapper.WrapperStartStopApp.run(WrapperStartStopApp.java:264)
INFO | jvm 1 | 2012/06/23 01:19:58 | at java.lang.Thread.run(Thread.java:662)
INFO | jvm 1 | 2012/06/23 01:19:58 | Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Catalina]]
INFO | jvm 1 | 2012/06/23 01:19:58 | at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
INFO | jvm 1 | 2012/06/23 01:19:58 | at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
INFO | jvm 1 | 2012/06/23 01:19:58 | at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

【问题讨论】:

您是否遇到任何错误(或)异常? @thinksteep 不在我的日志中(可能已损坏),因为我把它搞砸了。这些应用程序似乎已部署,因为如果您尝试通过我提供的链接访问它们,您不会得到任何响应/超时。我想我删除了我的 tomcat 日志,并且可能在 2 年前由于精神疾病而错误地修复了它。如何确保设置了 Tomcat 日志?我在日志中有许多按日期划分的日志文件,而今天的日志中没有错误... 删除我的过滤器映射允许所有应用程序启动 你修改了哪个web.xml 我的主站点的那个 【参考方案1】:

如果您的“主站点”文件是 Tomcat 的 conf/web.xml,那么您正在编辑错误的文件。将conf/web.xml 恢复原状(或从tomcat.apache.org 下载新副本),然后编辑您的webapp 的WEB-INF/web.xml 文件。这样,您的 Filter 将从您的 web 应用程序的 WEB-INF/classesWEB-INF/lib/*.jar 加载,而不是尝试为 所有应用程序 从 Tomcat 的 lib/ 目录加载它。显然,您需要确保您的org/thejarbar/web/filters/JSessionFilter.class 位于WEB-INF/classesWEB-INF/lib 的JAR 文件中。

另请注意,您在过滤器中所做的工作超出了严格要求:您不需要...

    为每个请求编译一个正则表达式模式(执行一次) 完全使用正则表达式模式(您可以使用简单的子字符串搜索) 如果您真的不想接受带有嵌入会话 ID 的 URL,您可能应该寻找 ;jsessionid= 你需要一个return 语句,否则你将返回一个Redirect 加上仍然处理原始请求 有一种 API 方法已经可以告诉您您想知道的内容(见下文)

试试这个:

public void doFilter(ServletRequest _req, ServletResponse _res,
                     FilterChain chain) throws IOException, ServletException 
    HttpServletRequest req = (HttpServletRequest) _req;
    HttpServletResponse res = (HttpServletResponse) _res;

    if(request.isRequestedSessionIdFromURL())
    
        String redirectURL = "http://thejarbar.org";
        res.setStatus(res.SC_MOVED_PERMANENTLY);
        res.setHeader("Location",redirectURL);
        res.setHeader( "Connection", "close" );
    
    else
    
        chain.doFilter(req, res);
    

这应该比你最初发布的更好。

【讨论】:

我的 web.xml(s) 是每个应用程序的,我的战争已经在本地测试过,所以我可以肯定地说它在类路径中。你知道我可以如何重建 Tomcat 日志吗?我想念 catalina.out。 这个过滤器是为了修复来自旧请求的 SEO 错误,我所有的 .wars 都带有自己的 .web.xml(我没有触及 Tomcat 中的那个)。你知道我该如何修复 catalina.out 吗? 我做到了,谢谢...我看到了来自 Google 的最新报告。感谢您,我进行了更改,但没有 Java API 提供的方法,因为它的文档不清楚,所以我推出了自己的...【参考方案2】:

我解决了我的问题。我的托管服务提供商有关于我的 tomcat 日志记录位置的过时文档。即我的catalina.outvar/log/tomcat7 位置下,在/opt/tomcat7 下无处。

查看日志看到UnsupportedClassVersionException,下载了一个和我的生产环境匹配的jdk。很抱歉给您带来不便。

【讨论】:

以上是关于Java webapp 过滤器导致无法在 Tomcat 上启动服务器的主要内容,如果未能解决你的问题,请参考以下文章

javaweb过滤器请求有先后顺序导致静态资源加载不出来

如何将 Tomcat webapp 转换为 Oracle Application Server webapp?

将基于 Maven 的 JSF 项目部署到 Tomcat 会导致 java.lang.ClassNotFoundException:javax.faces.webapp.FacesServlet [重

tomcat目录结构详解

JAVA中jar包和war包的区别是

在 Tomcat 6-Java 7/8 中运行 Tomcat 6-Java 6 WebApps