Tomcat 使用url模式的servlet映射中的StackOverflower错误/*&引用;
我有一组JSP页面,我想隐藏.JSP扩展名(经过一点研究,它似乎对SEO有好处) 我遇到的一个解决方案是: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</
<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>