`
myhongkongzhen
  • 浏览: 93747 次
  • 性别: 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文件定义的格式也比较怪,序号没有什么意义,如果中间序号断了,会出现问题吧   你可以直接用一个文本文件,一行行读进来就是了。

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

相关推荐

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

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

    精美网站风格模板V65

    ·可设置网站与分类限指定IP段可访问 ·站内关键字,可将新闻内的关键字替换为链接 ·多级分类,可以自由设置分类排序顺序 ·支持模板,可对不同分类用不同模板显示 ·支持语言包,可以方便的修改为其它语言 ·...

    超级有影响力霸气的Java面试题大全文档

    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...

    java 面试题 总结

    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...

    思科信任代理加速伴侣

    3、1 安装时收集你的当前的网段作为你的正确网段并存入"c:\script\yournet.txt"中,如果这不是您的正常网段,您可以编辑此文件每行一个网段,未限制网段数 3、2 每次开机时检测到网络通畅时收集网段。 4、限制...

    网络管理中网络安全策略的概述.doc

    所有产品的用户登陆管理权限、安全日 志扫描,SiteView DM的外设管理,SiteView EIM的屏蔽网站或者限制下载等,这些功能在被实现的同时也起到了安全管理的某些功能 ,譬如病毒的防御。 用户管理和访问控制 SiteView...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例271 清理SESSION缓存提高网站访问的效率 358 第6章 图形图像处理 361 6.1 图像与统计 362 实例272 图形计数器 362 实例273 GD2图形计数器 363 实例274 通过图像显示投票统计结果 365 实例275 通过图像显示密码...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例271 清理SESSION缓存提高网站访问的效率 358 第6章 图形图像处理 361 6.1 图像与统计 362 实例272 图形计数器 362 实例273 GD2图形计数器 363 实例274 通过图像显示投票统计结果 365 实例275 通过图像显示密码...

    计算机网络安全防范措施.doc

    通过网络的IP端口地质转化和地址注册进行网络的防护是这一技术的主要特点, 如果同时访问内部网络与外部网络的话,对网络源地址以及端口进行自动的处理,主要 是通过改变网络源端口和地址与外界网络的连接实现对...

    亮剑.NET深入体验与实战精要2

    7.9.3 访问IP限制 315 7.10 Web Service开发中需要注意的问题 316 本章常见技术面试题 320 常见面试技巧之经典问题巧回答 320 本章小结 321 第8章 用户体验的杀手锏—— Ajax 323 8.1 Ajax概述 324 8.1.1 什么是Ajax...

    亮剑.NET深入体验与实战精要3

    7.9.3 访问IP限制 315 7.10 Web Service开发中需要注意的问题 316 本章常见技术面试题 320 常见面试技巧之经典问题巧回答 320 本章小结 321 第8章 用户体验的杀手锏—— Ajax 323 8.1 Ajax概述 324 8.1.1 什么是Ajax...

    Java开发技术大全 电子版

    3.4方法的定义和实现116 3.4.1方法的声明117 3.4.2创建方法体与return语句117 3.4.3局部变量和成员变量的区别119 3.4.4方法的访问权限121 3.5方法的调用121 3.5.1方法调用的形式121 3.5.2方法调用的参数123 ...

    windows域服务器部署方案.doc

    允许经信息中心核准的某些IP组能够在本机上直接访问Internet,或某些IP组只能连接 局域网的应用服务器,对于不遵守OU命名规则的机器IP和没有经过信息系统管理员授权 的机器IP,不允许访问Internet和Intranet,只能...

Global site tag (gtag.js) - Google Analytics