posts - 89, comments - 241, trackbacks - 0, articles - 1
   :: 首页 ::  :: 联系 :: 聚合  :: 管理

置顶随笔

4枚Google Wave提名,大家申请吧~

posted @ 2009-10-15 10:38 saobaolu| 编辑 收藏

2013年8月24日

     摘要: 代码改编自 NetPuter 大大发布的 SDK,这份 SDK 是我用过的最好的 PHP SDK,修改了一些东西:1、增加了收到的讯息类型 voice video2、收到text的时候,如果是 hello2bizuser 的话,调用 onsubscribe 方法(微信4.x 以前貌似都还是发hello2bizuser 所以不得不兼容啊)Code highlighting produced by A...  阅读全文

posted @ 2013-08-24 16:02 saobaolu| 编辑 收藏

2010年7月6日

<TABLE style="table-layout: auto | fixed">
auto: 默认值
fixed: 宽度固定,截断超出的内容

<TABLE style="word-break: normal | break-all | keep-all">
normal: 默认值,按字词截断换行
break-all: 强行截断并换行
keep-all: 不截断不换行

使用:style="table-layout:fixed;"
表示输出停止,停留在设定的长度内.

使用:style="word-break : break-all;"
表示对超长部分,换行再继续显示.

对于在英文中使用,请使用style="table-layout:fixed; word-wrap:break-word"
推荐使用word-wrap:break-word;word-break:break-all;table-layout:fixed;

==============================================================================

word-wrap同word-break的区别

word-wrap:
normal      Default. Content exceeds the boundaries of its container. 
break-word Content wraps to next line, and a word-break occurs when necessary. 必要时会触发word-break。

word-break:
normal      Default. Allows line breaking within words. 好像是只对Asian text起作用。
break-all Behaves the same as normal for Asian text, yet allows the line to break arbitrarily for non-Asian text. This value is suited to Asian text that contains some excerpts of non-Asian text. 
keep-all Does not allow word breaking for Chinese, Japanese, and Korean. Functions the same way as normal for all non-Asian languages. This value is optimized for text that includes small amounts of Chinese, Japanese, or Korean.

总结如下:
word-wrap是控制换行的。
使用break-word时,是将强制换行。中文没有任何问题,英文语句也没问题。但是对于长串的英文,就不起作用。

break-word是控制是否断词的。
normal是默认情况,英文单词不被拆开。
break-all,是断开单词。在单词到边界时,下个字母自动到下一行。主要解决了长串英文的问题。
keep-all,是指Chinese, Japanese, and Korean不断词。即只用此时,不用word-wrap,中文就不会换行了。(英文语句正常。)


ie下:
使用word-wrap:break-word;所有的都正常。

ff下:
如这2个都不用的话,中文不会出任何问题。英文语句也不会出问题。但是,长串英文会出问题。
为了解决长串英文,一般用word-wrap:break-word;word-break:break-all;。但是,此方式会导致,普通的英文语句中的单词会被断开(ie下也是)。

目前主要的问题存在于 长串英文 和 英文单词被断开。其实长串英文就是一个比较长的单词而已。
即英文单词应不应该被断开那?那问题很明显了,显然不应该被断开了。
对于长串英文,就是恶意的东西,自然不用去管了。但是,也要想些办法,不让它把容器撑大。
用:overflow:auto; ie下,长串会自动折行。ff下,长串会被遮盖。


所以,综上,最好的方式是word-wrap:break-word;overflow:hidden;而不是word-wrap:break-word;word-break:break-all;。
word-wrap:break-word;overflow:auto;在ie下没有任何问题。在ff下,长串会被遮住部分内容。

另,测试代码如下:

1.htm===================================================================

<style>
.c1{ width:300px;      border:1px solid red}
.c2{ width:300px;word-wrap:break-word;      border:1px solid yellow}
.c3{ width:300px;word-wrap:break-word;word-break:break-all;      border:1px solid green}
.c4{ width:300px;word-wrap:break-word;word-break:keep-all; border:1px solid blue}
.c5{ width:300px;word-break:break-all;      border:1px solid black}
.c6{ width:300px;word-break:keep-all;      border:1px solid red}
.c7{ width:300px;word-wrap:break-word;overflow:auto;      border:1px solid yellow}
</style>

