`
=死神=
  • 浏览: 56764 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过Filter 实现简单的防盗链

    博客分类:
  • Java
阅读更多

一、目录结构

防盗链目录

二、输写DlFilter.java文件

package Daolian;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Properties;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DlFilter implements Filter {
	// 限制访问地址列表
	public static List urlNoAccess = new ArrayList();

	// 允许访问列表
	public static List urlAllow = new ArrayList();

	// 错误地址列表
	public static String urlError = "";
	
	public void destroy() {
		// TODO Auto-generated method stub

	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		HttpServletResponse httpResponse = (HttpServletResponse) response;
		// 获取HTTP头文件
		String requestAddress = httpRequest.getRequestURL().toString();
		String requestHeader = httpRequest.getHeader("referer");

		if(!requestAddress.startsWith(urlError))
		{
			//循环止访问列表
			for (int i = 0; i < urlNoAccess.size(); i++) {
				//如果(请求头为空 或者 请求头为禁访问目录)并且请求地址为禁止访问目录
				//转向错误文件

				if ((requestHeader == null || requestHeader.startsWith(urlNoAccess.get(i).toString().trim()))
						&& requestAddress.startsWith(urlNoAccess.get(i).toString().trim())) {
					if (urlError == null || urlError.equals("")) {
						httpResponse.sendError(404);
					} else {
						httpResponse.sendRedirect(urlError.trim());
					}
					return;
				}
				//如果请求头为禁访问目录
				if (requestAddress.startsWith(urlNoAccess.get(i).toString().trim())) {
					boolean flog = true;
					//如果请求头文件 不在允许请求范围内
					if (urlAllow != null && urlAllow.size() > 0) {
						for (int j = 0; j < urlAllow.size() && flog; j++) {
							if (requestHeader.startsWith(urlAllow.get(j).toString().trim())) {
								flog = false;
							}
						}
					}
					if (!flog) {
						if (urlError == null || urlError.equals("")) {
							httpResponse.sendError(404);
						} else {
							httpResponse.sendRedirect(urlError.trim());
						}
						return;
					}
				}
			}
		}
		chain.doFilter(httpRequest, httpResponse);
	}

	public void init(FilterConfig fc) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("盗链起动");
		try {
			String fp = fc.getServletContext().getRealPath(
					"/WEB-INF/classes/filter.properties");
			File file = new File(fp);
			Properties properties = new Properties();
			properties.load(new FileInputStream(file));
			// 限制访问地址
			String urlfilter = properties.getProperty("url.noAccess");
			if (urlfilter != null) {
				String[] filter = urlfilter.split(",");
				for (int i = 0; i < filter.length; i++) {
					urlNoAccess.add(((String)filter[i]).trim());
				}
			}
			// 根目录
			String urlroot = properties.getProperty("url.allow");
			if (urlroot != null) {
				String[] allow = urlroot.split(",");
				for (int i = 0; i < allow.length; i++) {
					urlAllow.add(((String)allow[i]).trim());
				}
			}
			// 文件错误地址
			urlError = properties.getProperty("url.error");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

三、filter.properties配置文件

#url.noAccess 要过滤文件地址  多个文件以","隔开
url.noAccess=http://localhost:8080/filter/downloads
#url.allow 根目录文件列表 多个文件以","隔开
url.allow=http://127.0.0.1,http://localhost
#url.error 错误文件地址
url.error=http://localhost:8080/filter/error/error.jsp

 

四、web.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<filter>
		<filter-name>daolian</filter-name>
		<filter-class>Daolian.DlFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>daolian</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

 

  • 大小: 12.2 KB
分享到:
评论
4 楼 ioriyagami808 2009-03-18  
恩,不错,很好的东西,研究研究,多谢啦
3 楼 springfeel 2008-11-18  
怎么进行图片防盗处理呀
2 楼 =死神= 2008-10-30  
My_JavaEye_2008 写道

谢谢有这么好的东西可以拿出来大家分享。 通过这个能对图片进行防盗链吗? 请赐教。

1 楼 My_JavaEye_2008 2008-10-22  
谢谢有这么好的东西可以拿出来大家分享。
通过这个能对图片进行防盗链吗?
请赐教。

相关推荐

Global site tag (gtag.js) - Google Analytics