工做原理html
利用strust2的action通配對保護的圖片獲得後返回流文件,若是目錄下沒有找到圖片,則返回未找到圖片提示;對請求的IP進行對比,若是不在容許的IP列表時則返回沒有權限的圖片。java
首先在struts.properties文件中添加查詢後綴,struts的默認爲action,能夠添加多個,中間用「,」隔開apache
struts.i18n.encoding = UTF-8 struts.action.extension = html,jpg struts.devMode=true struts.custom.i18n.resources=messageResource struts.locale=zh_CN struts.multipart.saveDir=javax.servlet.context.tempdir struts.ui.theme=simple struts.enable.DynamicMethodInvocation=true
添加action類Test,其中有兩個屬性:String contentType,InputStream bis,前者是制定輸出的流文件類型,後一個是文件流瀏覽器
package test.com.eca.service; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import main.com.eca.util.JsonUtil; import org.apache.struts2.ServletActionContext; import org.nail.common.BaseAction; import com.opensymphony.xwork2.Action; public class Test extends BaseAction { private BufferedOutputStream bos = null; private BufferedInputStream bis = null; private String imgPath; private String contentType; public String testImg() throws Exception { HttpServletRequest request = ServletActionContext.getRequest(); System.out.println("request.getHeader(\"user-agent\")" + request.getHeader("user-agent")); System.out.println("請求來源於瀏覽器 :"+BrowseTool.checkBrowse(request.getHeader("user-agent"))); // 訪問圖片後綴 StringBuffer requestUrl = request.getRequestURL(); String fileType = requestUrl.substring(requestUrl.lastIndexOf(".")); // 獲得訪問的IP String reqIp = IpUtils.getIpAddr(request); System.out.println("img : " + imgPath + fileType); System.out.println("ip : " + reqIp); // 的到容許的IP的Map if ("127.0.0.1".equals(reqIp)) { bis = new BufferedInputStream(new FileInputStream( "D:/images/no_acc_image.jpg")); return Action.SUCCESS; } // 判斷是否有權限 try { try { bis = new BufferedInputStream(new FileInputStream("D:/images/" + imgPath + fileType)); } catch (Exception e) { // e.printStackTrace(); bis = new BufferedInputStream(new FileInputStream( "D:/images/no_image.jpg")); } } catch (final IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return Action.SUCCESS; } public static void main(String[] args) throws Exception { System.out.println("abcds".substring("abcds".indexOf("c"))); } public BufferedOutputStream getBos() { return bos; } public void setBos(BufferedOutputStream bos) { this.bos = bos; } public BufferedInputStream getBis() { return bis; } public void setBis(BufferedInputStream bis) { this.bis = bis; } public String getImgPath() { return imgPath; } public String getContentType() { return contentType; } public void setContentType(String contentType) { this.contentType = contentType; } public void setImgPath(String imgPath) { this.imgPath = imgPath; } } /** * * @author cc 20120307 */ class BrowseTool { private final static String IE5_5 = "MSIE 5.5"; private final static String IE9 = "MSIE 9.0"; private final static String IE8 = "MSIE 8.0"; private final static String IE7 = "MSIE 7.0"; private final static String IE6 = "MSIE 6.0"; private final static String MAXTHON = "Maxthon"; private final static String QQ = "QQBrowser"; private final static String GREEN = "GreenBrowser"; private final static String SE360 = "360SE"; private final static String FIREFOX = "Firefox"; private final static String OPERA = "Opera"; private final static String CHROME = "Chrome"; private final static String SAFARI = "Safari"; private final static String OTHER = "其它"; public static String checkBrowse(String userAgent) { if (regex(OPERA, userAgent)) { return OPERA; } else if (regex(CHROME, userAgent)) { return CHROME; } else if (regex(FIREFOX, userAgent)) { return FIREFOX; } else if (regex(SAFARI, userAgent)) { return SAFARI; } else if (regex(SE360, userAgent)) { return SE360; } else if (regex(GREEN, userAgent)) { return GREEN; } else if (regex(QQ, userAgent)) { return QQ; } else if (regex(MAXTHON, userAgent)) { return MAXTHON; } else if (regex(IE9, userAgent)) { return IE9; } else if (regex(IE8, userAgent)) { return IE8; } else if (regex(IE7, userAgent)) { return IE7; } else if (regex(IE6, userAgent)) { return IE6; } else if (regex(IE5_5, userAgent)) { return IE5_5; } return OTHER; } private static boolean regex(String regex, String str) { Pattern p = Pattern.compile(regex, Pattern.MULTILINE); Matcher m = p.matcher(str); return m.find(); } } class IpUtils { public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } }
在actionContext.xml文件中加入bean配置:
<bean id="test" class="test.com.eca.service.Test" parent="baseAction" scope="prototype"> </bean>
以後配置action配置tomcat
<package name="test" extends="struts-default" namespace="/images"> <!-- 測試圖片權限管理 --> <action name="*" class="test" method="testImg"> <param name="imgPath">{1}</param> <result type="stream"> <param name="contentType">image/jpeg</param> <param name="inputName">bis</param> <!-- 指定下載的文件名 --> <!--<param name="contentDisposition">filename="wjc_lgo.jpg"</param>--> <!-- 指定下載文件時的緩衝大小 --> <!--<param name="bufferSize">1024</param>--> </result> </action> </package>其中注意,namespace要加入「/」,不然輸入地址「http://xxx/images/abc.jpg」則沒法找到,平配置意思爲地址路徑爲「http://xxx/images/」開頭的,已「.jpg」結尾的全部的請求都轉爲處理。
例如:「http://xxx/images/abc.jpg」並將「imgPath」做爲參數調用action的方法測試
inputName指定爲action的文件流的名稱ui
下載的文件名、緩衝區大小在此不配置也能夠this
完成後地址欄輸入「http://192.168.2.15:5050/ecs/images/tomcat.jpg」後就能夠看到成果了
spa