1

我有一个 REST api,使用 jersey 和 guice 进行依赖注入。一切都很好,我打开了 FEATURE_CANONICALIZE_URI_PATH 和 FEATURE_NORMALIZE_URI 并且在几乎所有情况下都可以处理额外的斜杠。例如:

http://localhost:8080/my_service/param1//param2

问题是我无法找出正确的方法来处理 url 开头的额外斜杠(在服务路径之前)。像这样:

http://localhost:8080//my_service/param1/param2

这就是我目前设置东西的方式:

web.xml

<filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>MyServletConfig</listener-class>
</listener>

MyServletConfig.java

public class MyServletConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new JerseyServletModule() {
            @Override
            protected void configureServlets() {
                bind(MyService.class);

                guiceContainerConfig.put(ResourceConfig.FEATURE_NORMALIZE_URI, "true");
                guiceContainerConfig.put(ResourceConfig.FEATURE_CANONICALIZE_URI_PATH, "true");

                serve("/*").with(GuiceContainer.class, guiceContainerConfig);
            }
        });
    }
}

我的服务.java

@Path("/")
public class MyService {
    @GET
    @Path("/{param1}/{param2}")
    @Produces("application/json")
    public String get(
            @PathParam("param1") final String param1,
            @PathParam("param2") final String param2) {

        return "{\"param1\":\"" + param1 + "\"}";
    }
}

我可以看到问题实际上是在服务名称之前带有 // 的请求实际上并没有被 servlet 处理,因为它在过滤器映射的 url-mapping 中不匹配,但我只是不太确定正确的解决方案。在该 url 与 servlet 匹配之前,我是否需要进行 url 重写,或者是否有更好的方法来映射请求 url?

4

2 回答 2

1

快速引导:

http://tukey.org/urlrewrite/是一个 java web 过滤器。它是一个非常强大的工具,就像 Apache 的 mod_rewrite 一样。使用来自http://www.mydigitallife.info/redirect-or-rewrite-to-remove-double-or-multiple-slashes-in-url/的经典 htaccess 重写设置过滤器

于 2013-07-26T12:21:15.593 回答
0

如果您使用的是码头,只需添加模块rewrite-compactpath

 Module: rewrite-compactpath
       : Add a rule to the rewrite module to compact paths so that double slashes
       : in the path are treated as a single slash.
 Depend: rewrite
    XML: etc/rewrite-compactpath.xml
于 2018-11-08T15:42:58.707 回答