在實際的web項目中,有些配置項會放在xml文件裏面,對於xml文件,咱們其實並不但願訪問者進行訪問,畢竟xml文件裏面可能配置了一些較爲敏感的信息,好比內網IP、用戶名及密碼等。
對此,但願可以限制訪問者直接在地址欄鍵入連接地址訪問到xml文件。html
一、 判斷請求方式(POST、GET)java
在web項目內讀取xml文件通常進行的是POST請求,而經過地址欄鍵入地址訪問則爲GET請求,依次來區分。web
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpreq = (HttpServletRequest) request; String method = httpreq.getMethod(); if("GET".equals(method)) { httpres.sendRedirect(httpreq.getContextPath() + "/error.html"); return; } chain.doFilter(request, response); }
固然,在web.xml裏面也要相應的配置filter:app
<filter> <filter-name>authVisitPage</filter-name> <filter-class>web.AuthVisitFilter</filter-class> </filter> <filter-mapping> <filter-name>authVisitPage</filter-name> <url-pattern>*.xml</url-pattern> </filter-mapping>
二、 利用document.referrer屬性url
referrer是與對網頁的請求有關的document對象中的屬性。referrer屬性中保存着連接到當前頁面的那個頁面的URL,在沒有來源頁面的狀況下,referrer屬性中可能會包含空字符串。
該屬性不可設置。code
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpreq = (HttpServletRequest) request; String referer = httpreq.getHeader("Referer"); if(referer == null) { httpres.sendRedirect(httpreq.getContextPath() + "/error.html"); return; } chain.doFilter(request, response); }
這裏只是判斷referer是否爲空,但忽略了一種狀況:
假設已知xml的路徑(如:http://域名/configs/*.xml),咱們能夠在本地新建一個web工程,裏面增長一個跳轉xml
<a href="http://域名/configs/*.xml">跳轉</a>
若是仍是用以前的過濾器,只是判斷referer是否爲空的話,是不可以過濾掉這種跳轉過來的訪問請求。對此,過濾器須要增長判斷:禁止非內部訪問htm
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpreq = (HttpServletRequest) request; String referer = httpreq.getHeader("Referer"); String host = httpreq.getHeader("Host"); if(referer == null || referer.indexOf(host) < 0) { httpres.sendRedirect(httpreq.getContextPath() + "/error.html"); return; } chain.doFilter(request, response); }
對於第一種方法,應該也存在跳轉訪問這個bug,同時這種方法就要求內部全部對xml的訪問都應確保爲POST方式。這樣一對比的話,感受第二種方法可能會更好。對象
對這個需求若是進行擴展的話,能夠限制不想被訪問者直接訪問的全部文件類型。字符串