java struts2模擬百度百科圖片中的防盜鏈設置

工做原理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

相關文章
相關標籤/搜索