IBMSOFT

ibmsoft 努力不一定成功,放弃一定失败! 坚持自己的理想,实现自己的目标! 有好的想法就要出想办法实现!

BlogJava 首页 新随笔 联系 聚合 管理
  8 Posts :: 2 Stories :: 3 Comments :: 0 Trackbacks

2007年3月5日 #

http://www.blogjava.net/youxia/archive/2007/03/01/101320.html
posted @ 2007-03-05 23:40 ibmsoft 阅读(97) | 评论 (0)编辑 收藏

http://forum.springside.org.cn/viewthread.php?tid=927&highlight=%E6%9D%83%E9%99%90
简单实用一分钟上手级权限控制

找回来自己以前的一个项目, 用的是通过filter过滤来管理权限的方法, 很简单,但也很实用。 这个项目并不小,但这么一个类就已经可以满足其权限管理的需要了,所以其实很多时候,权限管理大家并不必要想得那么复杂, 对于不少系统,简单通过filter来管理就ok了, simple 也是一种美^_^ 在web.xml里加入

  1. <!--================权限 设置================-->  
  2. <filter>  
  3.     <filter-name>Authentication</filter-name>  
  4.     <filter-class>com.springside.demo.security.UrlFilter</filter-class>  
  5.     <init-param>  
  6.         <param-name>onError</param-name>  
  7.         <param-value>/login.jsp</param-value>  
  8.     </init-param>  
  9. </filter>  
  10. <filter-mapping>  
  11.     <filter-name>Authentication</filter-name>  
  12.     <!-- 只过滤 .jsp 结尾的url, 其余的如 .do, .html, .jpg, .css 等不作过滤-->  
  13.     <url-pattern>*.jsp</url-pattern>  
  14. </filter-mapping>  

 

