文档章节

设置站点黑名单的过滤器

J
 Java编程思想
发布于 2014/08/04 09:15
字数 750
阅读 83
收藏 0

功能描述

        不允许从禁用的站点(IP)访问当前应用,也不允许从禁用的站点链接到当前应用。
        为了简单起见,设置禁用站点时,暂不支持使用通配符。只是抛砖引玉了。
        比如:禁止其他的网站引用本站的图片资源,只需在此基础上稍作修改即可。

使用方法

        在 java web 项目的 web.xml 文件中添加如下代码。

 <!--设置站点黑名单的过滤器配置  开始 -->
 <filter>
  <filter-name>BannedAccessFilter</filter-name>
  <filter-class>com.hmw.filter.BannedAccessFilter</filter-class>
  <init-param>
      <description>需要禁用的站点,一个站点占用一行</description>
      <param-name>bannedSites</param-name>
      <param-value>
          192.168.1.101
          192.168.1.102
          www.csdn.net
      </param-value>
  </init-param>
 </filter>
 
 <filter-mapping>
  <filter-name>BannedAccessFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
 <!--设置站点黑名单的过滤器配置  结束 -->

过滤器源码

package com.hmw.filter;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.StringTokenizer;

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 org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

/**
 * 设置禁用站点(黑名单)的过滤器
 * @author 何明旺
 */
public class BannedAccessFilter implements Filter {
    static final Logger logger = Logger.getLogger(BannedAccessFilter.class);
    
	private HashSet bannedSiteTable;
	
	/**
	 * 将配置的禁用站点列表初始化到一个 HashSet 中
	 */
	@Override
	public void init(FilterConfig config) throws ServletException {
		bannedSiteTable = new HashSet();
		String bannedSites = config.getInitParameter("bannedSites");
		// Default token set: white space.
		StringTokenizer tok = new StringTokenizer(bannedSites);
		while (tok.hasMoreTokens()) {
			String bannedSite = tok.nextToken();
			bannedSiteTable.add(bannedSite);
			logger.info("Banned " + bannedSite);
		}
	}
	
	/**
	 * 如果请求来自被禁用的站点,或是从被禁用的站点链接过来的,则拒绝访问。
	 */
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
		logger.debug("BannedAccessFilter: Filtering the Request...");
		
		HttpServletRequest req = (HttpServletRequest) request;
		String requestingHost = req.getRemoteHost();
		String referringHost = getReferringHost(req.getHeader("Referer"));
		
		String bannedSite = null;
		boolean isBanned = false;
		if (bannedSiteTable.contains(requestingHost)) {
			bannedSite = requestingHost;
			isBanned = true;
		} else if (bannedSiteTable.contains(referringHost)) {
			bannedSite = referringHost;
			isBanned = true;
		}
		
		if (isBanned) {
			showWarning(response, bannedSite);
		} else {
			chain.doFilter(request, response);
		}
		
		logger.debug("BannedAccessFilter: Filtering the Response...");
	}

	@Override
	public void destroy() {
	}

	/**
	 * 根据 URL 链接地址,取得该链接地址所在的站点
	 * @param refererringURLString URL链接地址
	 * @return 该 URL 链接地址所在的站点,如果传入的参数不是一个符合URL规范的字符串,则返回 null
	 */
	private String getReferringHost(String refererringURLString) {
	    if(StringUtils.isBlank(refererringURLString))
	        return null;
	    
		try {
			URL referringURL = new URL(refererringURLString);
			return referringURL.getHost();
		} catch (MalformedURLException mue) { // Malformed
			return null;
		}
	}

	/**
	 * 如果用户是从禁用站点访问的该应用,或是从禁用站点链接过来的,则调用此方法将警告信息展现给用户。
	 * @param response HTTP请求响应对象
	 * @param bannedSite 禁止的站点
	 * @throws ServletException
	 * @throws IOException
	 * @author 何明旺
	 */
	private void showWarning(ServletResponse response, String bannedSite) throws ServletException, IOException {
	    String htmlCode  = "";
	    htmlCode += "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";
	    htmlCode += "<html xmlns=\"http://www.w3.org/1999/xhtml\">";
	    htmlCode += "  <head>";
	    htmlCode += "      <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />";
	    htmlCode += "      <title>禁止访问</title>";
	    htmlCode += "  </head>";
	    htmlCode += "  <body>";
	    htmlCode += "      <h1>禁止访问</h1>";
	    htmlCode += "      <p>对不起,您无法访问该资源,因为您的站点已经被列入我们的黑名单!</p>";
	    htmlCode += "      <p>您的站点是:<strong>" + bannedSite + "</strong></p>";
	    htmlCode += "  </body>";
	    htmlCode += "</html>";

	    response.setContentType("text/html");
	    PrintWriter out = null;
	    try{
	        out = response.getWriter();
    		out.println(htmlCode);
	    }finally{
    	      if(out != null){
    	        out.flush();
    	        out.close();
    	      }
    	}
    	
    	/*
    	 * 也可以使用下面的方法直接转发或重定向到指定的警告页面
    	 * 转发:
    	 *     ((HttpServletRequest)request).getRequestDispatcher("/warn.html").forward(request, response);
    	 * 重定向:
    	 *     ((HttpServletResponse)response).sendRedirect("webAppContext/warn.html");
    	 */
	}
}


