Tuckey UrlRewrite: 修改urlrewrite.xml后出现ClassNotFoundException

8

我希望能够在不重启服务器的情况下更改urlrewrite.xml中的规则。

我正在运行Tomcat 7。在web.xml文件中,我有...

  <filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    <init-param>
      <param-name>confReloadCheckInterval</param-name>
      <param-value>120</param-value>
    </init-param>
    <init-param>
      <param-name>logLevel</param-name>
      <param-value>INFO</param-value>
    </init-param>
  </filter>

当我在urlrewrite.xml中更改<to>元素的值时,尝试执行该规则会导致异常。
java.lang.ClassNotFoundException: org.apache.jsp.s1.content.about_002dus_jsp 在java.net.URLClassLoader$1.run(URLClassLoader.java:366) 时发生错误,在java.net.URLClassLoader$1.run(URLClassLoader.java:355) 时发生错误,在java.security.AccessController.doPrivileged(Native Method) 时发生错误,在java.net.URLClassLoader.findClass(URLClassLoader.java:354) 时发生错误,org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:132) 加载类时发生错误,org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:63) 加载类时发生错误,org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:145) 创建新实例时发生错误,org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:172) 获取servlet时发生错误,org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) 提供服务时发生错误,org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 提供服务时发生错误,org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 提供服务时发生错误,javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 时发生错误,在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 时发生错误,在org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 时发生错误,在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 时发生错误,在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 时发生错误,在org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) 时发生重写错误,在org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) 时发生错误,在org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) 时发生请求处理错误,在org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389) 时发生过滤错误,在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 时发生错误,在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 时发生错误,在org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748) 时发生调用错误,在org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:486) 时发生处理请求错误,在org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:411) 时发生转发错误,在org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338) 时发生错误,在org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:213) 时发生重写错误,在org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:171) 时发生重写错误,在org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) 时发生错误,在org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) 时发生请求处理错误,在org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389) 时发生过滤错误,在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 时发生错误,在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 时发生错误,在au.com.pawsforlife.vizsla.controller.UserFilter.doFilter(UserFilter.java:81) 时发生过滤错误,在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 时发生错误,在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 时发生错误,在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 时发生错误,在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 时发生错误,在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 时
有人知道为什么会发生这种情况吗?或者至少怎么解决?谢谢!

Tomcat中的一个部分保留了已编译JSP的引用,但清除了编译器输出目录。很可能是您对urlrewrite.xml所做的更改导致了这种行为。请查看https://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Common_Attributes(特别是重新加载上下文.xml),以确定是否可以帮助您解决问题。 - mp911de
你能同时添加你的urlrewrite.xml吗? - melis
2个回答

4
我认为这不是动态修改规则的正确方法。请查看手册中的扩展UrlRewriteFilter部分。
与其使用rule标签,您应该使用class-rule。您可以指定一个类,该类将从资源动态加载规则。
他们有一个简单规则的示例。
所以基本上你不能简单地修改XML文件,你必须在运行时加载规则,这样你就可以在重写之前加载任何规则。

3

我曾经遇到过类似的异常,但我不记得细节了。因此,我分享了一个简单项目中的urlrewrite.xml和web.xml示例。希望能对你有所帮助。 urlrewrite.xml:

  1 <?xml version="1.0" encoding="utf-8"?>
  2 <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
  3         "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
  4
  5 <!--
  6
  7     Configuration file for UrlRewriteFilter
  8     http://www.tuckey.org/urlrewrite/
  9
 10 -->
 11 <urlrewrite>
 12
 13     <rule>
 14         <from>^/OA_HTML/(.*)$</from>
 15         <to type="redirect">/tuckeyUrl/$1</to>
 16     </rule>
 17
78 </urlrewrite>

web.xml:

 <?xml version="1.0" encoding="ISO-8859-1"?>
  2
  3 <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  4      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  6      version="2.4">
  7
  8 <filter>
  9     <filter-name>UrlRewriteFilter</filter-name>
 10     <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
 11 </filter>
 12 <filter-mapping>
 13     <filter-name>UrlRewriteFilter</filter-name>
 14     <url-pattern>/*</url-pattern>
 15     <dispatcher>REQUEST</dispatcher>
 16     <dispatcher>FORWARD</dispatcher>
 17 </filter-mapping>
 39 </web-app>

我还记得我遇到了另一个异常。我通过删除第一行前面的额外空行来解决它。
<?xml version="1.0" encoding="ISO-8859-1"?> 

从我的web.xml文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接