.c1{ width:300px;      border:1px solid red}
<div class="c1">
safjaskflasjfklsajfklasjflksajflksjflkasjfksafj
</div>
<div class=c1>
This is all English. This is all English. This is all English.
</div>
<div class=c1>
全是中文的情况。全是中文的情况。全是中文的情况。
</div>
<div class=c1>
中英文混排的情况。Chinese and English. 中英文混排的情况。Chinese and English. 
</div>

<br>
.c2{ width:300px;word-wrap:break-word; border:1px solid yellow}
<div class="c2">
safjaskflasjfklsajfklasjflksajflksjflkasjfksafj
</div>
<div class=c2>
This is all English. This is all English. This is all English.
</div>
<div class=c2>
全是中文的情况。全是中文的情况。全是中文的情况。
</div>
<div class=c2>
中英文混排的情况。Chinese and English. 中英文混排的情况。Chinese and English. 
</div>

<br>
.c3{ width:300px;word-wrap:break-word;word-break:break-all;      border:1px solid green}
<div class="c3">
safjaskflasjfklsajfklasjflksajflksjflkasjfksafj
</div>
<div class=c3>
This is all English. This is all English. This is all English.
</div>
<div class=c3>
全是中文的情况。全是中文的情况。全是中文的情况。
</div>
<div class=c3>
中英文混排的情况。Chinese and English. 中英文混排的情况。Chinese and English. 
</div>

<br>
.c4{ width:300px;word-wrap:break-word;word-break:keep-all; border:1px solid blue}
<div class="c4">
safjaskflasjfklsajfklasjflksajflksjflkasjfksafj
</div>
<div class=c4>
This is all English. This is all English. This is all English.
</div>
<div class=c4>
全是中文的情况。全是中文的情况。全是中文的情况。
</div>
<div class=c4>
中英文混排的情况。Chinese and English. 中英文混排的情况。Chinese and English. 
</div>

<br>
.c5{ width:300px;word-break:break-all;      border:1px solid black}
<div class="c5">
safjaskflasjfklsajfklasjflksajflksjflkasjfksafj
</div>
<div class=c5>
This is all English. This is all English. This is all English.
</div>
<div class=c5>
全是中文的情况。全是中文的情况。全是中文的情况。
</div>
<div class=c5>
中英文混排的情况。Chinese and English. 中英文混排的情况。Chinese and English. 
</div>

<br>
.c6{ width:300px;word-break:keep-all;      border:1px solid red}
<div class="c6">
safjaskflasjfklsajfklasjflksajflksjflkasjfksafj
</div>
<div class=c6>
This is all English. This is all English. This is all English.
</div>
<div class=c6>
全是中文的情况。全是中文的情况。全是中文的情况。
</div>
<div class=c6>
中英文混排的情况。Chinese and English. 中英文混排的情况。Chinese and English. 
</div>

<br>
.c7{ width:300px;word-wrap:break-word;overflow:auto;      border:1px solid yellow}
<div class="c7">
safjaskflasjfklsajfklasjflksajflksjflkasjfksafj
</div>
<div class=c7>
This is all English. This is all English. This is all English.
</div>
<div class=c7>
全是中文的情况。全是中文的情况。全是中文的情况。
</div>
<div class=c7>
中英文混排的情况。Chinese and English. 中英文混排的情况。Chinese and English. 
</div>

posted @ 2010-07-06 22:43 saobaolu| 编辑 收藏

