1. 程式人生 > >SpringMVC在做靜態資源對映的時候需要注意的問題

SpringMVC在做靜態資源對映的時候需要注意的問題

發現問題

最近在開發一個小網站,需要支援在頁面上播放視訊資源(暫時沒考慮流媒體伺服器神馬的,能正常播放就行)。於是在前端使用了HTML5的video標籤。並且配合projekktor播放器來實現。因為還在開發階段,視訊資源的對映就直接交給SpringMVC本身了。

video 的src如localhost:8080/web/resources/videos/aaaa.mp4 這樣。同時在Spring中配置mvc:resources 映即可。詭異的事情來了,O_O……

在PC端瀏覽器開啟的時候,視訊可以正常播放,但是不能快進快退,使用移動裝置iPhone之類的就連視訊都播放不了。顯示一個大大的叉。。。

問題查詢

正好,之前同事有一套系統可以正常播放視屏,使用本地的projekktor直接播放遠端資源發現一切正常。於是就排出了前端指令碼的問題。

接下來對比了一下Http請求,在視訊的Response中,發現了兩個主要區別:1、context-type我這是’video/mp4;charshet=UTF-8’,而對方是’video/mp4’。2、對方的Response有range請求,而我的沒有。

context-type

charset是我的SpringMVC的web.xml中設定了forceEncoding=true,並且把URIEncoding設定為了UTF-8。因此我單獨寫了個Controller,輸出測試檔案,同時將response的context-type改為’video/mp4’。此時再次呼叫projekktor直接請求這個地址,得到了’video/mp4’的型別, 但是視訊仍然無法正常播放。故排除該問題。

range請求

這幾個問題在一開始我是沒注意到的,之後經大牛點撥,讓我直接使用瀏覽器訪問視訊資源,即”http://localhost:8080/web/resources/…../aaaaa.mp4“。然後再觀察瀏覽器請求,發現我的伺服器只有一個執行緒在載入資源,而對方伺服器可以開啟三個執行緒。因此可能是HTTP請求的處理不同。大牛說,用nginx直接處理靜態資源而跳過Spring試試。於是上網查了查nginx部署,在這裡也順帶寫一下:

配置如下:

