wap应用对请求地址的限制 filter

转载 2005年03月03日 01:19:00
 

/*
 * Created on 2004-12-2
 *wap应用对请求地址的限制 filter,也可以用于其他
 *
 */
package org.nightkids.filter.wap;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Enumeration;
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;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author weidewang
 */
public class BlockNotMobileAccess implements Filter {
 private Log _logger = LogFactory.getLog(this.getClass());

 private static final String MODE_SESSION_IP = "BlockNotMobileAccessModeSession";

 private static FilterConfig filterConfig;

 private HttpServletRequest request;

 private HttpServletResponse response;

 private HttpSession session;

 private static Properties gatewayProperties = new Properties();

 private static List gatewayList = new ArrayList();

 public void init(FilterConfig fconfig) throws ServletException {
  filterConfig = fconfig;
  initGatewayList(filterConfig);
 }

 /**
  * 加载网关列表
  *
  * @param fc
  */
 private void initGatewayList(FilterConfig fc) {
  String properRealPath = fc.getServletContext().getRealPath(fc.getInitParameter("gateway-properties"));
  try {
   gatewayProperties.load(new FileInputStream(properRealPath));
   _logger.debug("已经读取全国网关列表配置文件: " + properRealPath);
   Enumeration elems = gatewayProperties.elements();
   while (elems.hasMoreElements()) {
    String gateway = (String) elems.nextElement();
    // 如果 gateway 里面没有 - 的话 就是一个单一的 IP ,直接加到 list 中,否则 获取 - 左边到 . 的,- 右边到 结束的 字符串,转为数字,然后遍历一下为单一的 ip 加入 list 中
    int indexOf = gateway.indexOf("-");
    if (indexOf == -1) {// 如果是单一ip,直接加到 list 中
     gatewayList.add(gateway);
     _logger.debug("添加一个网关: " + gateway);
    } else {
     // 否则是一个 ip 组,现在只解析最后一段 ip 组
     // 首先获取到 - 左边 第一个 . 到开始的字符串
     int indexLeftPoint = gateway.lastIndexOf(".", indexOf) + 1;// 获取 - 左边到 . 的 字符串
     String prefixStr = gateway.substring(0, indexLeftPoint);// 获取到 - 左边 第一个 . 到开始的字符串
     String leftStr = gateway.substring(indexLeftPoint, indexOf).trim();// 得到左边的字符串
     String rightStr = gateway.substring(indexOf + 1).trim();// 获取 - 右边到结束的 字符串
     // 已经得到字符串之后,就要遍历一下分割成单独的 ip 加入到 list 中
     int leftInt = Integer.parseInt(leftStr);
     int rightInt = Integer.parseInt(rightStr);
     for (int i = leftInt; i <= rightInt; i++) {
      String grGateway = prefixStr + i;
      gatewayList.add(grGateway);
      _logger.debug("添加一个网关: " + grGateway);
     }
    }
   }
   _logger.debug("共添加了 " + gatewayList.size() + " 个网关.");
  } catch (NullPointerException e) {
   _logger.debug("读取全国网关列表配置文件错误:(没有设置 gateway-properties) " + e);
  } catch (FileNotFoundException e) {
   _logger.debug("读取全国网关列表配置文件错误:(找不到配置文件):" + properRealPath + " " + e);
  } catch (IOException e) {
   _logger.debug("读取全国网关列表配置文件错误:(IO错误):" + properRealPath + " " + e);
  }
 }

 /**
  *
  */

 public void doFilter(ServletRequest _servletRequest, ServletResponse _servletResponse, FilterChain filterChain) throws IOException, ServletException {
  boolean isActive = false;
  boolean allowAccess = false;
  request = (HttpServletRequest) _servletRequest;
  response = (HttpServletResponse) _servletResponse;
  session = request.getSession(true);
    
    if (null != filterConfig.getInitParameter("active")) {
   if ("true".equalsIgnoreCase(filterConfig.getInitParameter("active")) || "yes".equalsIgnoreCase(filterConfig.getInitParameter("active"))) {
    isActive = true;
    _logger.debug("激活 " + this.getClass().getName());
   }
  }

  if (isActive) {
   allowAccess = doProcess(request);
  } else {
   allowAccess = true;
  }

  if (!allowAccess) {
   error();
   return;
  }
  filterChain.doFilter(_servletRequest, _servletResponse);
 }

