How to mix server-side Jax-rs call with native files without prefix?

依然范特西╮ 提交于 2019-12-19 10:32:47

问题


We are currently using a Jersey JAX-RS implementation to handle our REST requests (server-side Jersey). Our web.xml file is configured so all /rest/* requests are handled by Jersey. That's fine. Our server is currently Tomcat6, and using Java6 ( on Ubuntu 11.04 )

So, ://myserver/rest/customer/ is ok and Jersey calls the class with @Path("/customer") prefix.

Now we also have static content, for example ://myserver/images/... wich loads fine.

Is there a way to do so that we can get rid of the /rest/* prefix and mix it all together?

What we want to achieve : ://myserver/rest/customer/ → Jersey ://myserver/rest/images/ → the native image Directory of the war

Thanks for your help


回答1:


This is pretty easy to achieve. Just register Jersey ServletContainer in web.xml as a filter (instead of servlet) - see the bottom of this page for an example - and either use ServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEX or ServletContainer.FEATURE_FILTER_FORWARD_ON_404 init param to make the static content accessible.




回答2:


First, when it comes to servlet mapping, priority goes like this:

  1. Path mapping: /rest/*
  2. Extension mapping: *.png
  3. Default: /

Path mapping + extension mapping: bad idea

So you can't map static resources by their file extension within an existing path mapping (that would be a bad idea anyway, managing all static file extensions in your web.xml).

Path mapping's priority > ext mapping.

Using a filter

Set up an UrlRewriteFilter in your web.xml

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

And in your urlrewrite.xml configuration file:

<urlrewrite default-match-type="wildcard">
    <rule>
        <from>/rest/images/**</from>
        <to>/images/$1</to>
    </rule>
</urlrewrite>

Not mapping static resources in /rest

This may not suit your needs, but this is my favorite! Mapping static resources within /rest says "Hey, developer, come GET/POST/PUT/DELETE thoses static resources, it's okay":

  • If you can't GET/PUT/POST/DELETE those resources, then you shouldn't map them in /rest. It gives the wrong impression.
  • If ou actually want to manipulate those resources through a REST webservice, then let Jersey do the heavy lifting and serve those resources (check out the jersey-samples for an example).


来源:https://stackoverflow.com/questions/7210546/how-to-mix-server-side-jax-rs-call-with-native-files-without-prefix

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!