我制作了一个过滤器来捕获所有请求的HttpServletRequest
sevlet路径
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
// debug to see the output
String path = request.getServletPath();
filterChain.doFilter(request, response);
}
jsp中有一个没有控制器或视图映射到它的URL
<div>
<spring:url value="/app" var="app_url" htmlEscape="true"/>
<a href="${app_url}"><spring:message code="label_3rd_app" /></a>
</div>
但是,在调试过滤器时点击网址时,我会看到来自两个请求的request.getServletPath()
值:
/null
/null/app
我的问题是为什么request.getServletPath()
永远不会返回/app
?
答案 0 :(得分:2)
你因为
而变空了request.getServletPath();
适用于Servlet,您可以在Filter中执行此操作。要在过滤器中获取它,您必须手动构建它:
HttpServletRequest request = (HttpServletRequest) req;
String path = request.getRequestURI().substring(request.getContextPath().length());
更多信息原因:
答案 1 :(得分:0)
先生。 Lalibertes解决方案无法正常工作,因为getRequestURI
的结果是uri编码的,而getServletPath
的结果却不是。
在这种情况下,最好使用Springs UrlPathHelper获取servlet路径。
new org.springframework.web.util.UrlPathHelper().getPathWithinApplication(servletRequest);
此方法以getServletPath
-如果不是null
的方式提供uri解码的servlet路径。
答案 2 :(得分:0)
对于仅仅因为您的上下文路径为空(例如我)而来这个问题的人:我正在后台线程中调用request.getContextPath()
。
如果我正确理解了此错误报告的讨论,则请求将变为“超出范围”:https://bugs.eclipse.org/bugs/show_bug.cgi?id=401768
此外,我知道我不应该在servlet环境中使用普通线程,而应该使用Executor
。但是问题可能仍然存在:https://developer.jboss.org/thread/232135。
解决方案是从请求中提取所有需要的信息,然后再切换到后台线程。