 /**
  * @param req
  * @return true 通过,false 不能通过
  */
 private boolean doProcess(HttpServletRequest req) {
  String userAgent = null;
  boolean bRe = true;
  /**
   * 设置调试模式
   */
  String modeName = filterConfig.getInitParameter("mode-name");
  String modeValue = filterConfig.getInitParameter("mode-value");
  if (modeName != null && modeValue != null) {
   if (request.getParameter(modeName) != null && modeValue.equals(request.getParameter(modeName)) || modeValue.equals(session.getAttribute(MODE_SESSION_IP))) {
    session.setAttribute(MODE_SESSION_IP, modeValue);
    return bRe;
   }
  }
  /*
   * 首先判断浏览器类型
   */
  String[] blockUserAgent = {
    "Mozilla", "ApacheBench"
  };
  userAgent = req.getHeader("User-Agent").toLowerCase();

  int indexOf = userAgent.indexOf("/");
  if (indexOf == -1) {
   indexOf = userAgent.indexOf("*");
   if (indexOf == -1) {
    indexOf = userAgent.length();
   }
  }
  userAgent = userAgent.substring(0, indexOf);
  for (int i = 0; i < blockUserAgent.length; i++) {
   String str = blockUserAgent[i].toLowerCase();
   if (str.equalsIgnoreCase(userAgent)) {
    return false;
   }
  }
  String getRemoteAddr = request.getRemoteAddr();
  if (!gatewayList.contains(getRemoteAddr)) {// 如果网关列表里没有访问者ip 的话,不允许访问
   return false;
  }
  return bRe;
 }

 public void destroy() {

 }

 private void error() throws IOException {
  response.setContentType(filterConfig.getInitParameter("content-type"));
  StringBuffer sb = new StringBuffer();
  String errorMessage = "对不起,请使用手机访问.";
  if (filterConfig.getInitParameter("ERROR_MESSAGE") != null) {
   errorMessage = filterConfig.getInitParameter("ERROR_MESSAGE");
  }
  sb.append("<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/" /"http://www.wapforum.org/DTD/wml_1.1.xml/"><wml><card><p align=/"center/">" + errorMessage + "<br/><a href=/"http://wap.monternet.com//">梦网首页</a></p></card></wml>");
  Writer out = response.getWriter();
  out.write(sb.toString());
  out.close();
 }

}

相关文章推荐

08cms房产7.1旗舰版+7.0升级包+最新WAP手机触屏版:微信公众平台新增多个重量级功能,无任何限制

08cms房产系统v7.1旗舰版继续沿用7.0全新的宽屏风格(08cms房产旗舰版在7.0就把首页,资讯频道,特价房列表,内容页,新房频道,视频频道,图库频道,户型列表内容页等做了整体的改版,全部为宽...

方维P2P理财版3.6+全新wap手机版+App源代码:新增加息卷+身份认证接口+微信公众平台,全开源,无域名和证书等任何限制

方维P2P理财版3.6源码下载+详细使用说明:http://www.souho.net/thread-1066042-1-1.html 方维P2P理财版3.6,相对方维p2p 3.6,除...

struts2 filter过滤器转换请求地址

先说一下需求,最近项目需要把前台请求的地址进行加密,但是不能影响后台程序流转加密用的类:package test; import java.security.Key; import java.se...

Android:漫画APP开发笔记之从WAP网站解析图片地址并加载图片

使用Jsoup解析网页。在项目中,通过浏览器访问网址点击“下一页”能正常翻页,而Android客户端每次GET的“下一页”地址都是第一页。原来是因为android客户端向网站发送HTTP请求时,没有在...
  • cooelf
  • cooelf
  • 2015年02月02日 22:50
  • 1086

Java Filter 限制用户浏览权限

  • 2010年04月21日 19:53
  • 1000KB
  • 下载

ISAPI Filter 限制 IIS 多线程访问

  • 2006年01月13日 09:51
  • 119KB
  • 下载

构建WAP应用程序开发环境

WAP(Wireless Application Protocal)是开放的协议,这与日本的I-MODE有所不同,后者是封闭的。WAP事实上是无线网络和Internet网络相结合的产物。本来的无线网络...
  • xjbclz
  • xjbclz
  • 2016年07月14日 20:36
  • 259

ISAPI Filter 限制 IIS 多线程访问!

  • 2006年02月23日 09:05
  • 93KB
  • 下载

MANA框架在wap游戏开发中的应用

Apache MINA框架   用户 IoService>IoProCessor>IoFilter>IoFilter>IoFilter>IoHandler 从左至右Reads,从右至左Writes...
  • msngsm
  • msngsm
  • 2012年07月01日 19:03
  • 567
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:wap应用对请求地址的限制 filter
举报原因:
原因补充:

(最多只允许输入30个字)