request.getServletPath()从Spring MVC返回null

时间:2017-10-05 18:40:41

标签: spring jsp spring-mvc

我制作了一个过滤器来捕获所有请求的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

3 个答案:

答案 0 :(得分:2)

你因为

而变空了
request.getServletPath();

适用于Servlet,您可以在Filter中执行此操作。要在过滤器中获取它,您必须手动构建它:

HttpServletRequest request = (HttpServletRequest) req;
String path = request.getRequestURI().substring(request.getContextPath().length());

更多信息原因:

How to get request URI without context path?

答案 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

解决方案是从请求中提取所有需要的信息,然后再切换到后台线程。