gpt4 book ai didi

Java过滤器URL重写循环问题

转载 作者:行者123 更新时间:2023-12-04 06:39:08 27 4
gpt4 key购买 nike

我希望有人能指出我在这里出错的地方。我正在尝试创建一个简单的过滤器,其作用类似于 Paul Tuckey's URLRewriteFilter ,但精简到只做我需要它做的事情。

我无法停止在原始 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>

关于代码的一些说明:
像/home 这样的 URI 应该像这样转发到调度程序 servlet:/Dispatcher?q=/home
调度程序 servlet 然后根据查询字符串中的内容确定要执行的代码。

过滤器正确地忽略了“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");
}

另外,我正在运行最新的 Tomcat 6,它是在 Apache 后面代理的。

任何帮助表示赞赏。谢谢。

最佳答案

我想当程序执行语句时: rq.getRequestDispatcher(forwardPath).forward(rq, rsw);
它会调用 doFilter( ) method again, and then the program will be an endless loop.
I think you can add a parameter to tell the url is from another doFilter(
) 或不调用,因此它可以识别并转发 url。

关于Java过滤器URL重写循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4485933/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com