2010年6月26日

 1 import java.io.*;
 2 import java.util.Scanner;
 3 public class SortTest {
 4     public static void main(String[] args) throws IOException {
 5         int temp = 0;//临时变量,用于冒泡交换        
 6         int[] num=new int[10];  //声明一个空的数组  10个长度
 7         Scanner sc = new Scanner(System.in);
 8         FileOutputStream out=new FileOutputStream("1.txt");
 9         PrintStream p=new PrintStream(out);
10         //开始循环赋值
11         for(int i =0;i<num.length;i++){
12             num[i]=sc.nextInt();
13         }
14         p.append("排序前为:");
15         for (int i = 0; i <num.length; i++) {
16             System.out.println(num[i]);
17             p.append(num[i]+" , ");
18         }
19         // 用于排序
20         for (int i = 0; i < num.length-1; i++) {
21             for (int j = 0; j < num.length - i - 1; j++) {
22                 if (num[j] > num[j + 1]) {
23                     temp = num[j];
24                     num[j] = num[j + 1];
25                     num[j + 1= temp;
26                 }
27             }
28         }
29         //输出文件
30         p.append("\n");
31         p.append("排序后为:");
32         // 循环输出
33         System.out.println("排序后为:");
34         for (int i = 0; i <num.length; i++) {
35             System.out.println(num[i]);
36             p.append(num[i]+" , ");
37         }
38     
39         
40     }
41 }
最后应该把p给close了哈

posted @ 2010-06-26 09:02 saobaolu| 编辑 收藏

2010年6月25日

转自:http://www.ry168.net/bbs/thread-226-1-1.html
table不能换行问题 一般是:一行里面全是数字或是字母或者结尾有多个感叹号而导致 table不能换行,中文默认的会自动换行的,字母不能换行问题:
style="table-layout:fixed; word-break: break-all; overflow:hidden;"
复制代码在单元格属性里加入上面这句,如:
<td style="table-layout:fixed; word-break: break-all; overflow:hidden;">
复制代码用表格做网页排版的时候,一般都能正常使用。偏偏有时会碰到一段连续的英文词或者一堆感叹号(!!!)把网页就撑开的现象。

总结了一下,只要在CSS中定义了如下句子,可保网页不会再被撑开了。

自动换行问题,正常字符的换行是比较合理的,而连续的数字和英文字符常常将容器撑大,挺让人头疼,下面介绍的是CSS如何实现换行的方法

对于div,p等块级元素

正常文字的换行(亚洲文字和非亚洲文字)元素拥有默认的white-space:normal,当定义的宽度之后自动换行

html
<div id="wrap">正常文字的换行(亚洲文字和非亚洲文字)元素拥有默认的white-space:normal,当定义</div>
css
#wrap{white-space:normal; width:200px; }

IE浏览器

连续的英文字符和阿拉伯数字,使用word-wrap: break-word ;或者word-break:break-all;实现强制断行

html
<div id="wrap">abcdefghijklmnabcdefghijklmnabcdefghijklmn111111111</div>

css
#wrap{word-break:break-all; width:200px;}
或者
#wrap{word-wrap:break-word; width:200px;}

Firefox浏览器
连续的英文字符和阿拉伯数字的断行,Firefox的所有版本的没有解决这个问题,我们只有让超出边界的字符隐藏或者,给容器添加滚动条

html
<div id="wrap">abcdefghijklmnabcdefghijklmnabcdefghijklmn111111111</div>

css
#wrap{word-break:break-all; width:200px; overflow:auto;}

对于table元素
IE浏览器
1. 使用 table-layout:fixed;强制table的宽度,多余内容隐藏<table style="table-layout:fixed" width="200"><tr><td>abcdefghigklmnopqrstuvwxyz1234567890ssssssssssssss</td></tr></table>
复制代码2. 使用 table-layout:fixed;强制table的宽度,内层td,th采用word-break : break-all;或者word-wrap : break-word ;换行 <table width="200" style="table-layout:fixed;"><tr><td width="25%" style="word-break : break-all; ">abcdefghigklmnopqrstuvwxyz 1234567890</td><td style="word-wrap : break-word ;">abcdefghigklmnopqrstuvwxyz 1234567890</td></tr></table>
复制代码3.在td,th中嵌套div,p等采用上面提到的div,p的换行方法

Firefox浏览器

1. 使用 table-layout:fixed;强制table的宽度,内层td,th采用word-break : break-all;或者word-wrap : break-word ;换行,使用overflow:hidden;隐藏超出内,这里overflow:auto;无法起作用<table style="table-layout:fixed" width="200"><tr>

<td width="25%"  style="word-break : break-all; overflow:hidden; ">abcdefghigklmnopqrstuvwxyz1234567890</td>

<td width="75%" style="word-wrap : break-word; overflow:hidden; ">abcdefghigklmnopqrstuvwxyz1234567890</td>

</tr></table>
复制代码2.在td,th中嵌套div,p等采用上面提到的对付Firefox的方法。

最佳CSS定义换行代码.wrap { table-layout:fixed; word-break: break-all; overflow:hidden; }
复制代码当然,这种现象出现的几率很小,但是不能排除网友的恶搞。

posted @ 2010-06-25 14:06 saobaolu| 编辑 收藏

网址是http://wp.qq.com
发现这个玩意越来越强大了,就忍不住把官方的介绍搬过来:
代码样例
<a href="http://sighttp.qq.com/cgi-bin/check?sigkey=81a37f0b7cac68639bddfdb9b93a6c92bc211f3e3a4e683afbb31a079382dc9d";target=_blank; onclick="var tempSrc='http://sighttp.qq.com/wpa.js?rantime='+Math.random()+'&sigkey=81a37f0b7cac68639bddfdb9b93a6c92bc211f3e3a4e683afbb31a079382dc9d';var oldscript=document.getElementById('testJs');var newscript=document.createElement('script');newscript.setAttribute('type','text/javascript'); newscript.setAttribute('id', 'testJs');newscript.setAttribute('src',tempSrc);if(oldscript == null){document.body.appendChild(newscript);}else{oldscript.parentNode.replaceChild(newscript, oldscript);}return false;"><img border="0" SRC='http://wpa.qq.com/pa?p=1:80000805:1' alt="点击这里给我发消息"></a>

1)、sigkey为个人鉴权key,请勿修改,否则无法发起临时会话。

