V1.01:
1、提高創建索引的效率
2、通過對象池管理IndexWriter和IndexReader對象
3、修正若干BUG
V1.0:
初始版本
基于Lucene的全文檢索框架,提供快速方便的索引創建及查詢方式,并提供擴展功能對框架進行擴展。
項目地址:http://code.google.com/p/snoics-retrieval/
環境要求
Java1.5+
Lucene 3.0+
做了一些小的修改和調整
基于Lucene的全文檢索框架,提供快速方便的索引創建及查詢方式,并提供擴展功能對框架進行擴展。
項目地址:http://code.google.com/p/snoics-retrieval/
環境要求
Java1.5+
Lucene 3.0+
摘要: 對四則運算表達式字符串進行解析后計算出結果,可以使用逆波蘭表達式進行處理。 首先說明一下什是逆波蘭表達式: 逆波蘭表達式又叫做后綴表達... 閱讀全文 摘要: 基于自己的興趣,利用業務時間在Lucene基礎上做的一個搜索框架,請大家多多指教。 一、 介紹 基于Lucene的全文檢索框架,提供快速方便的索引創建及查詢方式,并提供擴展功能對框架進行擴展。 &nbs... 閱讀全文 Myeclipse 7 的插件安裝方式與原先的方式完全不一樣了,下面以JBossTools-2.1.2.GA插件安裝為例進行說明。版本歷史 | |
2.1: | 1、不用再配置snoics-configpath.xml中的路徑。 2、定時自動保存Cache 3、修改了一些Bug |
2.0: | 核心代碼全部重寫,增加了擴展性,通過擴展之后,基本上能實現對整個網站完整的解析 |
1.0: | 實現了整站抓取的基本的功能,不能解析特殊的URL,對javascript無法辨認 |
??? 有些人說不知道snoics-reptile中的snoics-systemconfig.xml不知道怎么配置,這里就給出一個CSDN中Java文檔中心的抓取配置的抓取配置。
???? 在抓取完了之后往Apache的httpd.conf中加入
Listen 10001
<VirtualHost *:10001>
??? DocumentRoot D:\\temp\\reptile\\website
</VirtualHost>
???? 這段配置。
???? 最后刪除抓取下來的文件夾中的D:\temp\reptile\website\author\index.html這個文件。不知道為什么文檔中心的這個URL是一個空的頁面http://dev.csdn.net/author? ,把這個URL的相對應的抓取下的文件刪除就可以正常使用了
???? 在抓取的過程中,有些圖片文件可能會出現錯誤,不過不影響使用,因為這些圖片的路徑本身大概就有些問題。
????? 附件-配置文件:http://www.aygfsteel.com/Files/snoics/snoics-systemconfig.rar
|
|||||||||
|
|||||||||
|
|||||||||
4、如何擴展接口?
|
|||||||||
????擴展接口使用的配置文件是:conf/snoics-reptile-urlregex.xml ????首先加入一段如下的配置 ????<bean id="ahrefRegexUrl" class="com.snoics.reptile.regex.url.impl.UrlRegex" singleton="false"> ????????<property name="regexUrl"> ????????????<!-- 提取可能包含URL的字符串 --> ????????????<value><![CDATA[<[^!<>]*\shref\s*=\s*["']?[^<>]*["'\s][^<>]*>]]></value> ????????</property> ????????<property name="replaceRegexUrl"> ????????????<!-- 替換可能包含URL的字符串 --> ????????????<value><![CDATA[<[^!<>]*\shref\s*=\s*["']?reptile-replace-string["'\s][^<>]*>]]></value> ????????</property> ????????<property name="getRegexUrl"> ????????????<!-- 提取最終URL --> ????????????<ref bean="ahrefGetRegexUrl"/> ????????</property> ????</bean> ???? ????其中ahrefGetRegexUrl是實現了com.snoics.reptile.regex.url.IGetUrlRegex接口的類,用來從可能包含了URL的字符串里面提取其中包含的URL ??? 其次加入如下的配置: ???? <bean id="ahrefGetRegexUrl" class="com.snoics.reptile.regex.url.impl.AhrefGetRegexUrl" singleton="false"> ???????? <property name="regexString"> ????????????? <!-- 提取最終URL --> ?????????????? <value><![CDATA[href\s*=\s*["']?[^\s"]+["'\s]\s*]]></value> ???????? </property> ???????? <property name="unIncludeRegexString"> ??????????????? <!-- ???????????????????? 排除不需要的類型 ???????????????????? 多個正則表達式之間使用';'隔開 ???????????????? ?--> ??????????????? ?<value><![CDATA[javascript\s?:\s?;mailto\s?:\s?;^#$;]]></value> ?????????? </property> ????? </bean> ????最后,在如下的配置中,加入剛才配置好的部分 ????<bean id="urlRegexMap" class="com.snoics.reptile.regex.url.impl.UrlRegexMap"> ????????<property name="ulrRegexMap"> ????????????<map> ????????????????<!-- 名稱 --> ????????????????<entry key="ahref"> ????????????????????<!-- 解析URL使用的類 --> ????????????????????<ref bean="ahrefRegexUrl"/> ????????????????</entry> ????????????????<entry key="src"> ????????????????????<ref bean="srcRegexUrl"/> ????????????????</entry> ????????????</map> ????????</property> ????</bean> |
5、版本歷史 |
|
2.0: |
核心代碼全部重寫,增加了擴展性,通過擴展之后,基本上能實現對整個網站完整的解析 |
1.0: |
實現了整站抓取的基本的功能,不能解析特殊的URL,對javascript無法辨認 |
|
|||||||||
|
|||||||||
|
|||||||||
4、如何擴展接口?
|
|||||||||
????擴展接口使用的配置文件是:conf/snoics-reptile-urlregex.xml ????首先加入一段如下的配置,其中正則表達式部分應該特定的需要自己給出, ??? reptile-replace-string用來代替URL出現的位置,在程序執行的過程中,該部分 ??? 會被自動替換。 ????<bean id="ahrefRegexUrl" class="com.snoics.reptile.regex.url.impl.UrlRegex" singleton="false"> ????????<property name="regexUrl"> ????????????<!-- 提取可能包含URL的字符串 --> ????????????<value><![CDATA[<[^!<>]*\shref\s*=\s*["']?[^<>]*["'\s][^<>]*>]]></value> ????????</property> ????????<property name="replaceRegexUrl"> ????????????<!-- 替換可能包含URL的字符串 --> ????????????<value><![CDATA[<[^!<>]*\shref\s*=\s*["']?reptile-replace-string["'\s][^<>]*>]]></value> ????????</property> ????????<property name="getRegexUrl"> ????????????<!-- 提取最終URL --> ????????????<ref bean="ahrefGetRegexUrl"/> ????????</property> ????</bean> ???? ????其中ahrefGetRegexUrl是實現了com.snoics.reptile.regex.url.IGetUrlRegex ??? 接口的類,用來從可能包含了URL的字符串里面提取其中包含的URL? ??? 其次加入如下的配置: ???? <bean id="ahrefGetRegexUrl" class="com.snoics.reptile.regex.url.impl.AhrefGetRegexUrl" singleton="false"> ???????? <property name="regexString"> ????????????? <!-- 提取最終URL --> ?????????????? <value><![CDATA[href\s*=\s*["']?[^\s"]+["'\s]\s*]]></value> ???????? </property> ???????? <property name="unIncludeRegexString"> ??????????????? <!-- ???????????????????? 排除不需要的類型 ???????????????????? 多個正則表達式之間使用';'隔開 ???????????????? ?--> ??????????????? ?<value><![CDATA[javascript\s?:\s?;mailto\s?:\s?;^#$;]]></value> ?????????? </property> ????? </bean> ????最后,在如下的配置中,加入剛才配置好的部分 ????<bean id="urlRegexMap" class="com.snoics.reptile.regex.url.impl.UrlRegexMap"> ????????<property name="ulrRegexMap"> ????????????<map> ????????????????<!-- 名稱 --> ????????????????<entry key="ahref"> ????????????????????<!-- 解析URL使用的類 --> ????????????????????<ref bean="ahrefRegexUrl"/> ????????????????</entry> ????????????????<entry key="src"> ????????????????????<ref bean="srcRegexUrl"/> ????????????????</entry> ????????????</map> ????????</property> ????</bean> |
5、版本歷史 |
|
2.0: |
核心代碼全部重寫,增加了擴展性,通過擴展之后,基本上能實現對整個網站完整的解析 |
1.0: |
實現了整站抓取的基本的功能,不能解析特殊的URL,對javascript無法辨認 |
/*
* Encrypt 字符串加密
*
* @author shiwei 2004-8-28
*/
package com.snoics.base.util;
/**
* Encrypt 字符串加密
* @author shiwei
*
*/
public class Encrypt {
public Encrypt() {
}
/**
* 加密字符串
* @param encryptstring
* @return String
*/
public static String encrypt(String encryptstring){
String newstring="";
if(encryptstring.length()<1){
return encryptstring;
}else{
String tempstring=StringClass.remove(encryptstring,0,(int)(encryptstring.length()/3));
tempstring=StringClass.getConvertString(tempstring);
encryptstring=StringClass.getConvertString(encryptstring);
newstring=encrypt(encryptstring,tempstring);
return newstring;
}
}
/**
* 普通加密字符串
*
* @param encryptstring1
* @param encryptstring2
* @return String
*/
public static String encrypt(String encryptstring1, String encryptstring2) {
int strcount = 0; //字符串ASCII碼的總和
int newpasswordlength = 0; //生成的密碼長度
int seed1 = 0; //種子
int seed2 = 0;
String str = "";
String newpassword = ""; //生成的密碼
char newchar;
int newcharint = 0;
int thechar = 0;
str = encryptstring2 + encryptstring1;
if (str.length() > 0) {
for (int i = 0; i < str.length(); i++) {
strcount = strcount + str.charAt(i);
}
newpasswordlength = (strcount * strcount) / str.length() + str.length();
int temp = 0;
int temp2 = 0;
while ((newpasswordlength <= 0) || (newpasswordlength > 100)) {
temp = temp + str.length();
temp2 = temp + temp2;
newpasswordlength = 100;
}
for (int i = 0; i < encryptstring1.length(); i++) {
seed1 = seed1 + encryptstring1.charAt(i);
}
for (int i = 0; i < encryptstring2.length(); i++) {
seed2 = seed2 + encryptstring2.charAt(i);
}
for (int i = 0; i < newpasswordlength; i++) {
if (i < str.length()) {
thechar = str.charAt(i);
} else {
thechar = str.charAt(i % (str.length() - 1))
+ str.charAt((str.length() - 1)
- (i % str.length()));
}
newcharint = thechar * (seed1 * (i + 1) + thechar);
newcharint = newString(newcharint);
newcharint = thechar * (seed2 * (i + 1) + thechar);
newcharint = newString(newcharint);
newchar = (char) newcharint;
newpassword = newpassword + String.valueOf(newchar);
}
newpassword = newpassword.substring((encryptstring2.length() + encryptstring1.length()) % 100);
return (newpassword);
} else {
return ("空字符串不能被加密");
}
}
private static int newString(int charint) {
while ((charint > 127) || (charint < 32)) {
while (charint > 127) {
charint = (charint - charint/2+1) / 2;
while(charint==60||charint==62||charint==34||charint==32||charint==39){
charint = charint + 1;
}
}
while (charint < 32) {
charint = (charint + charint/2-1) * 2;
while(charint==60||charint==62||charint==34||charint==32||charint==39){
charint = charint + 1;
}
}
}
return (charint);
}
public static void main(String[] args) {
String theusername = "1abc1";
String thepassword = "1def1";
String theusername1 = "1def1";
String thepassword1 = "1abc1";
String newstring=Encrypt.encrypt(theusername,thepassword);
System.out.println("newstring="+newstring);
String newstringa=Encrypt.encrypt(theusername1,thepassword1);
System.out.println("newstringa="+newstringa);
String newstring2=Encrypt.encrypt(newstring);
System.out.println("newstring2="+newstring2);
String newstring3=Encrypt.encrypt(newstring2);
System.out.println("newstring3="+newstring3);
}
}
執行結果:
1. 用戶可以從外部的系統接入,模塊中的用戶只有用戶名,密碼和描述這三個最基本的系統,然后通過ID和外部系統的用戶建立聯系
2. 角色之間可以繼承,可以有父角色和子角色,而且個數不限,允許多重繼承,通過繼承之后,角色可以擁有所有父角色的權限
3. 權限的劃分方式
????
??? a.權限用事件來劃分,每個事件通過一個handle來進行處理
???
??? b.一個handle就是一個class
??? c.事件的來源是一個配置文件,因此配置文件的方式可以是這樣的
<?xml version="1.0" encoding="GBK"?>
<control>
?<!-- 是否自動轉向 默認為false-->
?<isforward>false</isforward>
?<!-- 組件 -->
?<cmp id="cmp1" name="組件一">
??<!-- 事件 -->
??<event id="event1" name="事件一">
???<handle>com.snoics.cmp.event.Event1</handle>
???<view>/url1/pagename1</view>
??</event>
??<event id="event2" name="事件二">
???<handle>com.snoics.cmp.event.Event2</handle>
???<view>/url2/pagename2</view>
??</event>
?</cmp>
?<cmp id="cmp2" name="組件二">
??<event id="event3" name="事件三">
???<handle>com.snoics.cmp.event.Event3</handle>
???<view>/url3/pagename3</view>
??</event>
??<event id="event4" name="事件四">
???<handle>com.snoics.cmp.event.Event4</handle>
???<view>/url4/pagename4</view>
??</event>
?</cmp>
</control>
?
通過解析這個配置文件,可以得到每個事件的ID,這個ID就是以后的權限標志
給角色分配的權限就是這樣的一個一個的標志
4.??通過AOP給應用系統加入權限控制
???? 系統在執行的過程中,能自動的進行攔截,如果發現當前的class是處于配置文件中的某一個handle的時候,自動進行權限驗證,分析當前用戶所擁有的角色中是否具有執行相關的handle的權限,在驗證通過以后允許執行這個handle中的操作,否則拒絕執行
這樣做的好處就是能夠不在業務系統中寫入任何和權限相關的代碼,與權限相關的部分全部都是通過配置文件的配置來進行處理的,同時實現了權限控制的完全組件化.
如果大家有什么好的建議歡迎一起討論
能實現整個網站的抓取,暫時還不支持javascript形式的連接
能抓取網頁,網頁中的所有的URL重新生成,圖片,文件,包括所有格式的文件,全部都能保持原有的路徑結構
抓取下的網頁,通過apache搭建成網站,能在本地保持成一個完整的網站的形式
能直接使用,也能支持二次開發使用,不過暫時還會存在比較多的不完善的地方.
提供內置線程,能控制抓取操作執行的時間,循環執行
東西還不是很完善,歡迎大家提出意見
下載地址 http://www.aygfsteel.com/Files/snoics/snoics-reptile.rar
--角色繼承關系表
create table SNOICS_RI (
RI_PARE_ROLEID VARCHAR2(32) not null,
RI_CHILD_ROLEID VARCHAR2(32) not null,
constraint PK_SNOICS_RI primary key (RI_PARE_ROLEID, RI_CHILD_ROLEID)
);
--角色表
create table SNOICS_ROLE (
ROLE_ID VARCHAR2(32) not null,
ROLE_NAME VARCHAR2(32) not null,
ROLE_FORBID VARCHAR2(1),
ROLE_DESCRIPT VARCHAR2(500),
constraint PK_SNOICS_ROLE primary key (ROLE_ID)
);
角色資料存放在SNOICS_ROLE中
角色之間可以繼承,而且可以多重繼承,
角色的繼承關系存放在SNOICS_RI
可以使用SNOICS_ROLE自己到自己的多對多的關系來進行配置
-----------------------------------------------------------------------------------------------------
POJO:
package com.snoics.cmp.security.dao.spring.hibernate.pojo;
import java.io.Serializable;
import java.util.Set;
public class RolePOJO implements Serializable {
private static final long serialVersionUID = -4776193447586778294L;
private String roleid;
private String rolename;
private String roleforbid;
private String roledescript;
private Set user;
private Set rolePermission;
private Set roleP;
private Set roleC;
/**
* @return Returns the roleC.
*/
public Set getRoleC() {
return roleC;
}
/**
* @param roleC The roleC to set.
*/
public void setRoleC(Set roleC) {
this.roleC = roleC;
}
/**
* @return Returns the roleP.
*/
public Set getRoleP() {
return roleP;
}
/**
* @param roleP The roleP to set.
*/
public void setRoleP(Set roleP) {
this.roleP = roleP;
}
/**
* @return Returns the rolePermission.
*/
public Set getRolePermission() {
return rolePermission;
}
/**
* @param rolePermission The rolePermission to set.
*/
public void setRolePermission(Set rolePermission) {
this.rolePermission = rolePermission;
}
/**
* @return Returns the user.
*/
public Set getUser() {
return user;
}
/**
* @param user The user to set.
*/
public void setUser(Set user) {
this.user = user;
}
/**
* @return Returns the roledescript.
*/
public String getRoledescript() {
return roledescript;
}
/**
* @param roledescript The roledescript to set.
*/
public void setRoledescript(String roledescript) {
this.roledescript = roledescript;
}
/**
* @return Returns the roleforbid.
*/
public String getRoleforbid() {
return roleforbid;
}
/**
* @param roleforbid The roleforbid to set.
*/
public void setRoleforbid(String roleforbid) {
this.roleforbid = roleforbid;
}
/**
* @return Returns the roleid.
*/
public String getRoleid() {
return roleid;
}
/**
* @param roleid The roleid to set.
*/
public void setRoleid(String roleid) {
this.roleid = roleid;
}
/**
* @return Returns the rolename.
*/
public String getRolename() {
return rolename;
}
/**
* @param rolename The rolename to set.
*/
public void setRolename(String rolename) {
this.rolename = rolename;
}
}
-----------------------------------------------------------------------------------------------------
role.hbm.xml中的繼承關系部分的配置
<set name="roleP" table="SNOICS_RI" cascade="all" inverse="false" lazy="true">
<key column="RI_CHILD_ROLEID"/>
<many-to-many column="RI_PARE_ROLEID" class="com.snoics.cmp.security.dao.spring.hibernate.pojo.RolePOJO"/>
</set>
<set name="roleC" table="SNOICS_RI" cascade="all" inverse="false" lazy="true">
<key column="RI_PARE_ROLEID"/>
<many-to-many column="RI_CHILD_ROLEID" class="com.snoics.cmp.security.dao.spring.hibernate.pojo.RolePOJO"/>
</set>