本文转载自:http://www.cnblogs.com/hemingwang0902/archive/2012/01/11/banned-access-filter.html

J
粉丝 27
博文 166
码字总数 10234
作品 0
广州
程序员
私信 提问
设置站点黑名单的过滤器(BannedAccessFilter)

功能描述 不允许从禁用的站点(IP)访问当前应用,也不允许从禁用的站点链接到当前应用。 为了简单起见,设置禁用站点时,暂不支持使用通配符。只是抛砖引玉了。 比如:禁止其他的网站引用本...

ForingY
2016/05/20
16
0
Safari浏览器bug可引发XSS

     研究人员发现一个Safari浏览器的bug,利用该bug可以绕过浏览器的过滤器,并进行XSS。之前也有研究人员发现过该漏洞,因此漏洞并不是第一次出现。   先看一个研究人员偶然发现脚本...

嘶吼RoarTalk
2018/10/24
0
0
Spring cloud Zuul Filter 使用小经验

前言 Filter 我们用的比较多,大部分是Servlet中的Filter,通常我们用来做一些拦截,权限验证之类的工作。 今天介绍的Filter是Zuul中提供的,跟我们之前使用的Servlet Filter不太一样。 Zuul...

尹吉欢
2017/12/08
0
0
算法分析:使用布隆过滤器(Bloom Filter)进行大数据量排序

题目大意:移动公司需要对已经发放的所有139段的号码进行统计排序,已经发放的139号码段的文件都存放在一个文本文件中(原题是放在两个文件中),一个号码一行,现在需要将文件里的所有号码进...

苗哥
2014/03/20
0
3
Confluence 6 使用 Fail2Ban 来限制登录尝试

什么是 Fail2Ban? 我们需要在我们网站中防止密码的暴利破解。Fail2Ban 是一个 Python 的应用来查看日志文件,使用的是正则表达式,同时还可以与Shorewall (或者 iptables)直接工作来来启用...

honeymose
2018/08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python中使用epoll开发服务端程序

这是个很简单的C/S模型的程序,流程其实和C语言相差不大,客户端发送字符串,服务端再将该字符串返回客户端,epoll中使用的边缘触发。   #服务端代码 import socket, logging import select...

shzwork
22分钟前
0
0
C# .Net技术面试

1、引子   最近一直在负责.net(B/S方向)技术面试相关的工作,前前后后面试了不少人,但是通过率较低,大概只有20%左右;有颇多感慨。   最近也一直比较困惑,原因究竟是什么?   是我们...

元歌
26分钟前
0
0
趣图:苦逼的后端工程师

扩展阅读 趣图:前端程序员想改后台代码时,后台程序员的样子 趣图:后端工程师是怎样调试CSS的 趣图:程序猿和运维狗的工作日常……

Java面经
32分钟前
0
0
理解矩阵乘法

http://www.ruanyifeng.com/blog/2015/09/matrix-multiplication.html

gdxz110
33分钟前
0
0
Centos 安装 python2.7

Centos 安装 python2.7 参考资料 How To Set Up Python 2.7.6 and 3.3.3 on CentOS 6.4 (CentOS6.4 上安装 Python2.7.6 和 3.3.3 的方法) 清华大学 pip 源 Python 虚拟环境 virtualenv 安装......

汉高祖
33分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部