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();
 }

}

wap应用对请求地址的限制 filter,也可以用于其他

/* * Created on 2004-12-2 *wap应用对请求地址的限制 filter,也可以用于其他 *  */package org.nightkids.filter.wap;import...
  • TomyGuan
  • TomyGuan
  • 2007年08月22日 11:49
  • 450

struts2 filter过滤器转换请求地址

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

Filter的使用(对请求和响应数据进行替换)

一、过滤器配置web.xml           GuestbookFilter         test.GuestbookFilter                        ...
  • u011631266
  • u011631266
  • 2013年11月20日 00:56
  • 2384

Filter拦截器获取请求相关内容

Filter拦截器获取请求相关内容
  • daixinmei
  • daixinmei
  • 2014年04月01日 11:37
  • 1911

filter对request请求拦截,对请求参数进行修改

package com.hjzx.goldShopV2.filter;import java.io.IOException;import java.util.ArrayList;import java...
  • a764340703
  • a764340703
  • 2017年04月14日 11:08
  • 2086

android 应用对内存是如何限制的?我们应该如何合理使用内存?如何限制的?

内存
  • xiaopihair123
  • xiaopihair123
  • 2016年11月13日 15:12
  • 1174

Servlet实现网络IP过滤

package com.msit.servlet; import java.io.IOException; import javax.servlet.Filter; import javax.s...
  • u013440660
  • u013440660
  • 2014年08月07日 22:30
  • 698

Java Web安全测评--开发细节

本文由笔者在Java Web应用中,对安全性开发的过程中的一些技术积累,对安全性没啥概念的童鞋可以参考下(大神请绕道,不喜勿喷)。由于所在公司请了专门的软件安全公司,需要对公司的项目做安全性测评,针对...
  • lizhou828
  • lizhou828
  • 2018年01月05日 11:59
  • 52

filter 实现 请求数据与返回数据的加解密

本文主要介绍了 如何在 过滤器中 对 请求数据 和返回数据 做处理
  • yao2923828
  • yao2923828
  • 2017年03月29日 11:09
  • 1317

使用filter改变改变地址,但又不想被本过滤器再次拦截的方法

重新建一个类继承HttpServletRequestWrapper父类,覆盖getRequestURI()方法并传入新的url,package com.hlzt.bjcl.filter; impor...
  • u013378306
  • u013378306
  • 2015年12月19日 09:50
  • 886
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:wap应用对请求地址的限制 filter
举报原因:
原因补充:

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