哈囉大家好,這裡是又被Wicket挖坑跳得小編過路君子
上次寫 Wicket 筆記是兩個月前,那時候是為了 Cookie 煩惱,而這次則是為了 Header 煩惱......
有時候總會在意想不到的地方發生錯誤,這次是在小編想要用 Wicket 來寫一個從伺服器下載檔案並分析的功能。
結果呢,就被瀏覽器擋住檔案下載的功能了,後來發現原因是因為 Header 的 Access-Control-Allow-Origin 屬性未設定,所以瀏覽器不允許由 Javascript 自行在背景下載的檔案
順帶一提,似乎由使用者發起的檔案下載請求不會因為 Access-Control-Allow-Origin 導致下載被瀏覽器封鎖(仍須進一步的測試)。
設定Header
所以現在問題就是要如何去設定 Header,僅需在繼承了 WebPage 的那個 class 內加入以下資訊即可:
import org.apache.wicket.request.http.WebResponse; public class myPage extends WebPage { @Override protected void setHeaders(WebResponse response) { // default response.setHeader("Date", "[now]"); response.setHeader("Expires", "[0]"); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); // customize String fullUrl = this.getRequestCycle().get().getUrlRenderer().renderFullUrl(this.getRequestCycle().get().getRequest().getUrl()); response.setHeader("Access-Control-Allow-Origin", fullUrl.substring(0, fullUrl.indexOf('/', fullUrl.indexOf('/')+2))); } }
因為 Wicket 會有一些預設的 Header 值,所以我們必須要手動加回去,詳細資訊可以參考這裡。
順帶一提,上面網址抓取的寫法只能自適應 IPv4 而已,IPv6 會出問題。
而設定方式可以參考下圖或是原本的出處這裡:
(所有圖片點擊都可以放大、變高清)
讀取Header
僅需要兩行,即可讀出特定 Header 欄位的值:
import javax.servlet.http.HttpServletRequest; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.request.mapper.parameter.PageParameters; public class myPage extends WebPage { public api_v1_stellar_server(PageParameters pageParameters) { HttpServletRequest request = ((HttpServletRequest) this.getRequest().getContainerRequest()); String authorization = request.getHeader("Authorization"); } }
後記
就只有設定方式比較麻煩,讀取倒是還好。