Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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
Tomcat 使用url模式的servlet映射中的StackOverflower错误/*&引用;_Tomcat_Servlets_Seo_Servlet Filters - Fatal编程技术网

Tomcat 使用url模式的servlet映射中的StackOverflower错误/*&引用;

Tomcat 使用url模式的servlet映射中的StackOverflower错误/*&引用;,tomcat,servlets,seo,servlet-filters,Tomcat,Servlets,Seo,Servlet Filters,我有一组JSP页面,我想隐藏.JSP扩展名(经过一点研究,它似乎对SEO有好处) 我遇到的一个解决方案是: <servlet> <servlet-name>mypage</servlet-name> <jsp-file>/some-page.jsp</jsp-file> </servlet> <servlet-mapping> <servlet-name>mypage</

我有一组JSP页面,我想隐藏.JSP扩展名(经过一点研究,它似乎对SEO有好处)

我遇到的一个解决方案是:

<servlet>
    <servlet-name>mypage</servlet-name>
    <jsp-file>/some-page.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>mypage</servlet-name>
    <url-pattern>/some-page</url-pattern>
</servlet-mapping>

我不知道该怎么解决。有什么想法吗?

映射到
/*
上的servlet也将运行在
RequestDispatcher#forward()
调用上。因此,如果您在该servlet中执行转发,它将在无限循环中每次调用自己。这就解释了
堆栈溢出错误

毕竟,您不应该对servlet使用
/*
。它只在servlet过滤器上有意义。将servlet映射放回更具体的URL模式,并在
/*
上创建一个过滤器,必要时将其转发到所需的servlet。当然,您不想让servlet处理例如images/CSS/JS文件。假设它们都放在
/resources
文件夹中,并且您的前端控制器映射到
/myservlet/*
,然后在
doFilter()
中执行以下工作:

另见:
您应该使用

您可以在配置文件(urlrewrite.xml)中使用类似的方法:


/产品/([a-zA-Z0-9.z%]+)
/products.jsp?id=$1

URLReWreEdter在A注释上,但我认为它应该是一个独立的答案。< /p>愚蠢的问题。我一开始就需要servlet吗?过滤器可以直接转发到jsp页面吗?如果唯一的功能需求是“漂亮的URL”而不是“前端控制器”,那么您可以单独使用过滤器,是的。甚至还有第三方库,例如和,类似于ApacheHttpd的

mod_rewrite
。但是,如果您确实需要一个前端控制器(它还将处理HTTP请求的预处理和后处理),最好将其保存在servlet中。
<servlet>
    <servlet-name>MyServletName</servlet-name>
    <servlet-class>myservlets.PrettyUrlServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyServletName</servlet-name>
    <url-pattern>/myservlet/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>MyServletName</servlet-name>
    <servlet-class>myservlets.PrettyUrlServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyServletName</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
    Exception in thread "http-bio-8080-exec-1" java.lang.StackOverflowError
            at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:219)
            at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:228)
            .
            .
            at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:228)
            at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:228)
            at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
            at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
            at myservlets.PrettyUrlServlet.doGet(PrettyUrlServlet.java:22)
HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());

if (path.startsWith("/resources/")) {
    // Just let container's default servlet do its job.
    chain.doFilter(request, response);
}
else {
    // Delegate to your front controller.
    request.getRequestDispatcher("/myservlet" + path).forward(request, response);
}
<rule>
    <from>/products/([a-zA-Z0-9._%]+)</from>
    <to>/products.jsp?id=$1</to>
</rule>