Java webapp Filter导致在Tomcat上启动服务器失败

时间:2012-06-22 18:51:22

标签: java tomcat web-applications servlet-filters

我的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 guest虚拟机上运行什么命令,并删除我的主应用程序旁边的最大应用程序无法解决此问题(这应该释放足够的资源)。

我发布的内容中是否有任何可见的责任和纠正? 应用程序:enter link description hereenter 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)

2 个答案:

答案 0 :(得分:2)

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

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

  1. 为每个请求编译正则表达式模式(执行一次)
  2. 在所有中使用正则表达式(您可以使用简单的子字符串搜索)
  3. 如果您真的不想接受包含嵌入式会话ID的网址,您应该正在寻找;jsessionid=
  4. 您需要return语句,否则您将返回Redirect仍然处理原始请求
  5. 有一种API方法可以告诉你你想知道什么(见下文)
  6. 试试这个:

    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);
        }
    }
    

    这应该比你最初发布的内容更好地工作。

答案 1 :(得分:2)

我解决了我的问题。我的托管服务提供商已经过时了解我的tomcat日志记录的文档。即我的catalina.out位于var/log/tomcat7位置,/opt/tomcat7下无处可见。

查看我看到的日志UnsupportedClassVersion异常并下载了一个与我的生产环境相匹配的jdk。很抱歉给您带来不便。