`
myhongkongzhen
  • 浏览: 96991 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

网站访问通过IP(段)作为限制条件的实现方法

    博客分类:
  • J2EE
阅读更多

2009年5月7号  星期四  天气晴

 

 

         今天完成了通过本机IP作为访问网站服务器限制条件的实现,主要是通过Filter来完成的,再加上struts2的应用,

 

通过读取IPINFO的配置文件,得到不受限制的IP或者是IP段,检测发来请求的客户端的IP地址,是否属于配置文件中的IP

 

段,如果属于,通过struts2配置,将其放行,可以正常访问网页,如果不属于,转到登录页面,如果登录成功,放行,否

 

则,退回登陆页面。

 

具体实现代码:

 

 

IPINFO配置文件

 

IPINFO

 

=============================我是分割线==============================

 

读取配置文件的代码

ReadIPInfoFileUtil2。java

 

package g.cms.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;

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

/**
 * @author Jane(吴贞贞)
 * @email myhongkongzhen@gmail.com
 * @since JDK 1.6
 * @alter 2009年5月7号
 * @version 1.0 2009年5月7号
 */
public class ReadIPInfoFileUtil2 {
 private static final Log log = LogFactory.getLog(ReadIPInfoFileUtil2.class);
 private static Properties ipInfoPro = new Properties();
 static {
  log.debug("IPInfo.properties loading...");
  InputStream is = null;

  try {
   is = ReadIPInfoFileUtil2.class.getClassLoader()
     .getResourceAsStream("IPInfo.properties");
   ipInfoPro.load(is);
   log.debug("cIPInfo.properties load success!");
  } catch (IOException e) {
   log.debug("LOAD IPInfo.properties ERROR!");
   e.printStackTrace();
  }
 }

 

//测试用的

 public static void main(String[] args) {
  System.out.println(ReadIPInfoFileUtil2.test());

  List<String> ipInfosList = ReadIPInfoFileUtil2.readIPInfos();
  for (String ipInfo : ipInfosList) {
   System.out.println(ipInfo);

   if ("127.0.0.13".indexOf(ipInfo) == 0) {
    System.out.println(ipInfo + " == OK");
   } else {
    System.out.println("ERROR");
   }
  }
 }

 public static String test() {
  return ipInfoPro.getProperty("IP45");
 }

 public static List<String> readIPInfos() {

  List<String> ipInfosList = new LinkedList<String>();
  for (int i = 0;; i++) {
   String ipInfo = ipInfoPro.getProperty("IP" + i);
   if (null == ipInfo || "".trim().equals(ipInfo)) {
    break;
   } else {
    ipInfosList.add(ipInfo);
   }
  }

  return ipInfosList;

 }
}

 

  

=============================我是分割线==============================

 

IP限制的核心代码:

IPFilter.java

 

package g.web.filter;

import g.cms.util.ReadIPInfoFileUtil2;

import java.io.IOException;
import java.util.List;
import java.util.Map;

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 Jane(吴贞贞)
 * @email myhongkongzhen@gmail.com
 * @since JDK 1.6
 * @alter 2009年5月7号
 * @version 1.0 2009年5月7号
 */

 

public class IPFilter implements Filter {

 private static final Log log = LogFactory.getLog(IPFilter.class);

 @Override
 public void destroy() {
  // TODO Auto-generated method stub

 }

 @Override
 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  // TODO Auto-generated method stub

  request.setCharacterEncoding("utf8");
  response.setContentType("text/html;charset=utf8");

  HttpServletRequest req = (HttpServletRequest) request;
  HttpServletResponse resp = (HttpServletResponse) response;

  HttpSession session = req.getSession(true);
  Map<String, Object> usr_map = (Map<String, Object>) session
    .getAttribute("USR_MAP");

  if (usr_map == null) {
   log.debug("用户对象为空,当前用户还没有登录");

   String remortIp = getRemortIP(req);
   log.debug("REQUEST PATH FIRST : " + remortIp);

   List<String> ipInfosList = ReadIPInfoFileUtil2.readIPInfos();
   // log.debug("IP SIZE : " + ipInfosList.size());
   String rightIpInfo = null;
   for (String ipInfo : ipInfosList) {
    // if (!ipInfo.trim().equals(remortIp.trim())) {
    // log.debug("====ERROR IP INFO=====");
    // } else {
    // log.debug("---OK IP INFO---");
    // rightIpInfo = ipInfo;
    // }

    if (remortIp.indexOf(ipInfo) == 0) {
     log.debug("---OK IP INFO---");
     rightIpInfo = ipInfo;
     log.debug("IP INFO : " + rightIpInfo);
    } else {
     log.debug("====ERROR IP INFO=====");
    }

   }

   if (null == rightIpInfo || "".trim().equals(rightIpInfo.trim())) {
    log.debug("用户请求规定IP之外的页面资源,却没有登录,即将跳转到login.jsp");
    req.getRequestDispatcher("login.jsp").forward(req, resp);
   } else {
    log.debug("用户请求规定IP之内的页面资源,不受限制,让其放行。。。");
    chain.doFilter(req, resp);
   }

  } else {
   log.debug("用户已经登录,让其放行.....");
   request.setAttribute("userName", usr_map.get("name"));
   chain.doFilter(request, response);// 执行其他过滤器
  }

 }

//用来获得客户端的IP地址的方法

 private String getRemortIP(HttpServletRequest request) {
  if (request.getHeader("x-forwarded-for") == null) {
   return request.getRemoteAddr();
  }
  return request.getHeader("x-forwarded-for");
 }

 @Override
 public void init(FilterConfig arg0) throws ServletException {
  // TODO Auto-generated method stub

 }

}

  

=============================我是分割线==============================


 

登录页面login.jsp

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
 String path = request.getContextPath();
 String basePath = request.getScheme() + "://"
   + request.getServerName() + ":" + request.getServerPort()
   + path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <base href="<%=basePath%>">

  <title>网站前台登陆</title>

  <meta http-equiv="pragma" content="no-cache">
  <meta http-equiv="cache-control" content="no-cache">
  <meta http-equiv="expires" content="0">
  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  <meta http-equiv="description" content="This is my page">
  <link rel="stylesheet" type="text/css"
   href="<%=basePath%>styles/form.css"></link>

 </head>

 <body>
  <center>
   <h1>
    您的IP不在规定访问权限IP(段)列表中,请通过登录程序访问资源
   </h1>
  </center>
  <form action="user!loginUser.do" method="post">
   <table align="center" border="1" cellpadding="0" cellspacing="0">
    <tr>
     <td>
      用户名
     </td>
     <td>
      <input type="text" name="user.userid" />
     </td>
    </tr>
    <tr>
     <td>
      密码
     </td>
     <td>
      <input type="password" name="user.password" />
     </td>
    </tr>
    <tr>
     <td align="right">
      <input type="submit" value="登录">
     </td>
     <td align="left">
      <input type="reset" value="取消">
     </td>
    </tr>
   </table>
  </form>
 </body>
</html>

 

 

=============================我是分割线==============================

struts2的action代码

 

/**
 * @author Jane(吴贞贞)
 * @email myhongkongzhen@gmail.com
 * @since JDK 1.6
 * @alter 2009年5月7号
 * @version 1.0 2009年5月7号
 */

public String loginUser() {
  log.debug("\n-----------------登錄驗證操作--------------------\n");
  Map params = request.getParameterMap();

  String userName = request.getParameter("user.userid");
  String password = request.getParameter("user.password");

  if (StringUtils.isEmpty(userName)) {
   // request.setAttribute("msg", "用户名不能为空");
   log.debug("用户名不能为空");
   return "loginUser";
  }
  if (StringUtils.isEmpty(password)) {
   // request.setAttribute("msg", "密码不能为空");
   log.debug("密码不能为空");
   return "loginUser";
  }

  UserService service = new UserService();
  String sql = "select * from manager where userid=? and password=?";
  List<?> result = service.query(sql, userName, password);
  if (result.size() > 0) {
   HttpSession session = request.getSession();
   Map<String, Object> user_map = (Map<String, Object>) result.get(0);
   session.setAttribute("USR_MAP", user_map);
   return "indexUser";
  } else {
   // request.setAttribute("msg", "用户不存在");
   log.debug("用户不存在");
   return "loginUser";
  }
 }

 

  

=============================我是分割线==============================

struts2的配置文件struts.xml

 

<action name="user" class="g.cms.web.action.UserAction">
   <result name="target">/admin/user/user_info.jsp</result>
   <result name="manager" type="freemarker">
    /admin/user/user_manager.ftl
   </result>
   <result name="index" type="redirect">
    /admin/index.jsp
   </result><!-- 重定向到主页为的就是是浏览器地址栏发生变化 -->
   <result name="login" type="redirect">
    /admin/login.jsp
   </result>
   <result name="loginUser" type="redirect">login.jsp</result>
   <result name="indexUser" type="redirect">index.jsp</result>
   <result name="groupManager">
    /admin/user/user_group_manager.ftl
   </result>
   <result name="editGroup">
    /admin/user/edit_user_group.jsp
   </result>
  </action>

  

=============================我是分割线==============================

 

以上是实现IP限制的核心代码,如果有不明白的地方,请联系我qq511134962,msn:myhongkongzhen@gmail.com

  • 大小: 14.2 KB
2
0
分享到:
评论
2 楼 binlaniua 2009-05-08  
x-forwarded-for
------------------
楼主不知道能不能赐教下
这个请求头是什么意思呢
1 楼 crazycode 2009-05-07  
今天有空,对这段代码提点建议:
1、读取IP列表比较低效,你完全可以在static中读取IP到一个集合中,而不是每个请求过来都new一个List
2、使用LinkedList不是很好的选择,使用HashSet会更好一些,List确认是否包含一个记录,用的是遍历,而HashSet是直接在哈序排序后的集合中找到记录的,速度不是一个数量级的,而且Set天然有排除重复记录的功能。
3、properties文件定义的格式也比较怪,序号没有什么意义,如果中间序号断了,会出现问题吧   你可以直接用一个文本文件,一行行读进来就是了。

另外,如果想共享代码,最好排一下版,大家看着舒服一点。

相关推荐

    nginx做ip限制.txt

    其中,通过配置文件对特定IP地址或IP段进行访问限制是一项常用且有效的手段。 #### 配置示例解析 ##### 示例一:基础IP限制配置 ```nginx server { # 允许指定IP访问 allow 10.57.22.172; # 拒绝所有其他IP访问...

    php中限制ip段访问、禁止ip提交表单的代码分享

    在项目应用中,限制IP访问是一种常见的安全措施,它能够帮助网站管理员控制谁能够访问网站的某些部分或者整个网站。同样,禁止特定IP地址提交表单也是出于安全考虑,防止恶意用户通过表单攻击网站。下面是使用PHP...

    java实现根据ip地址获取地理位置的代码分享

    这段代码定义了一个`getAddressByIP()`方法,它通过HTTP请求访问腾讯的IP分享计划接口来获取地理位置信息: ```java public String getAddressByIP() { try { String strIP = "0.0.0.0"; // 需要查询的IP地址 ...

    Nginx 禁止IP访问 只允许域名访问

    总结来说,Nginx作为高性能的HTTP和反向代理服务器,通过精心配置server块的listen指令和server_name指令以及使用rewrite规则,可以实现对IP访问的限制,并指定特定域名的访问规则,包括禁止访问、返回错误信息或...

    IP检查的工具类

    此外,压缩包中的"iplimit"可能是指这个工具类的具体实现文件,开发者可以通过引入和调用这个文件中的方法来实现IP检查功能。需要注意的是,使用这类工具时,要遵循相关法律法规,尊重用户隐私,并确保数据处理的...

    ip地址查询城市php代码

    例如,使用RESTful API接口的IP定位服务可以实现快速响应,但可能会受到网络条件和第三方服务的限制。而使用本地数据库虽然可以避免这些问题,但需要定期更新数据以及处理本地存储的大量数据。 需要注意的是,IP...

    php获得用户ip地址的比较不错的方法

    此外,如果网站需要限制特定IP范围的访问,可以结合`getIP()`函数的返回结果,配合IP地址库进行IP段匹配,从而实现有效的访问控制。例如,可以使用`ip2long()`函数将IP地址转换为整数,再与指定的IP段进行比较。 总...

    IP提取器

    2. 字符串处理:通过遍历文本,逐字符比较,判断是否满足IP地址的构成条件,如每个段的数值范围在0-255之间,且相邻段间有"."分隔。 3. IP库:某些高级的IP提取器可能还会结合IP数据库,如MaxMind的GeoIP,不仅能...

    java根据ip地址获取详细地域信息的方法

    Java作为广泛使用的编程语言,提供了多种方法实现通过IP地址查询地理位置信息。 首先,我们可以通过访问一些提供IP地址定位服务的公共服务API接口来实现这一功能。例如,淘宝、新浪和腾讯都提供了这样的API。这些...

    IP-guard初级认证服务工程师笔试题_2014范文.docx

    15. 限制计算机流量:IP-guard可以通过设定时间范围、网络地址、端口范围等条件来限制计算机的流量速度(选项A、B、C)。 16. 其他知识点:IP-guard可以禁止员工从文件服务器拷贝文件到本地(选项17),可以统计...

    Apache:Apache的安装与配置:7. Apache访问控制与身份验证设置.pdf

    访问控制允许管理员限制哪些用户可以访问服务器上的资源,以及他们可以进行的操作,从而有效防止未授权的访问,保护敏感信息,确保网站的稳定运行和数据的安全。 在Apache中,实现访问控制主要依赖于一些关键指令,...

    网络播客视频文件ip过滤下载利器

    AYOU-FLV抓取器能够识别并捕获正在播放的FLV视频流,即使视频源采用了IP过滤或其它限制手段,也能通过特定的技术手段绕过这些障碍,实现视频的下载。 首先,AYOU-FLV抓取器通过监控网络流量,实时检测到视频数据的...

    IIS6.0 IIS,互联网信息服务

    当按上步的方法建立好所有的Web站点后,对于做虚拟主机,可以通过给各Web站点设不同的端口号来实现,比如给一个Web站点设为80,一个设为81,一个设为82……,则对于端口号是80的Web站点,访问格式仍然直接是IP地址就...

    略谈WAP娱乐网站实现与优化

    - **设备特性**:使用WAP的无线设备通常体积较小、内存有限且DPI性能较低,因此在设计时需要考虑这些限制条件。 - **处理技巧**: - **WML声明**:WML文件的开头必须符合XML格式,例如`...

    访问控制列表-初识ACL

    - **策略实施**:根据公司政策限制内部员工访问外部网站或服务。 - **登录控制**:控制远程登录访问,比如通过Telnet或SSH。 - **文件传输控制**:管理FTP文件上传或下载权限。 #### ACL的分类 - **基本ACL**:主要...

    手机连接电脑上网详解.doc

    手机连接电脑上网是一种利用手机作为数据传输媒介,让电脑通过手机的网络连接功能实现上网的方法。这种方法尤其适用于没有无线路由器或者在没有固定网络覆盖的环境下,利用手机的移动网络服务来满足上网需求。手机...

    易语言源码易语言修改连接限制源码.rar

    4. **代码逆向工程**:如果源代码未提供直接的接口来修改连接限制,可能需要通过逆向工程来分析原始代码的工作原理,找出限制条件,并进行修改。 5. **错误处理和异常处理**:在尝试解除或修改限制时,可能会遇到...

    ASP对网页进行保护的简单代码 ip

    为了提高网站的安全性,开发者常常需要对访问者进行一定的控制,比如限制特定IP地址的访问。本文将详细介绍如何使用ASP编写简单的IP地址过滤代码来保护网页。 #### 二、基本原理与实现方法 ##### 2.1 使用Request...

    投诉-VIP投诉-分析类成果-使用移动4G网络不能访问网站问题分析.doc

    首先,TCP/IP协议栈作为互联网通信的基础,其在不同网络条件下的表现是分析网络问题的关键。特别是在TCP连接的建立过程中,TCP三次握手是确保通信双方建立起连接的必要步骤。从数据来看,TCP连接的成功率保持在90%...

Global site tag (gtag.js) - Google Analytics