IBMSOFT

          ibmsoft 努力不一定成功,放棄一定失敗! 堅(jiān)持自己的理想,實(shí)現(xiàn)自己的目標(biāo)! 有好的想法就要出想辦法實(shí)現(xiàn)!

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            8 Posts :: 2 Stories :: 3 Comments :: 0 Trackbacks

          2007年3月5日 #

          http://www.aygfsteel.com/youxia/archive/2007/03/01/101320.html
          posted @ 2007-03-05 23:40 ibmsoft 閱讀(103) | 評(píng)論 (0)編輯 收藏

          http://forum.springside.org.cn/viewthread.php?tid=927&highlight=%E6%9D%83%E9%99%90
          簡(jiǎn)單實(shí)用一分鐘上手級(jí)權(quán)限控制

          找回來(lái)自己以前的一個(gè)項(xiàng)目, 用的是通過(guò)filter過(guò)濾來(lái)管理權(quán)限的方法, 很簡(jiǎn)單,但也很實(shí)用。 這個(gè)項(xiàng)目并不小,但這么一個(gè)類(lèi)就已經(jīng)可以滿(mǎn)足其權(quán)限管理的需要了,所以其實(shí)很多時(shí)候,權(quán)限管理大家并不必要想得那么復(fù)雜, 對(duì)于不少系統(tǒng),簡(jiǎn)單通過(guò)filter來(lái)管理就ok了, simple 也是一種美^_^ 在web.xml里加入

          1. <!--================權(quán)限?設(shè)置================-->??
          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. ????<!--?只過(guò)濾?.jsp?結(jié)尾的url,?其余的如?.do,?.html,?.jpg,?.css?等不作過(guò)濾-->??
          13. ????<url-pattern>*.jsp</url-pattern>??
          14. </filter-mapping>??

          ?

          UrlFilter filter類(lèi)的實(shí)現(xiàn)

          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對(duì)象??
          30. ????????HttpSession?session?=?request.getSession();??
          31. ????????LoginUser?loginuser?=?(LoginUser)?session.getAttribute("loginuser");??
          32. ??
          33. ????????if?(baseUrl(url,?request))?{??
          34. ????????????//?如果是登陸界面等無(wú)須<u><b><font?color="#FF0000">權(quán)限</font></b></u>訪(fǎng)問(wèn)的的公用界面則跳過(guò)??
          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?對(duì)象,要不就是session?過(guò)期了,要不就是還沒(méi)登陸。所以返回登陸界面??
          45. ????????//?在登陸后記得把?loginuser?對(duì)象置于?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,您沒(méi)有<u><b><font?color="#FF0000">權(quán)限</font></b></u>訪(fǎng)問(wèn)該資源!</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. ?????*?判斷該用戶(hù)是否有權(quán)請(qǐng)求該url?
          91. ?????*??
          92. ?????*?@param?royurl?
          93. ?????*????????????user擁有的授權(quán)的的url串集合?
          94. ?????*?@param?url?
          95. ?????*????????????當(dāng)前請(qǐng)求的url?
          96. ?????*?@param?reqmap?
          97. ?????*????????????當(dāng)前request的參數(shù)?
          98. ?????*?@return?是否通過(guò)該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與參數(shù)??
          114. ????????????String[]?spw?=?res_string.split("\\?");?//?用"\\?"?轉(zhuǎn)義后即可得到正確的結(jié)??
          115. ????????????if?(!url.equalsIgnoreCase(spw[0]))?{??
          116. ????????????????match?=?false;??
          117. ????????????}??
          118. ????????????if?(match?&&?spw.length?>?1)?{??
          119. ????????????????String[]?spa?=?spw[1].split("\\&");?//?分拆各參數(shù)??
          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. ????????????????????//?輪詢(xún)??
          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. ????????//?當(dāng)前請(qǐng)求productline參數(shù)是11,12??
          159. ????????reqmap.put("productline",?new?String[]?{?"11",?"12"?});??
          160. ??
          161. ????????String?str;??
          162. ????????Set?royurl?=?new?HashSet();??
          163. ??
          164. ????????//?和授權(quán)的的url根本不同,false??
          165. ????????royurl.add("/user.do?a=1&b=2");??
          166. ????????System.out.println("match?false:"?+?filter.pass(royurl,?url,?reqmap));??
          167. ????????//?授權(quán)的請(qǐng)求參數(shù)13,14時(shí)?false??
          168. ????????royurl.add("/baseProd/product.do?productline=13&productline=14");??
          169. ????????System.out.println("match?false:"?+?filter.pass(royurl,?url,?reqmap));??
          170. ????????//?授權(quán)的請(qǐng)求參數(shù)11,13時(shí)?false??
          171. ????????royurl.add("/baseProd/product.do?productline=11&productline=13");??
          172. ????????System.out.println("match?false:"?+?filter.pass(royurl,?url,?reqmap));??
          173. ??
          174. ????????//?授權(quán)的請(qǐng)求參數(shù)11時(shí)?true??
          175. ????????royurl.add("/baseProd/product.do?productline=11");??
          176. ????????System.out.println("match?true:"?+?filter.pass(royurl,?url,?reqmap));??
          177. ??
          178. ????????//?參數(shù)的不論順序?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. ????????//?支持?"*"?號(hào)作通配符?true??
          184. ????????royurl.add("/baseProd/product.do*");??
          185. ????????System.out.println("match?ture:"?+?filter.pass(royurl,?url,?reqmap));??
          186. ??
          187. ????}??
          188. ??
          189. }??
          LoginUser 類(lèi):
          1. public?class?LoginUser?{??
          2. ????private?String?name;??
          3. ??????
          4. ????//用戶(hù)的授權(quán)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. ??????
          24. }?

          posted @ 2007-03-05 23:38 ibmsoft 閱讀(269) | 評(píng)論 (0)編輯 收藏

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

          RBAC初學(xué)筆記

          什么是RBAC

          RBAC就是Role-Based Access Control,基于角色的訪(fǎng)問(wèn)控制。角色訪(fǎng)問(wèn)控制(RBAC)引入了Role的概念,目的是為了隔離User(即動(dòng)作主體,Subject)Privilege(權(quán)限,表示對(duì)Resource的一個(gè)操作,即Operation+Resource)更符合企業(yè)的用戶(hù)、組織、數(shù)據(jù)和應(yīng)用特征。

          RBAC的關(guān)注點(diǎn)在于RoleuserRoleprivilege的關(guān)系,也就是User AssignmentPermission Assignment的關(guān)系。

          RBAC有以下優(yōu)點(diǎn):

          1減少授權(quán)管理的復(fù)雜性,降低管理開(kāi)銷(xiāo)
            2靈活的支持企業(yè)的安全策略,對(duì)企業(yè)的變化有很大的伸縮性

          ?

          解決復(fù)雜的權(quán)限管理問(wèn)題的過(guò)程可以抽象概括為:判斷【Who是否可以對(duì)What進(jìn)行How的訪(fǎng)問(wèn)操作(Operator】這個(gè)邏輯表達(dá)式的值是否為True的求解過(guò)程。

          RBAC中的幾個(gè)重要概念:

          l???????? Who權(quán)限的擁有者或主體。典型的有PrincipalUserGroupRoleActor等等。跟授權(quán)有關(guān)系的實(shí)體就只有角色(Role)和用戶(hù)(User)。譬如:業(yè)務(wù)經(jīng)理(Role),張三(User

          Role作為一個(gè)用戶(hù)(User)與權(quán)限(Privilege)的代理層,解耦了權(quán)限和用戶(hù)的關(guān)系,所有的授權(quán)應(yīng)該給予Role而不是直接給UserGroup。基于角色的訪(fǎng)問(wèn)控制方法的思想就是把對(duì)用戶(hù)的授權(quán)分成兩部份,用角色來(lái)充當(dāng)用戶(hù)行駛權(quán)限的中介。角色是一組訪(fǎng)問(wèn)權(quán)限的集合,一個(gè)用戶(hù)可以是很多角色的成員,一個(gè)角色也可以有很多個(gè)權(quán)限,而一個(gè)權(quán)限也可以重復(fù)配置于多個(gè)角色。

          User用戶(hù)就是一個(gè)可以獨(dú)立訪(fǎng)問(wèn)計(jì)算機(jī)系統(tǒng)中的數(shù)據(jù)或者用數(shù)據(jù)表示的其它資源的主體,我們用USERS表示一個(gè)用戶(hù)集合。用戶(hù)在一般情況下是指人。

          Group:是一組相關(guān)user的集合。Usergroup繼承出來(lái),也就具有了該group的角色權(quán)限。

          個(gè)人覺(jué)得可以這么認(rèn)為,role是抽象化了的usergroup

          l???????? What權(quán)限針對(duì)的資源(Resource)(包括資源類(lèi)別(the type of Resource)和資源實(shí)例(the instance of Resource))。譬如:報(bào)表。

          粗粒度:表示類(lèi)別級(jí),即僅考慮對(duì)象的類(lèi)別(the type of object),不考慮對(duì)象的某個(gè)特定實(shí)例。比如,用戶(hù)管理中,創(chuàng)建、刪除,對(duì)所有的用戶(hù)都一視同仁,并不區(qū)分操作的具體對(duì)象實(shí)例。

          細(xì)粒度:表示實(shí)例級(jí),即需要考慮具體對(duì)象的實(shí)例(the instance of object),當(dāng)然,細(xì)粒度是在考慮粗粒度的對(duì)象類(lèi)別之后才再考慮特定實(shí)例。比如,合同管理中,列表、刪除,需要區(qū)分該合同實(shí)例是否為當(dāng)前用戶(hù)所創(chuàng)建。

          l???????? How亦作action,表示某種訪(fǎng)問(wèn)方法(亦請(qǐng)參考Operator條目解釋?zhuān)F┤纾簞h除。

          l? Operator操作。表示施加于WhatHow動(dòng)作。是一種Resource Related的概念,單獨(dú)的How動(dòng)作是沒(méi)有實(shí)際意義的,譬如:刪除;只有與具體資源結(jié)合在一起才有意義,譬如:刪除報(bào)表。

          下面的圖展示了user,group,role,how的關(guān)系

          ?

          權(quán)限系統(tǒng)的核心由以下三部分構(gòu)成:

          1.????? 創(chuàng)造權(quán)限

          2.?????? 分配權(quán)限

          3.?????? 使用權(quán)限

          ?

          系統(tǒng)各部分的主要參與者對(duì)照如下:

          1.創(chuàng)造權(quán)限 - Programer創(chuàng)造,

          2.分配權(quán)限 - Administrator 分配,

          3.使用權(quán)限– User

          ?

          ?
          1. Programer 向權(quán)限系統(tǒng)提供 Operator = Privilege + Resource
          2. Administrator 利用 Operator 這個(gè)基本元素,來(lái)創(chuàng)造他理想中的權(quán)限模型。
            如,創(chuàng)建角色,創(chuàng)建用戶(hù)組,給用戶(hù)組分配用戶(hù),將用戶(hù)組與角色關(guān)聯(lián)等等...
            這些操作都是由 Administrator 來(lái)完成的.
          3. User 使用 Administrator 分配給的權(quán)限去使用各個(gè)系統(tǒng)。
          程序員只要回答一個(gè)問(wèn)題,就是, 什么權(quán)限可以訪(fǎng)問(wèn)什么資源,也就是前面說(shuō)的 Operator。程序員提供 Operator 就意味著給系統(tǒng)穿上了盔甲。Administrator 就可以按照他的意愿來(lái)建立他所希望的權(quán)限框架。Operator是這個(gè)系統(tǒng)中最關(guān)鍵的部分,它是一個(gè)紐帶,一個(gè)系在ProgrammerAdministratorUser之間的紐帶。
          posted @ 2007-03-05 23:10 ibmsoft 閱讀(240) | 評(píng)論 (0)編輯 收藏

          2007年3月3日 #

          http://www.pagebreeze.com/
          posted @ 2007-03-03 16:27 ibmsoft 閱讀(856) | 評(píng)論 (2)編輯 收藏

          2006年8月11日 #

          好久沒(méi)有學(xué)習(xí)搞web開(kāi)發(fā)了,最近要弄一個(gè)東西,又把a(bǔ)ppfuse找出來(lái)進(jìn)行研究

          用最新的appfuse1.9.3版本!

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

          用idea打開(kāi)
          只需要修改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修改成實(shí)際的ip就ok了
          比如說(shuō)是:192.169.0.1:3306,注意一定要加上端口號(hào)!

          然后在ant中運(yùn)行相關(guān)的任務(wù):
          我這里的情況是:
          建數(shù)據(jù)庫(kù)表和數(shù)據(jù)的不走是
          運(yùn)行 db-prepare--》db-create--》db-load,這樣數(shù)據(jù)就建上了

          然后deploy,在ie中運(yùn)行appfuse就ok了!
          posted @ 2006-08-11 16:44 ibmsoft 閱讀(408) | 評(píng)論 (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("濮陽(yáng)")>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 閱讀(340) | 評(píng)論 (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 閱讀(344) | 評(píng)論 (0)編輯 收藏

          2006年6月14日 #

          ?

          我這里講的不是怎么使用搜索引擎,而是怎么讓程序利用搜索引擎來(lái)搜集網(wǎng)址,這有什么用?很有用!網(wǎng)上動(dòng)輒有人叫賣(mài)網(wǎng)址數(shù)據(jù)庫(kù),如發(fā)布軟件網(wǎng)址、郵件地址、論壇網(wǎng)址、行業(yè)網(wǎng)址,這些網(wǎng)址是怎么來(lái)的呢?不可能是人手工收集而來(lái)的,都是讓程序利用搜索引擎取到的,如果您需要某類(lèi)網(wǎng)址信息數(shù)據(jù),就跟我來(lái)一起研究一下,非常簡(jiǎn)單。

            本文采用Java語(yǔ)言寫(xiě)成,以google和百度搜索引擎為對(duì)象。

            我們要利用google、百度搜索引擎的搜索規(guī)則中的兩條,關(guān)鍵字搜索和inurl搜索。什么是inurl搜索,就是你所要搜索的網(wǎng)址中本身帶有的關(guān)鍵字,比如http://www.xxx.com/post.asp ,這個(gè)網(wǎng)址就含有post.asp這樣的關(guān)鍵字,在搜索引擎中填寫(xiě)規(guī)則是 inurl:post.asp,這是收集網(wǎng)址的關(guān)鍵,因?yàn)楹芏嗑W(wǎng)址本身會(huì)帶有特定的信息,比如軟件發(fā)布的網(wǎng)頁(yè)網(wǎng)址信息中多含有 publish、submit、tuijian這樣的信息,如http://www.xxx.com/publish.asp,這樣的網(wǎng)址多是發(fā)布信息的網(wǎng)頁(yè),在結(jié)合網(wǎng)頁(yè)中本身可能含有的關(guān)鍵字,就可以用搜索引擎搜索出結(jié)果,然后我們利用程序?qū)⒔Y(jié)果取回,對(duì)HTML頁(yè)面進(jìn)行分析,去除沒(méi)有用的信息,將有用的網(wǎng)址信息寫(xiě)入文件或者數(shù)據(jù)庫(kù),就可以給其它應(yīng)用程序或者人來(lái)使用了。

            第一步,用程序?qū)⑺阉鹘Y(jié)果取回,先以百度為例,比如我們要搜索軟件發(fā)布的網(wǎng)頁(yè),關(guān)鍵字采用 “軟件發(fā)布 版本 inurl:publish.asp",先登錄百度看看,將關(guān)鍵字寫(xiě)入,然后提交,在地址欄就會(huì)看到 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 ,中文關(guān)鍵字全都變成編碼了,沒(méi)有關(guān)系,我們?cè)诔绦蛑兄苯佑弥形囊彩强梢缘模渲卸鄠€(gè)關(guān)鍵字用+號(hào)相連,去掉一些沒(méi)有用的信息,我們可以把地址優(yōu)化成 http://www.baidu.com/s?lm=0&si=&rn=20&ie=gb2312&ct=0& wd=軟件發(fā)布+版本+inurl%3Apublish%2Easp&pn=0&cl=0,其中rn表示一頁(yè)顯示多少個(gè)結(jié)果,wd=表示你要搜索的關(guān)鍵字,pn表示從第幾條開(kāi)始顯示,這個(gè)pn將是我們程序循環(huán)取結(jié)果的變量,每20條循環(huán)一次。我們用Java寫(xiě)的程序來(lái)模擬這個(gè)搜索的過(guò)程,用到的關(guān)鍵類(lèi)為 java.net.HttpURLConnection,java.net.URL,先寫(xiě)一個(gè)提交搜索的class,關(guān)鍵代碼如下:

          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=軟件發(fā)布+版本+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) {}
            ....
            //本次搜索的結(jié)果已經(jīng)放到totalstring中了,是一些HTML代碼,需要下一步進(jìn)行分析了。
          }
            再以google為例,稍微有些不同,google對(duì)瀏覽器進(jìn)行了一些檢測(cè),編碼也不同,URL為http: //www.google.com/search?q=軟件發(fā)布+版本+inurl:publish.asp&hl=zh-CN&lr= &newwindow=1&start=0&sa=N&ie=UTF-8,其中編碼要用ie=UTF-8,start表示從第幾條記錄顯示,需要注意的是google對(duì)瀏覽器還要檢查,如果瀏覽器不符合它的要求,將返回錯(cuò)誤代碼,所以在模擬瀏覽器提交中,我們要多加一行代碼,修改關(guān)鍵部分要將http屬性中的User-Agent設(shè)置為常用的瀏覽器,比如Mozilla/4.0,代碼如下:

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

            第二步,對(duì)取回的HTML編碼進(jìn)行分析,取出其中的有用網(wǎng)址信息,并寫(xiě)入文件或者數(shù)據(jù)庫(kù),由于這些搜索引擎都有網(wǎng)頁(yè)快照和相似網(wǎng)頁(yè)等網(wǎng)址信息混雜在HTML中,我們要將這些網(wǎng)址信息剔除掉,剔除的關(guān)鍵就是找出其中的規(guī)律,百度搜索引擎中的網(wǎng)頁(yè)快照和其它沒(méi)有用的的地址都含有baidu這個(gè)關(guān)鍵字,而google中含有的無(wú)用網(wǎng)址信息含有關(guān)鍵字 google和cache,我們就根據(jù)這些關(guān)鍵字剔除無(wú)用網(wǎng)址信息。在Java中要對(duì)字符串進(jìn)行分析必然要用到 java.util.StringTokenize這個(gè)類(lèi),用來(lái)將字符串以特定的分隔符分開(kāi),java.util.regex.Pattern和 java.util.regex.Matcher用來(lái)匹配字符串,關(guān)鍵代碼如下:

          class CompareStr
          {
           public boolean comparestring(String oristring,String tostring)
           {
            Pattern p=null; //正則表達(dá)式
            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,記錄到文件中
             }
            }
           }
          }
            通過(guò)以上程序,我們就可以收集到自己要的網(wǎng)址信息了,還可以再寫(xiě)另外一個(gè)應(yīng)用程序,對(duì)收集到的網(wǎng)址信息進(jìn)一步分析,取出自己需要的信息,這里就不再累贅,道理都是一樣的。最后需說(shuō)明一點(diǎn),google搜索引擎搜索所能返回的結(jié)果不能超過(guò)1000條,過(guò)了1000條,就直接提示“對(duì)不起, Google 為所有查詢(xún)的結(jié)果數(shù)都不會(huì)超過(guò) 1000 個(gè)。”,百度搜索引擎返回的結(jié)果不能超過(guò)700多條,所以我們要搜索時(shí)盡可能多加關(guān)鍵字,將結(jié)果范圍縮小。

          posted @ 2006-06-14 19:50 ibmsoft 閱讀(773) | 評(píng)論 (1)編輯 收藏

          僅列出標(biāo)題  
          主站蜘蛛池模板: 沾化县| 依兰县| 汉阴县| 南涧| 庆元县| 沙坪坝区| 武邑县| 洪泽县| 望都县| 梨树县| 彰化市| 大安市| 息烽县| 大方县| 大冶市| 兴安县| 康平县| 本溪| 台南市| 临湘市| 合肥市| 信宜市| 兴隆县| 名山县| 郓城县| 安宁市| 湟源县| 额敏县| 武陟县| 曲阜市| 墨玉县| 扎囊县| 亚东县| 武隆县| 青海省| 富川| 石渠县| 保康县| 铁岭市| 子长县| 平乐县|