在預設配置下先做代理轉發,將普通請求轉發到8080,即交給Spring處理。將靜態資源請求交給nginx對映(這裡通過地址正則匹配)。

 server
{ listen 80; #監聽80埠 location ^~ /web/resources/ { root:/home/myaccount/webrootl;#匹配路徑中帶有web/resources的請求由nginx對映 } location / { proxy_pass:127.0.0.1:8080; #普通請求轉發到Spring } }

重新啟動專案,成功播放!

後續

雖然問題解決了,但是我也發現同事可以正常播放的系統也是在Spring上建立的,也沒有使用nginx。但是那個系統不好看原始碼,因此我google了一下,發現是由於Spring3.x系統對於http byte request是不支援的,但是Spring4.2以後就支援了。如果要在Spring3的框架上實現該請求,則需要自己實現AbstractView。
可以參考Implementing HTTP byte-range requests in Spring MVC。如果不想實現這個View,還可以直接實現MultiPartFile的處理,詳見:How to Implement HTTP byte-range requests in Spring MVC,或者國內有一個博文:Spring MVC大檔案的斷點續傳(File Transfer Resume),寫得是斷點續傳,其實是同一個問題。

相關推薦

SpringMVC靜態資源對映的時候需要注意的問題

發現問題 最近在開發一個小網站,需要支援在頁面上播放視訊資源(暫時沒考慮流媒體伺服器神馬的,能正常播放就行)。於是在前端使用了HTML5的video標籤。並且配合projekktor播放器來實現。因為還在開發階段,視訊資源的對映就直接交給SpringMVC本身

SpringMVC靜態資源對映

優雅REST風格的資源URL不希望帶 .html 或 .do 等字尾,由於早期的Spring MVC不能很好地處理靜態資源,所以在web.xml中配置DispatcherServlet的請求對映,往往使用*.do、*.xhtml等方式。這就決定了請求URL必須是

JavaEE開發之SpringMVC中的靜態資源對映及伺服器推送技術

在上篇部落格中,我們聊了《》。本篇部落格我們繼續的來聊SpringMVC的東西,下方我們將會聊到js、css這些靜態檔案的載入配置,以及伺服器推送的兩種實現方式。當然我們在伺服器推送時,會用到JQuery的東西,所以我們先聊一下如何載入靜態資原始檔,然後我們再聊如何實現伺服器推送。 下方給出了兩種實現伺服器推

SpringMVC靜態資源對映配置

SpringMVC訪問靜態資源 在SpringMVC中常用的就是Controller與View。但是我們常常會需要訪問靜態資源,如html,js,css,image等。 預設的訪問的URL都會被DispatcherServlet所攔截,但是我們希望靜態資源可以直接訪

springMVC學習--3 靜態資源對映

由於Servlet的攔截作用(servlet-mapping子元素的對映模式),一般無法直接訪問靜態資源。為了直接訪問js、css、圖片等靜態資源,在對配置類新增@EnableWebMvc基礎上,將配置類繼承自WebMvcConfigurerAdapter類,重

springmvc中的靜態資源對映配置

web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://j

SpringMVC訪問靜態資源

and ota 正常 文件中 映射 spring hand blog -- 在SpringMVC的配置文件中加上 <!-- SpringMVC會將靜態資源的請求當成映射請求,加上這個配置就可以通過地址欄訪問請求資源 ,這時正常的請求就不能訪問了 所以必須有&

SpringMVC攔截靜態資源的處理辦法

gmv css 無法 ring 攔截 配置 無法加載 app htm SpringMVC攔截靜態資源導致 JS CSS 無法加載 可以在配置文件中加入以下代碼 <mvc:resources location="/statices/" mapping="/

idea 修改靜態資源需要重啟的辦法

str mpi 啟動 shift pom.xml uil TP 1.3 pri 快捷鍵Ctrl + Alt + S打開設置面板,勾選Build project automatically選項: 快捷鍵Ctrl + Shift + A查找registry命令:

SpringBoot學習_webjars和靜態資源對映規則

SpringBoot簡介 使用SpringBoot 建立SpringBoot應用,選中我們需要的模組; SpringBoot已經預設將這些場景配置好了,只需要在配置檔案中指定少量配置就可以執行起來 自己編寫業務程式碼就可以了 自動配置原理 xxxxAu

springmvc訪問靜態資源,以及相對路徑,絕對路徑問題.

一般情況下,在web工程裡,css js png jpg 這類資原始檔,由瀏覽器發起請求,由 tomcat、jetty、nginx 這類程序直接接管,類似於 jfinal、Struts、spring mvc 框架都不會去幹預. 而 WEB-INF 目錄下面由於有 jar 包、配置檔案等需要被保護的檔案,所以

SpringBoot web開發-靜態資源對映規則

1 Hello World 如何建立一個SpringBoot web專案我這裡就不多贅述了,我們先看看如何傳送一個Hello World 請求把: 建立一個HelloController @RestController public class HelloCon

SpringBoot簡明教程之Web檢視層(一):WebJars及靜態資源對映規則

SpringBoot簡明教程之檢視層(一):靜態資源對映規則及WebJars的使用 文章目錄 SpringBoot簡明教程之檢視層(一):靜態資源對映規則及WebJars的使用 專案建立 靜態資源對映規則 靜態資源對映

SpringBoot學習-webjars和靜態資源對映規則

SpringBoot學習-webjars和靜態資源對映規則 前言 1-以前我們在IDEA中建立一個專案,新增web依賴包,我們現在是一個web應用,應該在man目錄下面有一個webapp資料夾,將所有的頁面都放在這裡,這是我們以前的做法。 2-現在我們建立的這個專案中,沒有這個webapp目錄,但是Sp

【Java開發】tomcat配置外部靜態資源對映路徑(windows和Linux部署)

如果你不想用ngnix配置的話,只單獨使用tomcat的話可以看看這篇文章,接下來開始 使用場景 1.單機開發有時侯如果放在war下每次clean都會清理當前專案下靜態檔案特別折騰. 2.只有啟動tomcat即可靜態檔案放在外面不會被刪,就算未來要上服務也可以選擇繼續tomcat或者

SpringMVC設定靜態資源不攔截三種方式

1、前端控制器的配置 在web.xml中配置 <!-- springmvc的前端控制器 --> <servlet> <servlet-name>springMVC</servlet-name>

SpringBoot——web開發之靜態資源對映

1、通過/webjars/**請求靜態資源 SpringMVC的相關配置都在WebMvcAutoConfiguration類中,在該類中有一處新增資源對映: public void addResourceHandlers(ResourceHandlerRegistry r

springMVC靜態資源放行的兩種方式

在springmvc.xml中放行(常用) 1、配置對全部資源放行 <!-- 全部資源放行 --> <mvc:default-servlet-handler/> 2、對指定

跟我學springboot(十八)springboot-web-webjars和靜態資源對映規則

一.簡介 在使用springboot的web應用時,首先需要建立springboot應用,選擇我們自己需要的模組,springboot已經預設將這些場景配置好了,只需要在配置檔案指定少量的配置就可以執行起來。在使用之前我們需要了解自動配置的原理,可以參考跟我學s

SpringMVC配置靜態資源訪問

在xml的beans中新增  xmlns:mvc="http://www.springframework.org/schema/mvc"  xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springfr