在实际的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方式。这样一对比的话,感受第二种方法可能会更好。对象
对这个需求若是进行扩展的话,能够限制不想被访问者直接访问的全部文件类型。字符串