java-为什么球衣中的方法被调用两次?

我有HomeService.java,当我转到/ test网址时,它将打印一次HomeService :: test,但是当我转到/ play网址时,它将打印两次HomeService :: play.如何使我的/ play方法仅被调用一次?

我去的网址是

http://127.0.0.1:8080/Home/rest/main/test
http://127.0.0.1:8080/Home/rest/main/play

HomeService.java:

@Path("/main")
public class HomeService
{

  @GET
  @Path("/test")
  @Produces("text/plain")
  public String test()
  {
    System.out.println("HomeService::test");
    return "Running...";
  }

  @GET
  @Path("/play")
  @Produces("video/mpeg")
  public StreamingOutput play()
  {
    System.out.println("HomeService::play");
    return new StreamingOutput()
    {

    @Override
    public void write(java.io.OutputStream outputStream) {}
  }
}

Web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <display-name>Home</display-name>

    <servlet>
        <servlet-name>jersey-servlet</servlet-name>
        <servlet-class>
                      com.sun.jersey.spi.container.servlet.ServletContainer
        </servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.home</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-servlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

</web-app>

如果需要更多信息,请告诉我.

编辑:所以我跑了tcpdump,这是输出:

# ./tcpdump -s 128 -A -v -i any port 8080|grep 'play'
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 128 bytes
...u...uGET /Home/rest/main/play HTTP/1.1
..  ... .GET /Home/rest/main/play HTTP/1.1

然后再

........GET /Home/rest/main/play HTTP/1.1
........GET /Home/rest/main/play HTTP/1.1

解决方法:

这是因为客户要求两次.您可能会在媒体(音频/视频)请求中遇到这种情况.大多数媒体播放器会测试服务器是否支持范围请求,以便可以通过多个HTTP连接更有效地对其进行缓冲.如果您仔细查看请求标头,可能会看到RangeIf-Range标头.如果您的服务器支持,则客户端将发送多个范围请求,以请求在指定范围开始和结束的较小的媒体文件块.另外,如果客户快进到特定时刻(例如1分钟后),则媒体播放器可以中止该请求并发送一个新请求,请求从该位置开始的范围.

您不能阻止客户端多次请求.如果您的服务不支持范围请求,则最好将其设置为一个. servlet容器的内置默认servlet支持它.因此,如果您将媒体文件放在公共Web内容中,然后让客户端直接请求它而不是通过Web服务来请求它,那么它将为此担心.

请注意,这个问题与Jersey完全无关,尽管我有些印象是,对于特定的媒体流而言,这是错误的工具.

上一篇:java-从Spring MVC Rest服务抛出的Jersey REST客户端捕获异常


下一篇:java-使用Jersey的动态实例级授权(基于id)