【问题标题】:How can I get the request URL from a Java Filter?如何从 Java 过滤器获取请求 URL?
【发布时间】:2011-05-22 08:02:27
【问题描述】:

我正在尝试编写一个可以检索请求 URL 的过滤器,但我不知道该怎么做。

这是我目前所拥有的:

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class MyFilter implements Filter {
    public void init(FilterConfig config) throws ServletException { }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        chain.doFilter(request, response);

        String url = ((HttpServletRequest) request).getPathTranslated();
        System.out.println("Url: " + url);
    }

    public void destroy() { }
}

当我点击服务器上的一个页面时,我看到的唯一输出是“Url: null”。

从过滤器中的给定 ServletRequest 对象获取请求的 URL 的正确方法是什么?

【问题讨论】:

    标签: java url servlet-filters


    【解决方案1】:

    如果你使用Spring,你可以使用OncePerRequestFilter或其他。

    import org.springframework.web.filter.OncePerRequestFilter;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyFilter extends OncePerRequestFilter {
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
             String url = request.getRequestURL();
             filterChain.doFilter(request, response);
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      another answer on this page 为基础,

      public static String getCurrentUrlFromRequest(ServletRequest request)
      {
         if (! (request instanceof HttpServletRequest))
             return null;
      
         return getCurrentUrlFromRequest((HttpServletRequest)request);
      }
      
      public static String getCurrentUrlFromRequest(HttpServletRequest request)
      {
          StringBuffer requestURL = request.getRequestURL();
          String queryString = request.getQueryString();
      
          if (queryString == null)
              return requestURL.toString();
      
          return requestURL.append('?').append(queryString).toString();
      }
      

      【讨论】:

        【解决方案3】:

        这就是你要找的吗?

        if (request instanceof HttpServletRequest) {
         String url = ((HttpServletRequest)request).getRequestURL().toString();
         String queryString = ((HttpServletRequest)request).getQueryString();
        }
        

        重建:

        System.out.println(url + "?" + queryString);
        

        HttpServletRequest.getRequestURL()HttpServletRequest.getQueryString() 的信息。

        【讨论】:

        • getRequestURL() 返回StringBuffer,而不是String
        • 最好考虑空queryString的模式。
        • 如果你想为你去掉 "blabla:8080" 部分,getRequestURI() ('I' not 'l') 返回一个以 "/" 开头的字符串
        • 如果您只想要 servlet 的路径,您可以使用 request.getServletPath(),在 JavaServer Faces 上检索视图 id 的等效项(从 webapp 根目录到 xhtml 页面的路径,不包括域、部署前缀等)
        【解决方案4】:
        request.getRequestURL();   
        

        【讨论】:

        • ServletRequest 没有实现 getRequestURL()。如果可能,您需要根据 Buhake 的回答将其转换为 HttpServletRequest
        • 缺少参数
        猜你喜欢
        • 2011-01-09
        • 2014-10-27
        • 2013-05-05
        • 1970-01-01
        • 1970-01-01
        • 2019-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多