UrlFilter filter类的实现

  1. public class UrlFilter implements Filter {  
  2.     private FilterConfig filterConfig;  
  3.   
  4.     private FilterChain chain;  
  5.   
  6.     private HttpServletRequest request;  
  7.   
  8.     private HttpServletResponse response;  
  9.   
  10.     public void destroy() {  
  11.         this.filterConfig = null;  
  12.     }  
  13.   
  14.     public void init(FilterConfig filterConfig) throws ServletException {  
  15.         this.filterConfig = filterConfig;  
  16.     }  
  17.   
  18.     public void doFilter(ServletRequest servletRequest,  
  19.             ServletResponse servletResponse, FilterChain chain)  
  20.             throws IOException, ServletException {  
  21.         this.chain = chain;  
  22.         this.request = (HttpServletRequest) servletRequest;  
  23.         this.response = ((HttpServletResponse) servletResponse);  
  24.   
  25.         String url = request.getServletPath();  
  26.         if (url == null)  
  27.             url = "";  
  28.   
  29.         // 获取session中的loginuser对象  
  30.         HttpSession session = request.getSession();  
  31.         LoginUser loginuser = (LoginUser) session.getAttribute("loginuser");  
  32.   
  33.         if (baseUrl(url, request)) {  
  34.             // 如果是登陆界面等无须<u><b><font color="#FF0000">权限</font></b></u>访问的的公用界面则跳过  
  35.             chain.doFilter(request, response);  
  36.         } else if (loginuser == null) {  
  37.             checkLogin(url);  
  38.         } else {  
  39.             verifyUrl(url, loginuser);  
  40.         }  
  41.     }  
  42.   
  43.     private void checkLogin(String url) throws ServletException, IOException {  
  44.         // 如果session中获取不到 loginuser 对象,要不就是session 过期了,要不就是还没登陆。所以返回登陆界面  
  45.         // 在登陆后记得把 loginuser 对象置于 session中  
  46.   
  47.         if (url.indexOf("/index.jsp") >= 0  
  48.                 && "login".equals(request.getParameter("act"))) {  
  49.             // 获取request中username,password  
  50.             String username = request.getParameter("username");  
  51.             String password = request.getParameter("password");  
  52.             UserDao userDao = new UserDao();  
  53.             if (userDao.authUser(username, password)) {  
  54.                 LoginUser user = userDao.getUser(username);  
  55.                 request.getSession().setAttribute("loginuser", user);  
  56.                 verifyUrl(url,user);  
  57.                 return;  
  58.             }  
  59.         }  
  60.         response.sendRedirect("login.jsp");  
  61.     }  
  62.   
  63.     private void verifyUrl(String url, LoginUser loginuser)  
  64.             throws IOException, ServletException {  
  65.         // 获取 loginuser 拥有的所有资源串  
  66.         Set royurl = loginuser.getResStrings();  
  67.         if (royurl != null && royurl.size() > 0 && pass(royurl, url, request.getParameterMap())) {  
  68.             chain.doFilter(request, response);  
  69.         } else {  
  70.             response.setContentType("text/html;charset=GBK");  
  71.             response  
  72.                     .getWriter()  
  73.                     .println(  
  74.                             "<div style='margin: 100 auto;text-align: center;"  
  75.                                     + "font: bold 18px 宋体;color: #0066CC;vertical-align: middle'> Sorry,您没有<u><b><font color="#FF0000">权限</font></b></u>访问该资源!</div>");  
  76.         }  
  77.     }  
  78.   
  79.     /** 
  80.      * 判断是否是公用界面 
  81.      */  
  82.     protected boolean baseUrl(String url, HttpServletRequest request) {  
  83.         if (url.indexOf("/login.jsp") >= 0) {  
  84.             return true;  
  85.         }  
  86.         return false;  
  87.     }  
  88.   
  89.     /** 
  90.      * 判断该用户是否有权请求该url 
  91.      *  
  92.      * @param royurl 
  93.      *            user拥有的授权的的url串集合 
  94.      * @param url 
  95.      *            当前请求的url 
  96.      * @param reqmap 
  97.      *            当前request的参数 
  98.      * @return 是否通过该url 
  99.      */  
  100.     protected boolean pass(Set royurl, String url, Map reqmap) {  
  101.         boolean match = true;  
  102.         for (Iterator iter = royurl.iterator(); iter.hasNext();) {  
  103.             // 获取资源  
  104.             match = true;  
  105.             String res_string = (String) iter.next();  
  106.             if (res_string.indexOf("*") > 0) {  
  107.                 res_string = res_string.substring(0, res_string.indexOf("*"));  
  108.                 if (url.substring(0, res_string.length()).equalsIgnoreCase(  
  109.                         res_string)) {  
  110.                     return true// 增加通配符比较  
  111.                 }  
  112.             }  
  113.             // 分割url与参数  
  114.             String[] spw = res_string.split("\\?"); // 用"\\?" 转义后即可得到正确的结  
  115.             if (!url.equalsIgnoreCase(spw[0])) {  
  116.                 match = false;  
  117.             }  
  118.             if (match && spw.length > 1) {  
  119.                 String[] spa = spw[1].split("\\&"); // 分拆各参数  
  120.                 for (int j = 0; j < spa.length; j++) {  
  121.                     String[] spe = spa[j].split("="); // 分拆键与值  
  122.                     String key = spe[0];  
  123.                     String value = "";  
  124.                     if (spe.length > 1) {  
  125.                         value = spe[1].trim();  
  126.                     }  
  127.   
  128.                     // 轮询  
  129.                     String[] values = (String[]) reqmap.get(key);  
  130.                     if (values != null) {  
  131.                         for (int k = 0; k < values.length; k++) {  
  132.                             if (value.equalsIgnoreCase(values[k])) {  
  133.                                 match = true;  
  134.                                 break;  
  135.                             }  
  136.                             match = false;  
  137.                         }  
  138.                         if (!match) {  
  139.                             break;  
  140.                         }  
  141.                     }  
  142.                 }  
  143.   
  144.             }  
  145.   
  146.             if (match) {  
  147.                 break;  
  148.             }  
  149.         }  
  150.         return match;  
  151.     }  
  152.   
  153.     public static void main(String[] args) {  
  154.         UrlFilter filter = new UrlFilter();  
  155.         String url = "/baseProd/product.do";  
  156.   
  157.         Map reqmap = new HashMap();  
  158.         // 当前请求productline参数是11,12  
  159.         reqmap.put("productline"new String[] { "11""12" });  
  160.   
  161.         String str;  
  162.         Set royurl = new HashSet();  
  163.   
  164.         // 和授权的的url根本不同,false  
  165.         royurl.add("/user.do?a=1&b=2");  
  166.         System.out.println("match false:" + filter.pass(royurl, url, reqmap));  
  167.         // 授权的请求参数13,14时 false  
  168.         royurl.add("/baseProd/product.do?productline=13&productline=14");  
  169.         System.out.println("match false:" + filter.pass(royurl, url, reqmap));  
  170.         // 授权的请求参数11,13时 false  
  171.         royurl.add("/baseProd/product.do?productline=11&productline=13");  
  172.         System.out.println("match false:" + filter.pass(royurl, url, reqmap));  
  173.   
  174.         // 授权的请求参数11时 true  
  175.         royurl.add("/baseProd/product.do?productline=11");  
  176.         System.out.println("match true:" + filter.pass(royurl, url, reqmap));  
  177.   
  178.         // 参数的不论顺序 true  
  179.         royurl.add("/baseProd/product.do?productline=12&productline=11");  
  180.         System.out.println("match true:" + filter.pass(royurl, url, reqmap));  
  181.   
  182.         royurl.clear();  
  183.         // 支持 "*" 号作通配符 true  
  184.         royurl.add("/baseProd/product.do*");  
  185.         System.out.println("match ture:" + filter.pass(royurl, url, reqmap));  
  186.   
  187.     }  
  188.   
  189. }  
LoginUser 类:
  1. public class LoginUser {  
  2.     private String name;  
  3.       
  4.     //用户的授权url集合,如"/product.do?line=1&singer=2","/menu.do?son=1&son=2&son=3","/job.do*"  
  5.     private Set resStrings;  
  6.   
  7.     public String getName() {  
  8.         return name;  
  9.     }  
  10.   
  11.     public void setName(String name) {  
  12.         this.name = name;  
  13.     }  
  14.   
  15.     public Set getResStrings() {  
  16.         return resStrings;  
  17.     }  
  18.   
  19.     public void setResStrings(Set resStrings) {  
  20.         this.resStrings = resStrings;  
  21.     }  
  22.       
  23.       


posted @ 2007-03-05 23:38 ibmsoft 阅读(259) | 评论 (0)编辑 收藏

http://blog.chinaunix.net/u/11262/showart_213703.html
http://wiki.springside.org.cn/display/springside/Acegi+Reference

RBAC初学笔记

什么是RBAC

RBAC就是Role-Based Access Control,基于角色的访问控制。角色访问控制(RBAC)引入了Role的概念,目的是为了隔离User(即动作主体,Subject)Privilege(权限,表示对Resource的一个操作,即Operation+Resource)更符合企业的用户、组织、数据和应用特征。

RBAC的关注点在于RoleuserRoleprivilege的关系,也就是User AssignmentPermission Assignment的关系。

RBAC有以下优点:

1减少授权管理的复杂性,降低管理开销
  2灵活的支持企业的安全策略,对企业的变化有很大的伸缩性

 

解决复杂的权限管理问题的过程可以抽象概括为:判断【Who是否可以对What进行How的访问操作(Operator】这个逻辑表达式的值是否为True的求解过程。

RBAC中的几个重要概念:

l         Who权限的拥有者或主体。典型的有PrincipalUserGroupRoleActor等等。跟授权有关系的实体就只有角色(Role)和用户(User)。譬如:业务经理(Role),张三(User

Role作为一个用户(User)与权限(Privilege)的代理层,解耦了权限和用户的关系,所有的授权应该给予Role而不是直接给UserGroup。基于角色的访问控制方法的思想就是把对用户的授权分成两部份,用角色来充当用户行驶权限的中介。角色是一组访问权限的集合,一个用户可以是很多角色的成员,一个角色也可以有很多个权限,而一个权限也可以重复配置于多个角色。

User用户就是一个可以独立访问计算机系统中的数据或者用数据表示的其它资源的主体,我们用USERS表示一个用户集合。用户在一般情况下是指人。

Group:是一组相关user的集合。Usergroup继承出来,也就具有了该group的角色权限。

个人觉得可以这么认为,role是抽象化了的usergroup

l         What权限针对的资源(Resource)(包括资源类别(the type of Resource)和资源实例(the instance of Resource))。譬如:报表。

粗粒度:表示类别级,即仅考虑对象的类别(the type of object),不考虑对象的某个特定实例。比如,用户管理中,创建、删除,对所有的用户都一视同仁,并不区分操作的具体对象实例。

细粒度:表示实例级,即需要考虑具体对象的实例(the instance of object),当然,细粒度是在考虑粗粒度的对象类别之后才再考虑特定实例。比如,合同管理中,列表、删除,需要区分该合同实例是否为当前用户所创建。

l         How亦作action,表示某种访问方法(亦请参考Operator条目解释)。譬如:删除。

l  Operator操作。表示施加于WhatHow动作。是一种Resource Related的概念,单独的How动作是没有实际意义的,譬如:删除;只有与具体资源结合在一起才有意义,譬如:删除报表。

下面的图展示了user,group,role,how的关系

 

权限系统的核心由以下三部分构成:

1.      创造权限

2.       分配权限

3.       使用权限

 

系统各部分的主要参与者对照如下:

1.创造权限 - Programer创造,

2.分配权限 - Administrator 分配,

3.使用权限– User

 

 
  1. Programer 向权限系统提供 Operator = Privilege + Resource
  2. Administrator 利用 Operator 这个基本元素,来创造他理想中的权限模型。
    如,创建角色,创建用户组,给用户组分配用户,将用户组与角色关联等等...
    这些操作都是由 Administrator 来完成的.
  3. User 使用 Administrator 分配给的权限去使用各个系统。
程序员只要回答一个问题,就是, 什么权限可以访问什么资源,也就是前面说的 Operator。程序员提供 Operator 就意味着给系统穿上了盔甲。Administrator 就可以按照他的意愿来建立他所希望的权限框架。Operator是这个系统中最关键的部分,它是一个纽带,一个系在ProgrammerAdministratorUser之间的纽带。
posted @ 2007-03-05 23:10 ibmsoft 阅读(230) | 评论 (0)编辑 收藏

2007年3月3日 #

http://www.pagebreeze.com/
posted @ 2007-03-03 16:27 ibmsoft 阅读(832) | 评论 (2)编辑 收藏

2006年8月11日 #

好久没有学习搞web开发了,最近要弄一个东西,又把appfuse找出来进行研究

用最新的appfuse1.9.3版本!

到:http"://appfuse.org/下载appfuse1.93

用idea打开
只需要修改properties.xml中的
    <!-- Defaults for database.properties -->
    
<property name="database.jar" location="${mysql.jar}"/>
    
<property name="database.type" value="mysql"/>
    
<property name="database.name" value="appfuse"/>
    
<property name="database.host" value="localhost"/>
    
<property name="database.username" value="root"/>
    
<property name="database.password" value="root"/>

把其中的localhost修改成实际的ip就ok了
比如说是:192.169.0.1:3306,注意一定要加上端口号!

然后在ant中运行相关的任务:
我这里的情况是:
建数据库表和数据的不走是
运行 db-prepare--》db-create--》db-load,这样数据就建上了

然后deploy,在ie中运行appfuse就ok了!
posted @ 2006-08-11 16:44 ibmsoft 阅读(393) | 评论 (0)编辑 收藏

2006年7月25日 #

 1 /*
 2  * Copyright (c) 2006 Your Corporation. All Rights Reserved.
 3  */
 4 package liuxuan;
 5 
 6 /**
 7  * Created by IntelliJ IDEA.
 8  * User: Administrator
 9  * Date: 2006-7-26
10  * Time: 15:33:49
11  * To change this template use File | Settings | File Templates.
12  */
13 import org.htmlparser.Node;
14 import org.htmlparser.Parser;
15 import org.htmlparser.http.ConnectionManager;
16 import org.htmlparser.tags.LinkTag;
17 import org.htmlparser.util.ParserException;
18 import org.htmlparser.visitors.ObjectFindingVisitor;
19 
20 import java.sql.Statement;
21 import java.sql.DriverManager;
22 import java.sql.Connection;
23 import java.sql.SQLException;
24 
25 public class LinkDemo
26 {
27     public static void main (String[] args) throws ParserException, SQLException
28     {
29         ConnectionManager cn = new ConnectionManager();
30         cn.setProxyHost("10.75.1.38");
31         cn.setProxyPort(80);
32         Parser.setConnectionManager(cn);
33         Parser parser;
34         //parser.s
35         String[] pyurl = new String[2] ;
36 
37         pyurl[0]="http://www.google.cn/search?num=100&hl=zh-CN&newwindow=1&q=%E6%BF%AE%E9%98%B3&btnG=%E6%90%9C%E7%B4%A2&meta=cr%3DcountryCN";
38         pyurl[1]="http://www.google.cn/search?q=%E6%BF%AE%E9%98%B3&num=100&hl=zh-CN&lr=&cr=countryCN&newwindow=1&start=100&sa=N";
39         for (int j=0;j<pyurl.length;j++) {
40             parser = new Parser (pyurl[j]);
41             ObjectFindingVisitor visitor = new ObjectFindingVisitor (LinkTag.class);
42             parser.visitAllNodesWith (visitor);
43             Node[] links = visitor.getTags ();
44             String sql;
45                 try {
46                         Class.forName("com.mysql.jdbc.Driver");
47                     } catch (ClassNotFoundException e) {
48                         e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
49                     }
50                     Connection conn = null;
51                     try {
52                         conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/crawdb""root""root");
53                     } catch (SQLException e) {
54                         e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
55                     }
56              Statement stmt = conn.createStatement();
57             for (int i = 0; i < links.length; i++)
58             {
59                     sql="";
60                 LinkTag linkTag = (LinkTag)links[i];
61                 if (linkTag.getLink().indexOf("cache")<0 &&  linkTag.getLink().indexOf("google")<0 &&linkTag.getLinkText().indexOf("濮阳")>0)  {
62 
63 
64                       sql="insert into urls(name,note,url) values('"+linkTag.getLinkText ()+"','"+"lixuan"+"','"+linkTag.getLink ()+"')";
65                       stmt.executeUpdate(sql);
66                         //rs.close();
67 
68                     System.out.print ("\"" + linkTag.getLinkText () + "\" => ");
69                 System.out.println (linkTag.getLink ());
70                 }
71             }
72              stmt.close();
73              conn.close();
74         }
75     }
76 
77 }
78 

posted @ 2006-07-25 17:26 ibmsoft 阅读(325) | 评论 (0)编辑 收藏

2006年6月28日 #

  • I use nutch to crawl the intranet.but you know ,the cache.jsp have mang problem (X).Because I filter the gif|jgf and so on
    then I use ORO replace the html content use my customer pif
    Code:
     1    String sRegexpSrc="src\\s*=\\s*\"([\\.]*)/([a-z]*)/([^\"]+)";
     2    String sRegxpBackground ="background\\s*=\\s*\"([.]*)/([a-z]*)/([^\"]+)";
     3    String sAdd = "";
     4    String sNewContent="";
     5    PatternCompiler compiler = new Perl5Compiler();
     6    Pattern pattern = null,pattern1 = null ;
     7    try{
     8        pattern = compiler.compile(sRegexpSrc,Perl5Compiler.CASE_INSENSITIVE_MASK);
     9        pattern1 = compiler.compile(sRegxpBackground,Perl5Compiler.CASE_INSENSITIVE_MASK);
    10    }
    catch (MalformedPatternException e){
    11        
    12        e.printStackTrace();
    13    }

    14    PatternMatcher matcher = new Perl5Matcher();
    15
    16if (matcher.contains(content, pattern)){
    17                    MatchResult result = matcher.getMatch();
    18                    //System.out.println(result.toString());
    19                    sAdd = result.group(1)+"/"+result.group(2)+"/"+result.group(3);
    20                    //System.out.println("sAdd= "+sAdd);
    21                    sNewContent=content.replaceAll(sAdd,"\\img\\liuxuan");
    22                    //System.out.println("FinalString="+sTest.replaceAll(sAdd,"/img/liuxuan.png"));
    23            //System.out.print("sTest= "+result.group(1)+"/"+result.group(2));
    24        }
    else{
    25            //System.out.print("Can't find the String ");
    26
    27        }

posted @ 2006-06-28 21:03 ibmsoft 阅读(328) | 评论 (0)编辑 收藏

2006年6月14日 #

 

我这里讲的不是怎么使用搜索引擎,而是怎么让程序利用搜索引擎来搜集网址,这有什么用?很有用!网上动辄有人叫卖网址数据库,如发布软件网址、邮件地址、论坛网址、行业网址,这些网址是怎么来的呢?不可能是人手工收集而来的,都是让程序利用搜索引擎取到的,如果您需要某类网址信息数据,就跟我来一起研究一下,非常简单。

  本文采用Java语言写成,以google和百度搜索引擎为对象。

  我们要利用google、百度搜索引擎的搜索规则中的两条,关键字搜索和inurl搜索。什么是inurl搜索,就是你所要搜索的网址中本身带有的关键字,比如http://www.xxx.com/post.asp ,这个网址就含有post.asp这样的关键字,在搜索引擎中填写规则是 inurl:post.asp,这是收集网址的关键,因为很多网址本身会带有特定的信息,比如软件发布的网页网址信息中多含有 publish、submit、tuijian这样的信息,如http://www.xxx.com/publish.asp,这样的网址多是发布信息的网页,在结合网页中本身可能含有的关键字,就可以用搜索引擎搜索出结果,然后我们利用程序将结果取回,对HTML页面进行分析,去除没有用的信息,将有用的网址信息写入文件或者数据库,就可以给其它应用程序或者人来使用了。

  第一步,用程序将搜索结果取回,先以百度为例,比如我们要搜索软件发布的网页,关键字采用 “软件发布 版本 inurl:publish.asp",先登录百度看看,将关键字写入,然后提交,在地址栏就会看到 http://www.baidu.com/s?ie=gb2312&bs=%C8%ED%BC%FE%B7%A2%B2%BC+%C8%ED%BC%FE%B0%E6%B1%BE+inurl%3Apublish.asp&sr=&z=&cl=3&f=8&wd=%C8%ED%BC%FE%B7%A2%B2%BC+%B0%E6%B1%BE+inurl%3Apublish.asp&ct=0 ,中文关键字全都变成编码了,没有关系,我们在程序中直接用中文也是可以的,其中多个关键字用+号相连,去掉一些没有用的信息,我们可以把地址优化成 http://www.baidu.com/s?lm=0&si=&rn=20&ie=gb2312&ct=0& wd=软件发布+版本+inurl%3Apublish%2Easp&pn=0&cl=0,其中rn表示一页显示多少个结果,wd=表示你要搜索的关键字,pn表示从第几条开始显示,这个pn将是我们程序循环取结果的变量,每20条循环一次。我们用Java写的程序来模拟这个搜索的过程,用到的关键类为 java.net.HttpURLConnection,java.net.URL,先写一个提交搜索的class,关键代码如下:

class Search
{
 public URL url;
 public HttpURLConnection http;
 public java.io.InputStream urlstream;
 ......
 for(int i=0;i++;i <100)
 {
  ......
  try {
   url = new URL("www.baidu.com/s?lm=0&si=&rn=20&ie=gb2312&ct=0& wd=软件发布+版本+inurl%3Apublish%2Easp&pn="+beginrecord+"&cl=0");
  }catch(Exception ef){};
  try {
   http = (HttpURLConnection) url.openConnection();
   http.connect();
   urlstream = http.getInputStream();
  }catch(Exception ef){};
  java.io.BufferedReader l_reader = new java.io.
  BufferedReader(new java.io.InputStreamReader(urlstream));
  try {
   while ((currentLine = l_reader.readLine()) != null) {
    totalstring += currentLine;
   }
  } catch (IOException ex3) {}
  ....
  //本次搜索的结果已经放到totalstring中了,是一些HTML代码,需要下一步进行分析了。
}
  再以google为例,稍微有些不同,google对浏览器进行了一些检测,编码也不同,URL为http: //www.google.com/search?q=软件发布+版本+inurl:publish.asp&hl=zh-CN&lr= &newwindow=1&start=0&sa=N&ie=UTF-8,其中编码要用ie=UTF-8,start表示从第几条记录显示,需要注意的是google对浏览器还要检查,如果浏览器不符合它的要求,将返回错误代码,所以在模拟浏览器提交中,我们要多加一行代码,修改关键部分要将http属性中的User-Agent设置为常用的浏览器,比如Mozilla/4.0,代码如下:

try {
 http = (HttpURLConnection) url.openConnection();
 http.setRequestProperty("User-Agent", "Mozilla/4.0");
 http.connect();
 urlstream = http.getInputStream();
}catch(Exception ef){};

  第二步,对取回的HTML编码进行分析,取出其中的有用网址信息,并写入文件或者数据库,由于这些搜索引擎都有网页快照和相似网页等网址信息混杂在HTML中,我们要将这些网址信息剔除掉,剔除的关键就是找出其中的规律,百度搜索引擎中的网页快照和其它没有用的的地址都含有baidu这个关键字,而google中含有的无用网址信息含有关键字 google和cache,我们就根据这些关键字剔除无用网址信息。在Java中要对字符串进行分析必然要用到 java.util.StringTokenize这个类,用来将字符串以特定的分隔符分开,java.util.regex.Pattern和 java.util.regex.Matcher用来匹配字符串,关键代码如下:

class CompareStr
{
 public boolean comparestring(String oristring,String tostring)
 {
  Pattern p=null; //正则表达式
  Matcher m=null; //操作的字符串
  boolean b;
  p = Pattern.compile(oristring,Pattern.CASE_INSENSITIVE);
  m = p.matcher(tostring);
  b = m.find();
  return b;
 }
}

class AnalyUrl
{
 ......
 StringTokenizer token = new StringTokenizer(totalstring," <> \"");
 String firstword;
 CompareStrcompstr = new CompareStr();
 String dsturl = null;
 while (token.hasMoreTokens())
 {
  firstword = token.nextToken();
  if (!compstr.comparestring("google.com", firstword) && !compstr.comparestring("cache",firstword))
  {
   if (firstword.length() > 7)
   {
    dsturl = firstword.substring(6,firstword.length() - 1);
    WriteUrl(dsturl); //成功取到URL,记录到文件中
   }
  }
 }
}
  通过以上程序,我们就可以收集到自己要的网址信息了,还可以再写另外一个应用程序,对收集到的网址信息进一步分析,取出自己需要的信息,这里就不再累赘,道理都是一样的。最后需说明一点,google搜索引擎搜索所能返回的结果不能超过1000条,过了1000条,就直接提示“对不起, Google 为所有查询的结果数都不会超过 1000 个。”,百度搜索引擎返回的结果不能超过700多条,所以我们要搜索时尽可能多加关键字,将结果范围缩小。

posted @ 2006-06-14 19:50 ibmsoft 阅读(750) | 评论 (1)编辑 收藏

仅列出标题