使用过滤器将请求转发给其他休息服务

时间:2014-03-05 09:52:38

标签: java rest servlets jersey-2.0

我正在编写一个servlet过滤器来根据特定条件转发Jersy请求。但他们似乎没有转发。

public class SampleFilter
    extends GenericFilterBean
{    
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
        throws IOException, ServletException
    {
        String generateRedirectUrl=FormURL((HttpServletRequest)req);
        RequestDispatcher dispatcher = req.getRequestDispatcher(generateRedirectUrl);        
        dispatcher.forward(req, resp);        

    }

    private String FormURL(HttpServletRequest req)
    {
        // get the request check if it contains the customer
        String reqUrl = req.getRequestURI();
        log.info("Original Url is"+reqUrl);
        if(reqUrl.contains("test"))
        {
            return "/api/abcd/" +"test";
        }
         return "Someurl";

    }

}

我需要转发网址,如下所示。

Original: http://localhost/api/test/1234/true

New URL:http://localhost/api/abcd/1234/true

我做错了什么。

1 个答案:

答案 0 :(得分:1)

  

"我做错了什么。"

一般来说,我认为这样可行 - 你可以从过滤器转发,但你的逻辑是错误的。

使用以下规则:

Original: http://localhost/api/test/1234/true
New URL:http://localhost/api/abcd/1234/true

代码:

if(reqUrl.contains("test"))
    {
        return "/api/abcd/" +"test";
    }

会产生/api/abcd/test,这不是您之后的目标。

我会做以下事情:

 private String formURL(HttpServletRequest req) {
    // get the request check if it contains the customer
    String reqUrl = req.getRequestURI();
    if (log.isInfoEnabled() {
      log.info("Original Url is"+reqUrl);
    }
    if(reqUrl.contains("test")) {
      return reqUrl.replace("test", "abcd");
    }
    return "Someurl";

此外,代码非常残酷。这也将改变URL

  

http://test.site.com/abd/def   至   http://abcd.site.com/abd/def

这可能不是你想要的。您可能需要进行更聪明的字符串操作或转换为类似URI类的内容,以便更准确地定位路径。

希望这有帮助,

威尔