我有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
答案 0 :(得分:4)
这是因为客户要求了两次。您可能期望在媒体(音频/视频)请求上出现此行为。大多数媒体播放器会测试服务器是否支持范围请求,以便通过多个HTTP连接更有效地缓冲它。如果您仔细查看请求标头,可能会看到Range
和If-Range
标头。如果您的服务器支持它,则客户端将发送多个范围请求,请求在指定范围内开始和结束的较小媒体文件块。此外,如果客户端快进到特定时刻(例如1分钟后),则媒体播放器可以中止请求并发送新请求,请求从该位置开始的范围。
您无法阻止客户多次请求它。如果您的服务不支持范围请求,您可能最好将其设置为一个。 servletcontainer的内置默认servlet支持它。因此,如果您将媒体文件放在公共Web内容中并让客户端直接请求它而不是通过Web服务,那么它会担心这一点。
请注意,这个问题与泽西岛完全无关,虽然我有点认为这是媒体流特定工作的错误工具。