2)、临时会话图标<img border="0" SRC='http://wpa.qq.com/pa?p=1:80000805:1' alt="点击这里给我发消息">

SRC是图标链接,自定义图标中可以替换这一部分为自己图片的链接,

参数:

P=以冒号“:”分隔多个参数

第一个参数为版本号,目前为1;

第二个为QQ/TM号码;

第三个参数为图像风格,支持多种状态。

alt是图标旁留言。

3)、除了自定义图标需要修改临时会话图标外,其他情况下建议不要修改代码,因为有可能导致在不同的环境和浏览器下,无法发起临时会话。


自定义在线风格图片

用JS实现,具体步骤如下:

1) 申请代码

<a href="http://sighttp.qq.com/cgi-bin/check?sigkey=81a37f0b7cac68639bddfdb9b93a6c92bc211f3e3a4e683afbb31a079382dc9d"; target=_blank; onclick="var tempSrc='http://sighttp.qq.com/wpa.js?rantime='+Math.random()+'&sigkey=81a37f0b7cac68639bddfdb9b93a6c92bc211f3e3a4e683afbb31a079382dc9d';var oldscript=document.getElementById('testJs');var newscript=document.createElement('script');newscript.setAttribute('type','text/javascript'); newscript.setAttribute('id', 'testJs');newscript.setAttribute('src',tempSrc);if(oldscript == null){document.body.appendChild(newscript);}else{oldscript.parentNode.replaceChild(newscript, oldscript);}return false;"><img border="0" SRC='http://wpa.qq.com/pa?p=1:80000805:1' alt="点击这里给我发消息"></a>

2) 定义online数组,必须是online命名

<script>var online= new Array();</script>

3) 获取在线状态

<script src="http://webpresence.qq.com/getonline?Type=1&80000805:"></script>

可以获取多个,必须以冒号分隔,以冒号结尾,比如:

<script src="http://webpresence.qq.com/getonline?Type=1&80000805:10000:123456:"></script>

online[0]=0,表示80000805离线

online[1]=1,表示10000在线

online[2]=1,表示123456在线

填写号码的先后顺序,分别对应数组online的0、1、2

4) 添加代码

把SRC='http://wpa.qq.com/pa?p=1:80000805:1'替换为自己的图片,比如:

