分享
 
 
 

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

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

/*

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

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有