Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我在泽西岛的方法会被调用两次?_Java_Servlets_Jersey - Fatal编程技术网

Java 为什么我在泽西岛的方法会被调用两次?

Java 为什么我在泽西岛的方法会被调用两次?,java,servlets,jersey,Java,Servlets,Jersey,我有HomeService.java,当我进入/testurl时,它会打印HomeService::test一次,但当我进入/playurl时,它会打印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 cla

我有HomeService.java,当我进入
/test
url时,它会打印
HomeService::test
一次,但当我进入
/play
url时,它会打印
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>
然后又

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

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

您无法阻止客户端多次请求它。如果您的服务不支持范围请求,您可能最好将其设置为一个。servletcontainer的内置默认servlet支持它。因此,如果您将媒体文件放在公共web内容中,并让客户端直接请求它,而不是通过web服务,那么它就会担心这一点


请注意,这个问题与Jersey完全无关,尽管我有一种印象,它对于媒体流的特定工作是错误的工具。

您对客户端使用的是什么?您是否100%确定客户端只发送一个请求?您是否有一种简单的方法来监视HTTP请求以验证这一点(HTTP日志或Wirshark/HTTP嗅探器)。我之所以问这个问题,是因为没有其他可能的原因。@EJK我已经用tcpdump输出更新了我的问题,而且wget只命中它一次
........GET /Home/rest/main/play HTTP/1.1
........GET /Home/rest/main/play HTTP/1.1