【问题标题】:Tomcat application Web.xml custom filter giving error of resource has moved; filter redirects https to httpTomcat应用程序Web.xml自定义过滤器给出资源错误已移动;过滤器将 https 重定向到 http
【发布时间】:2012-08-25 08:01:35
【问题描述】:

仅供参考:我正在运行带有 IIS 7.5 和 Apache Tomcat 5.5 的 Windows Server 2008 R2。 IIS 通过 AJP 连接器 1.3 版与 Tomcat 对话。 Tomcat 启用了 SSL;因此,该网站同时启用了 HTTP 和 HTTPS 流量。我在 web.xml 文件中还有一个安全约束,通过 url 模式重定向以强制执行特定文件的 HTTPS 流量。

说了这么多,我已经创建了一个 servlet 过滤器,它应该将 https 重定向到 http。不幸的是,当我重新启动 tomcat 服务器并输入登录页面时,我收到以下错误:

您要查找的资源已被删除、更改名称或暂时不可用。

我在 Eclipse 中创建了该类并将其导出为名为 RedirectToHTTP.jar 的 JAR 文件,并将该文件放在应用程序的 WEB-INF/lib 目录中,而不是在 Tomcat 安装目录中。

我不知道问题出在哪里,如果有任何反馈,我将不胜感激。谢谢。

更新

根据 cmets 的建议,我检查了日志文件,发现与我的过滤器相关的错误

-- 异常启动过滤器redirectFilter

java.lang.UnsupportedClassVersionError: myfilterpkg/RedirectToHTTPFilter : 不支持的 major.minor 版本 51.0。

我使用 JRE 1.7 编译了过滤器。我认为 Tomcat 可能使用的是较低版本的 JRE。会不会是这个问题?

这里是web.xml文件中的相关数据:

<filter>
    <filter-name>UTF8Encoder</filter-name>
     <filter-class>com.remedy.arsys.support.UTF8EncodingFilter</filter-class>
     <init-param>
         <param-name>Param1</param-name>
         <param-value>0</param-value>
     </init-param>
</filter>

<filter>
    <filter-name>redirectFilter</filter-name>
    <filter-class>myfilterpkg.RedirectToHTTPFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>UTF8Encoder</filter-name>
    <servlet-name>*.jsp</servlet-name>
</filter-mapping>

<filter-mapping>
    <filter-name>redirectFilter</filter-name>
    <url-pattern>/index.jsp</url-pattern>
</filter-mapping>

这是 Java 类:

package myfilterpkg;

import java.io.IOException;  

import javax.servlet.Filter;  
import javax.servlet.FilterChain;  
import javax.servlet.FilterConfig;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import javax.servlet.http.HttpSession; 

@SuppressWarnings("unused")
public class RedirectToHTTPFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) {
            String redirectTarget = ((HttpServletRequest)request).getRequestURL().toString().replaceFirst("https", "http");

            if(request.isSecure()) {
                ((HttpServletResponse)response).sendRedirect(redirectTarget);
            }
            else {
                chain.doFilter(request, response);
            }
        }
    }

    @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
}

【问题讨论】:

  • UTF8Encoder 的过滤器映射似乎是错误的,它定义了 servlet-name 而不是 url-mapping。这可能与它有关吗?编辑:它确实在官方部署描述符规范中,尽管我以前从未见过它。
  • 那是别人写的,是第三方闭源过滤器。在我编写重定向过滤器并应用它之前,我从来没有遇到过应用程序的问题。我现在可以尝试注释掉 utf8 过滤器,看看它是否会改变结果。我把它注释掉了,我仍然得到同样的错误。非常感谢您的帮助。
  • tomcat 日志文件有没有说一些有趣的东西?你可能想看看&lt;tomcat-home&gt;/logs/catalina.out
  • 我认为我的名为 stdout.log,但我确实在日志中发现了一个错误,指出:“- 异常启动过滤器 redirectFilter java.lang.UnsupportedClassVersionError: myfilterpkg/RedirectToHTTPFilter : Unsupported major.minor version 51.0。我用JRE 1.7编译它。我认为Tomcat可能使用的是较低版本的JRE。可能是这个问题吗?
  • 绝对!使用您的tomcat实际运行的运行时的源级别编译过滤器。

标签: http tomcat https servlet-filters web.xml


【解决方案1】:

过滤器必须使用tomcat服务器实际运行的运行时的源代码级别编译。否则在类加载时会出现上述错误。

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 2019-10-15
    • 2014-10-05
    • 2020-09-17
    • 1970-01-01
    • 2018-03-15
    • 2014-12-17
    • 2021-04-06
    • 1970-01-01
    相关资源
    最近更新 更多