Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java筛选器URL重写循环问题_Java_Url Rewriting_Servlet Filters - Fatal编程技术网

Java筛选器URL重写循环问题

Java筛选器URL重写循环问题,java,url-rewriting,servlet-filters,Java,Url Rewriting,Servlet Filters,我希望有人能指出我的错误所在。我正在尝试创建一个简单的过滤器,它的工作原理类似于,但只需要剥离它来做我需要它做的事情 我无法让它停止在原始URI上循环。我已经窥探了URLRewriteFilter代码,它似乎在做与我基本相同的事情。这是我的过滤代码: public static final String dispatcherURI = "/Dispatcher?q="; public void doFilter(final ServletRequest request, final Servle

我希望有人能指出我的错误所在。我正在尝试创建一个简单的过滤器,它的工作原理类似于,但只需要剥离它来做我需要它做的事情

我无法让它停止在原始URI上循环。我已经窥探了URLRewriteFilter代码,它似乎在做与我基本相同的事情。这是我的过滤代码:

public static final String dispatcherURI = "/Dispatcher?q=";
public void doFilter(final ServletRequest request, final ServletResponse response,
                     final FilterChain chain)
        throws IOException, ServletException {
    final HttpServletRequest rq = (HttpServletRequest)request;
    final HttpServletResponseWrapper rsw =
        new HttpServletResponseWrapper((HttpServletResponse)response);
    final String uri = rq.getRequestURI();
    if (uriIsDispatchable(uri)) {
        final String forwardPath = dispatcherURI+uri;
        rq.getRequestDispatcher(forwardPath).forward(rq, rsw);
        LOG.info("Forward From: "+uri+", To: "+forwardPath);
    }
    else {
        try { chain.doFilter(request, response); }
        catch (Exception e) {
            LOG.error(e);
            throw new RuntimeException(e);
        }
    }
}

// checks URI against an ArrayList of URIs that should be ignored.
private static boolean uriIsDispatchable (final String uri) {
    boolean result = true;
    for (String i : ApplicationValues.uriIgnore) {
        if (uri.indexOf(i) == 0) {
            result = false;
            break;
        }
    }
    return result;
}
下面是web.xml中的过滤器条目

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>myapp.filter.URLRewrite</filter-class>
</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

URL重写过滤器
myapp.filter.URLRewrite
URL重写过滤器
/*
关于代码的一些注释: 像/home这样的URI应该转发到像这样的调度器servlet:/dispatcher?q=/home 然后,DispatcherServlet根据查询字符串中的内容确定要执行的代码

过滤器正确地忽略了“uriIgnore”ArrayList(包括/Dispatcher)中的URI,但转发继续在/home上循环。为完整起见,以下是在上面的uriIsDispatchable方法中搜索的uriIgnore ArrayList的内容:

public static final List<String> uriIgnore = new ArrayList<String>(4);
static {
  uriIgnore.add("/Dispatcher");
  uriIgnore.add("/netbeans-tomcat-status-test");
  uriIgnore.add("/resources");
  uriIgnore.add("/robots.txt");
}
publicstaticfinallist=newarraylist(4);
静止的{
uriIgnore.add(“/Dispatcher”);
添加(“/netbeans tomcat状态测试”);
添加(“/resources”);
uriIgnore.add(“/robots.txt”);
}
另外,我正在运行Apache背后的最新Tomcat6代理


感谢您的帮助。谢谢。

我认为当程序执行以下语句时:rq.getRequestDispatcher(forwardPath).forward(rq,rsw); 它将再次调用doFilter(
)方法,然后程序将成为一个无止境的循环。

我想您可以添加一个参数来判断url是否来自另一个doFilter(
),这样它就可以识别并转发url了。

当我有时间进一步阅读URLRewrite筛选器代码时,我会想办法解决这个问题,但与此同时,如果我真的想要最高性能的url重写,我将让mod_重写并由Apache完成

我的解决方案(我相信还有更好的方法):

#.htaccess文件内容
#Apache与Java web应用程序具有相同的docroot。
#Java webapp正在端口8084上运行
重新启动发动机
重写基/
重写cond%{REQUEST_FILENAME}-f[NC,或]
重写cond%{REQUEST_FILENAME}-D
#图像、静态html文件和JS脚本所在的目录。
#阿帕奇将提供这些服务。
重写规则^resources-[L,NC]
#显然,我们希望Apache为robots.txt提供服务
重写规则^robots.txt$-[L,NC]
重写规则^(.*)$http://localhost:8084/Dispatcher?q=$1[L,P,QSA]

相同的无限循环问题,将URLRewiter配置为仅过滤请求,而不是转发,然后重试 在您的web.xml中如下所示:

 <filter-mapping>
     <filter-name>UrlRewriteFilter</filter-name>
     <url-pattern>/*</url-pattern>
     <dispatcher>REQUEST</dispatcher>
 </filter-mapping>

URL重写过滤器
/*
要求

在这种情况下,转发后不会再次执行规则处理。

转发将导致doFilter再次运行,但我认为问题在于转发的请求保留原始URI,而不是转发的URI,这会导致循环。根据我从URLRewiteFilter代码中收集到的信息,他使用了与我使用的相同的前向调用,但他没有循环。我已经在我的服务器上用同样的规则试用了Tuckey UrlRewriteFilter,它运行得很好。我确信我遗漏了一些简单而明显的东西。当我找到这个问题的Java解决方案时,我一定会把它贴在这里。
 <filter-mapping>
     <filter-name>UrlRewriteFilter</filter-name>
     <url-pattern>/*</url-pattern>
     <dispatcher>REQUEST</dispatcher>
 </filter-mapping>