<script> if(online[0]==0) document.write("<a href="http://sighttp.qq.com/cgi-bin/check?sigkey=81a37f0b7cac68639bddfdb9b93a6c92bc211f3e3a4e683afbb31a079382dc9d"; target=_blank; onclick="var tempSrc='http://sighttp.qq.com/wpa.js?rantime='+Math.random()+'&sigkey=81a37f0b7cac68639bddfdb9b93a6c92bc211f3e3a4e683afbb31a079382dc9d';var oldscript=document.getElementById('testJs');var newscript=document.createElement('script');newscript.setAttribute('type','text/javascript'); newscript.setAttribute('id', 'testJs');newscript.setAttribute('src',tempSrc);if(oldscript == null){document.body.appendChild(newscript);}else{oldscript.parentNode.replaceChild(newscript, oldscript);}return false;"><img border="0" SRC='http://xxxx/outline.jpg' alt="点击这里给我发消息"></a>"); 
else document.write("<a href="http://sighttp.qq.com/cgi-bin/check?sigkey=81a37f0b7cac68639bddfdb9b93a6c92bc211f3e3a4e683afbb31a079382dc9d"; target=_blank; onclick="var tempSrc='http://sighttp.qq.com/wpa.js?rantime='+Math.random()+'&sigkey=81a37f0b7cac68639bddfdb9b93a6c92bc211f3e3a4e683afbb31a079382dc9d';var oldscript=document.getElementById('testJs');var newscript=document.createElement('script');newscript.setAttribute('type','text/javascript'); newscript.setAttribute('id', 'testJs');newscript.setAttribute('src',tempSrc);if(oldscript == null){document.body.appendChild(newscript);}else{oldscript.parentNode.replaceChild(newscript, oldscript);}return false;"><img border="0" SRC='http://xxxx/online.jpg' alt="点击这里给我发消息"></a>"); </script> 

我是这样看的,用tx的方法得到某QQ号是否在线,用js判断,显示online.jpg或者outline.jpg这两个图片,其余不变。

posted @ 2010-06-25 07:28 saobaolu| 编辑 收藏

2010年6月19日

 

package myeclipsegen;

import java.io.*;

public class MyEclipseGen {
    
private static final String LL = "Decompiling this copyrighted software is a violation of both your license agreement and the Digital Millenium Copyright Act of 1998 (http://www.loc.gov/copyright/legislation/dmca.pdf). Under section 1204 of the DMCA, penalties range up to a $500,000 fine or up to five years imprisonment for a first offense. Think about it; pay for a license, avoid prosecution, and feel better about yourself.";
    
public String getSerial(String userId, String licenseNum) {
        java.util.Calendar cal 
= java.util.Calendar.getInstance();
        cal.add(
13);
        cal.add(
6-1);
        java.text.NumberFormat nf 
= new java.text.DecimalFormat("000");
        licenseNum 
= nf.format(Integer.valueOf(licenseNum));
        String verTime 
= new StringBuilder("-").append(new java.text.
                SimpleDateFormat(
"yyMMdd").format(cal.getTime())).append("0").
                         toString();
        String type 
= "YE3MP-";
        String need 
= new StringBuilder(userId.substring(01)).append(type).
                      append(
"300").append(licenseNum).append(verTime).toString();
        String dx 
= new StringBuilder(need).append(LL).append(userId).toString();
        
int suf = this.decode(dx);
        String code 
= new StringBuilder(need).append(String.valueOf(suf)).
                      toString();
        
return this.change(code);
    }

    
private int decode(String s) {
        
int i;
        
char[] ac;
        
int j;
        
int k;
        i 
= 0;
        ac 
= s.toCharArray();
        j 
= 0;
        k 
= ac.length;
        
while (j < k) {
            i 
= (31 * i) + ac[j];
            j
++;
        }
        
return Math.abs(i);
    }

    
private String change(String s) {
        
byte[] abyte0;
        
char[] ac;
        
int i;
        
int k;
        
int j;
        abyte0 
= s.getBytes();
        ac 
= new char[s.length()];
        i 
= 0;
        k 
= abyte0.length;
        
while (i < k) {
            j 
= abyte0[i];
            
if ((j >= 48&& (j <= 57)) {
                j 
= (((j - 48+ 5% 10+ 48;
            } 
else if ((j >= 65&& (j <= 90)) {
                j 
= (((j - 65+ 13% 26+ 65;
            } 
else if ((j >= 97&& (j <= 122)) {
                j 
= (((j - 97+ 13% 26+ 97;
            }
            ac[i] 
= (char) j;
            i
++;
        }
        
return String.valueOf(ac);
    }

    
public MyEclipseGen() {
        
super();
    }

    
public static void main(String[] args) {
        
try {
            System.out.println(
"please input register name:");
            BufferedReader reader 
= new BufferedReader(new InputStreamReader(
                    System.in));
            String userId 
= null;
            userId 
= reader.readLine();
            MyEclipseGen myeclipsegen 
= new MyEclipseGen();
            String res 
= myeclipsegen.getSerial(userId, "20");
            System.out.println(
"Serial:" + res);
            reader.readLine();
        } 
catch (IOException ex) {
        }
    }
}
点此下载源文件和编译好的class文件吧
/Files/chenglu/MyEclipse61Gen.zip
额,还有,MyEclipse6的下载地址是:请使用迅雷下载。。http://downloads.myeclipseide.com/downloads/products/eworkbench/6.0.1GA/MyEclipse_6.0.1GA_E3.3.1_FullStackInstaller.exe

posted @ 2010-06-19 22:09 saobaolu| 编辑 收藏

2010年6月17日

先来看html代码
<p>
  
<label>选择分类</label>
    
<select name="classId">
      
<option value="1">企业动态</option>
      
<option value="2">最新活动</option>
    
</select>
</p>
在纯struts2中获取用户选择值直接
private String classId;
 
public void setTitle(String title) {
  
this.title = title;
 }
 
public String getClassId() {
  
return classId;
 }
就可以,需要注意的是select一定要带name,option取到的是value

posted @ 2010-06-17 07:12 saobaolu| 编辑 收藏

2010年6月16日

 

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import sun.misc.BASE64Encoder;

    
public String EncoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        
//确定计算方法
        MessageDigest md5=MessageDigest.getInstance("MD5");
        BASE64Encoder base64en 
= new BASE64Encoder();
        
//加密后的字符串
        String newstr=base64en.encode(md5.digest(str.getBytes("utf-8")));
        
return newstr;
    }
 u错了,这不是md5的算法,是md5+base64加密,,

posted @ 2010-06-16 09:09 saobaolu| 编辑 收藏

2010年3月22日

1
2if(rs.isAfterLast()==rs.isBeforeFirst()){
3    out.print("您所查找的信息不存在,请确认后再查找!");
4    }
else{
5
6}

posted @ 2010-03-22 21:24 saobaolu| 编辑 收藏

2010年1月26日

posted @ 2010-01-26 11:17 saobaolu| 编辑 收藏

2010年1月8日

r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
w(Write,写入):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。
x(eXecute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。
e.g.  -rw-r--r--
1.去掉第一个- 后面三个三个为一组 rw-/r--/r--  (所有者权限/组用户权限/其他用户权限)
2.解析:所有者权限:读取、写入、不可执行;本组用户权限:读取、不可写入、不可执行;其他用户权限:读取、不可写入、不可执行。
3.两种方式去解析成数字表示法:
    3.1:r: 对应数值4  w: 对应数值2  x:对应数值1,则:4+2+1=7/4+0+0=4/4+0+0=4:744权限
    3.2:将其转换成二进制数,有值就是1,没值就是0,则:110/100/100,转换成十进制:110=7/100=4/110=4:744权限

posted @ 2010-01-08 04:36 saobaolu| 编辑 收藏

     摘要:   《Linux(第1—4章)总结》 1.       linux操作系统的特点:开放性,多用户,多任务,良好的用户界面,设备独立性,出色的速度性能,丰富的网络功能,可靠的安全性,可移植性强,安全符合POSIX标准,UNIX的完整实现,开发功能强。 2.     &nbs...  阅读全文

posted @ 2010-01-08 02:45 saobaolu| 编辑 收藏

2010年1月7日

     摘要:   1.       基本的 HTML 标签 标签 描述 ...  阅读全文

posted @ 2010-01-07 16:31 saobaolu| 编辑 收藏

2010年1月2日

Spring的applicationContext.xml文件

想必用过Spring的程序员们都有这样的感觉,Spring把逻辑层封装的太完美了(个人感觉View层封装的不是很好)。以至于有的初学者 都不知道Spring配置文件的意思,就拿来用了。所以今天我给大家详细解释一下Spring的applicationContext.xml文件。 Ok,我还是通过代码加注释的方式为大家演示: 以下是详解Spring的applicationContext.xml文件代码:
<!-- 头文件,主要注意一下编码 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 建立数据源 -->
 <bean >
<!-- 数据库驱动,我这里使用的是Mysql数据库 -->
  <property >
   <value>com.mysql.jdbc.Driver</value>
  </property>
<!-- 数据库地址,这里也要注意一下编码,不然乱码可是很郁闷的哦! -->
  <property >
   <value>
       jdbc:mysql://localhost:3306/tie?useUnicode=true&characterEncoding=utf-8
   </value>
  </property>
<!-- 数据库的用户名 -->
  <property >
   <value>root</value>
  </property>
<!-- 数据库的密码 -->
  <property >
   <value>123</value>
  </property>
 </bean>
<!-- 把数据源注入给Session工厂 -->
 <bean
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property >
   <ref bean="dataSource" />
  </property>
<!-- 配置映射文件 -->
  <property >
   <list>
    <value>com/alonely/vo/User.hbm.xml</value>
   </list>
  </property>
 </bean>
<!-- 把Session工厂注入给hibernateTemplate -->
 <!-- 解释一下hibernateTemplate:hibernateTemplate提供了很多方便的方法,在执行时自动建立 HibernateCallback 对象,例如:load()、get()、save、delete()等方法。 -->
 <bean
  class="org.springframework.orm.hibernate3.HibernateTemplate">
  <constructor-arg>
   <ref local="sessionFactory" />
  </constructor-arg>
 </bean>
<!-- 把DAO注入给Session工厂 -->
 <bean >
  <property >
   <ref bean="sessionFactory" />
  </property>
 </bean>
<!-- 把Service注入给DAO -->
 <bean >
  <property >
   <ref local="userDAO" />
  </property>
 </bean>
<!-- 把Action注入给Service -->
 <bean >
  <property >
   <ref bean="userService" />
  </property>
 </bean>
</beans>
以上Spring的applicationContext.xml文件我是用的SSH架构,如果您用Spring的MVC架构,其原理也是一样的。

posted @ 2010-01-02 23:42 saobaolu| 编辑 收藏

2009年12月18日

Linux下Squid代理服务器的配置(转)

启动squid时如果不在squid.conf中设置主机名将无法启动,必须要设置visible_hostname这个参数值,本文中,设置的主机名是服务器的真实机器名powersite,在squid.conf中找到该项并修改:
visible_hostname linuxserver

你想让所有员工仅在上班时可上网,而且不允许192.168.1.23这台主机上网,可以加入这样的配置:
# 将以下ACL添加到squid.conf的ACL配置部分
acl home_network src 192.168.1.0/24
acl business_hours time M T W H F 9:00-17:00
acl RestrictedHost src 192.168.1.23
# 将这些内容添加到squid.conf的http_access配置部分
http_access deny RestrictedHost
http_access allow home_network business_hours

你只想在早晨这段时间允许员工访问Internet:
# 将以下ACL添加到squid.conf的ACL配置部分
acl mornings time 08:00-12:00
# 将这些内容添加到squid.conf的http_access配置部分
http_access allow mornings

Squid支持从外部读取包含有web站点或域名的文件进行ACL限制。在下面的例子中创建了两个文件,/etc/squid/allowed-sites.squid和/etc/squid/restricted-sites.squid,很明显,一个是允许访问的站点文件,另一个是限制访问站点文件。
# vi /etc/squid/allowed-sites.squid
www.163.com
www.yahoo.cn

# vi /etc/squid/restricted-sites.squid
www.sex.com
sex.com
然后配置在工作时间允许或限制访问的目标站点,以下的ACL配置和前面的略微不同:
#
# 将以下ACL添加到squid.conf的ACL配置部分
#
acl home_network src 192.168.1.0/24
acl business_hours time M T W H F 9:00-17:00
acl GoodSites dstdomain "/etc/squid/allowed-sites.squid"
acl BadSites dstdomain "/etc/squid/restricted-sites.squid"

#
# 将这些内容添加到squid.conf的http_access配置部分
#
http_access deny BadSites
http_access allow home_network business_hours GoodSites

根据IP地址限制Web访问
这个ACL访问控制列表可以限制整个一个网段,功能还是很强的。
#
# 将以下ACL添加到squid.conf的ACL配置部分
#
acl home_network src 192.168.1.0/255.255.255.0
然后添加http_access允许这个ACL:
#
# 将这些内容添加到squid.conf的http_access配置部分
#
http_access allow home_network

设置Squid为透明代理
如果客户端连接网络,就需要在浏览器设置Squid代理服务器,这是件比较麻烦的工作,而且代理服务器的地址或端口更换,每台服务器都必须重新设置才能生效,想解决这个问题,可以使用透明代理的方法。透明代理就是使用iptables防火墙将squid的3128端口的请求全部转发到HTTP的80端口,从而实现透明代理。
2.6内核版本之上:新版本的squid只需要修改成如下的内容即可。默认是“http_port 3128”,要将其改为“http_port 3128 transparent”的形式:
另外还要配置iptables防火墙
在下面两个例子中,作为防火墙的服务器有两块网卡,连接Internet的eth0和连接内网的eth1,同时防火墙也是内网的网关。
如果Squid服务器和防火墙在一台服务器上,那么所有的HTTP80端口的请求将转发到Squid服务的配置端口3128上。
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -A INPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -i eth1 -p tcp --dport 3128
iptables -A OUTPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -o eth0 -p tcp --dport 80
iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -i eth0 -p tcp --sport 80
iptables -A OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -o eth1 -p tcp --sport 80
如果Squid服务器和防火墙在不同的服务器上,iptables的规则将有所不同:
iptables -t nat -A PREROUTING -i eth1 -s ! 192.168.1.100 -p tcp --dport 80 -j DNAT --to 192.168.1.100:3128
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24 -d 192.168.1.100 -j SNAT --to 192.168.1.1
iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.1.100 -i eth1 -o eth1 -m state
--state NEW,ESTABLISHED,RELATED -p tcp --dport 3128 -j ACCEPT
iptables -A FORWARD -d 192.168.1.0/24 -s 192.168.1.100 -i eth1 -o eth1 -m state --state ESTABLISHED,RELATED -p tcp --sport 3128 -j ACCEPT

Squid的密码验证
1) 创建密码文件。密码和用户名存放在/etc/squid/squid_passwd文件中,并需要将这个文件的权限设置为其它用户只读。
# touch /etc/squid/squid_passwd
# chmod o+r /etc/squid/squid_passwd
(2)使用htpasswd添加用户,并设置密码。添加用户不需要对squid进行重启操作,我创建的用户名是www
# htpasswd /etc/squid/squid_passwd www
New password:
Re-type password for user www
#
(3)找到ncsa_auth命令的具体位置,后面的配置需要用到绝对路径
# which ncsa_auth
/usr/sbin/ncsa_auth
(4) 然后我们就要在squid.conf文件中定义验证程序了,创建名为ncsa_users的ACL并加入关键字REQUIRED来强制让Squid使用NCSA验证方法。
#
# 在squid.conf的auth_param部分添加下列内容
#
auth_param basic program /usr/sbin/ncsa_auth /etc/squid/squid_passwd

#
# 将以下ACL添加到squid.conf的ACL配置部分
#
acl ncsa_users proxy_auth REQUIRED

#
# 将这些内容添加到squid.conf的http_access配置部分
#
http_access allow ncsa_users

posted @ 2009-12-18 08:24 saobaolu| 编辑 收藏