微软内部补丁(非正式发布)之取得方式(20110713)

http://support.microsoft.com/?kbid =输入kb后面的数字即可在ms上得到此补丁信息
并可以立即要求内部补丁下载.

范例如下:
http://support.microsoft.com/?kbid=954232
*按左上角.
检视和要求下载 hotfix
*按接受.
*输入email及验证码
(约一分钟后收信)得下载位置和解压密码.

平常都在此下载现成的,用上面方法可以立即得到最新版.
如果方便的话,希望大家找到最新版可以上传分享. ^_^
http://thehotfixshare.net/board/index.php?s=220dc83807c10ae1b7c8f759bbffc77c&automodule=downloads

http://kbupdate.info/

方便网友, 最新 flashplayer 由此下
http://fpdownload.adobe.com/get/ … flash_player_ax.exe

至 20110713 止, 我收集的补丁(去除重覆旧补丁及有问题补丁)

FOR XP SP3  20110713 止

KB817688, KB889320, KB890830, KB897571, KB898461
KB909520, KB915800, KB916157, KB922120, KB927436
KB932716, KB934401, KB942213, KB942288, KB943232
KB944043, KB945436, KB946648, KB947460, KB948101
KB948277, KB948720, KB948877, KB949127, KB949900
KB950616, KB950820, KB950982, KB950974, KB951159
KB951163, KB951347, KB951376, KB951531, KB951618
KB951624, KB951709, KB951822, KB951978, KB952011
KB952004, KB952117, KB952595, KB952954, KB953024
KB953028, KB953155, KB953761, KB953930, KB954193

KB954232, KB954434, KB954920, KB955109, KB955356
KB955417, KB955567, KB955576, KB955704, KB955759
KB955830, KB955988, KB956048, KB956072, KB956572
KB956625, KB956844, KB957218, KB957321, KB957495
KB957931, KB958071, KB958149, KB958244, KB958644
KB958817, KB958910, KB959085, KB959160, KB959206
KB959267, KB959334, KB959426, KB959465, KB959554
KB959682, KB959765, KB959873, KB960071, KB960519
KB960655, KB960680, KB960859, KB960921, KB960970
KB961067, KB961118, KB961187, KB961451, KB961503

KB961605, KB961853, KB963038, KB965220, KB967048
KB967705, KB967756, KB967760, KB968389, KB968585
KB968730, KB968764, KB969059, KB969084, KB969238
KB969262, KB969395, KB969557, KB969632, KB970048
KB970063, KB970254, KB970413, KB970430, KB970483
KB970553, KB970685, KB971029, KB971165, KB971234
KB971314, KB974318, KB971323, KB971345, KB971455
KB971513, KB971657, KB971737, KB972270, KB972422
KB972435, KB972878, KB973473, KB973502, KB973507
KB973525, KB973687, KB973815, KB973869, KB973904

KB974112, KB974266, KB974392, KB974571, KB975025
KB975467, KB975560, KB975713, KB975791, KB976323
KB977073, KB977816, KB977914, KB978338, KB978542
KB978601, KB978706, KB978835, KB979099, KB979309
KB979482, KB979687, KB981073, KB981322, KB981997
KB982132, KB982381, KB982665

KB2079403,KB2095711,KB2115168,KB2124261,KB2229593
KB2264107,KB2270406,KB2282612,KB2286198,KB2290570
KB2296011,KB2345886,KB2347290,KB2360937,KB2387149
KB2393802,KB2412687,KB2419632,KB2423089,KB2440591
KB2443105,KB2454533,KB2467659,KB2476490,KB2478960
KB2478971,KB2479943,KB2483185,KB2483614,KB2485663
KB2491683,KB2492386,KB2498072,KB2503665,KB2506212
KB2507618,KB2507938,KB2508272,KB2508429,KB2509553
KB2510581,KB2524375,KB2530548,KB2535512,KB2536276
KB2541763,KB2543367,KB2544521,KB2544893,KB2555917

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

FOR WINDOWS SERVER 2003 R2   20110713

KB915377,KB919117,KB919241,KB919709,KB922498
KB922757,KB923561,KB925066,KB925398,KB925902
KB927544,KB928646,KB929123,KB929161,KB930499
KB931301,KB931565,KB931656,KB931831,KB932039
KB932168,KB932716,KB932762,KB933230,KB933717
KB933789,KB933804,KB933854,KB934016,KB934273
KB934401,KB934719,KB934848,KB935761,KB935879
KB936087,KB936345,KB936357,KB937088,KB937193
KB937503,KB938135,KB938380,KB938596,KB938635
KB938696,KB938907,KB939383,KB939780,KB939980

KB940074,KB940307,KB940526,KB940848,KB940871
KB941084,KB941253,KB941569,KB941602,KB941838
KB942288,KB942537,KB942610,KB942831,KB943509
KB943665,KB943669,KB944043,KB944328,KB944653
KB944829,KB945166,KB945553,KB945921,KB946198
KB946459,KB946504,KB946813,KB947354,KB947848
KB948496,KB948656,KB948698,KB948700,KB948701
KB948963,KB949729,KB950037,KB950085,KB950323
KB950426,KB951347,KB951531,KB951851,KB951859
KB952069,KB952813,KB952954,KB953155,KB953176

KB953298,KB953527,KB953675,KB953955,KB954057
KB954149,KB954193,KB954913,KB955407,KB955417
KB955454,KB955536,KB955543,KB955549,KB955692
KB955704,KB956048,KB956114,KB956372,KB956438
KB956572,KB956625,KB956744,KB956826,KB956844
KB957089,KB957271,KB957390,KB957492,KB957585
KB975713,KB957910,KB957918,KB958246,KB958353
KB958376,KB958412,KB958476,KB958506,KB958910
KB958939,KB959194,KB959202,KB959398,KB959998
KB960071,KB960608,KB960680,KB960859,KB961118

KB961151,KB961515,KB961799,KB961974,KB965230
KB967048,KB967111,KB967587,KB967756,KB968185
KB968225,KB968389,KB968447,KB968451,KB968686
KB968730,KB968736,KB968995,KB969059,KB969429
KB970267,KB970413,KB970457,KB970483,KB969701
KB970904,KB970910,KB971029,KB971032,KB971080
KB971229,KB971314,KB971387,KB971513,KB971657
KB971726,KB971737,KB972071,KB972189,KB972270
KB972659,KB972840,KB972878,KB973097,KB973125
KB973295,KB973480,KB973502,KB973507,KB973540

KB973570,KB973573,KB973597,KB973618,KB973667
KB973678,KB973815,KB973869,KB973871,KB973904
KB974112,KB974318,KB974392,KB974571,KB974803
KB974857,KB974866,KB975025,KB975254,KB975470
KB975558,KB975560,KB975562,KB975652,KB975759
KB976323,KB976461,KB977073,KB977171,KB977172
KB977367,KB977440,KB977629,KB977816,KB977914
KB977938,KB978155,KB978338,KB978413,KB978542
KB978601,KB978706,KB979099,KB979272,KB979290
KB979309,KB979451,KB979457,KB979482,KB979522

KB979550,KB979554,KB979687,KB979907,KB979919
KB980276,KB980436,KB981122,KB981166,KB981194
KB981212,KB981263,KB981322,KB981544,KB982000
KB982051,KB982132,KB982438,KB982501,KB982666
KB982915,KB983169

KB2028586,KB2028587,KB2028627,KB2028773,KB2028919
KB2079403,KB2115168,KB2124261,KB2215778,KB2229593
KB2257980,KB2264107,KB2276913,KB2279637,KB2281309
KB2285736,KB2296011,KB2309312,KB2345886,KB2347290
KB2360937,KB2378111,KB2387149,KB2393802,KB2401588
KB2404563,KB2404988,KB2412687,KB2416451,KB2419635
KB2423089,KB2440591,KB2443105,KB2450944,KB2456890
KB2464091,KB2467659,KB2476490,KB2478953,KB2478971
KB2481109,KB2483185,KB2485663,KB2491683,KB2492386
KB2503665,KB2506212,KB2507618,KB2507938,KB2508272
KB2508429,KB2509553,KB2510587,KB2519231,KB2524375
KB2524426,KB2530548,KB2535512,KB2536276,KB2536720
KB2544521,KB2544893,KB2555917

KB890830

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

KB952011 支援蓝光补丁  2009/01/19        KB952013  SMARTCARD 补丁
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=63ab51ea-99c9-45c0-980a-c556746fcf05

WMP11
(2010/06/24)

KB973442

KB974905

KB954155

KB973540

KB975558

KB978695

       KB2378111



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

仅列正式补丁

NET 2.0 SP2

NDP20SP2-KB958481-x86

NDP20SP2-KB983583-x86

NDP20SP2-KB976569-x86

NDP20SP2-KB979909-x86

NDP20SP2-KB2418241-x86

NET 3.0 SP2

NDP30SP2-KB958483-x86

NDP30SP2-KB977354-v2-x86

NDP30SP2-KB982168-x86

NDP30SP2-KB962932-x86

NDP30SP2-KB982524-x86.exe

NET3.5 SP1

NDP35SP1-KB958484-x86

NDP35SP1-KB963707-x86

        NDP35SP1-KB2416473-x86


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

IE8

KB976662
        KB981332
KB2416400

KB2447568

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

KB969557
/IP PRO版    /IC 是HOME版.   VOL 不整合  /IP  /IC 之内容.

WindowsXP-KB958655-v2-x86-ENU.exe  修正 INSTALL 4.54

最新补丁资讯:

非正式补丁这里可取得蛮完整的资讯微软内部补丁(非正式发布)之取得方式(20110713)
http://kbupdate.info/

Shiva 发表于 2008-12-28 04:13 微软内部补丁(非正式发布)之取得方式(20110713)

关注了http://kbupdate.info/ 一段时间,发现更新速度比 http://www.kbalertz.com/ 快,但总会漏掉一些内容。。。。
YumeYao 发表于 2009-1-7 22:27 微软内部补丁(非正式发布)之取得方式(20110713)

1

评分人数

 

微软内部补丁(非正式发布)之取得方式(20110713)微软内部补丁(非正式发布)之取得方式(20110713)微软内部补丁(非正式发布)之取得方式(20110713)微软内部补丁(非正式发布)之取得方式(20110713)

帖子
11470 
威望
11  
完美币
668  
注册时间
2008-3-13 
2 F
微软内部补丁(非正式发布)之取得方式(20110713)发表于 2008-7-7 09:33 | 只看该作者

去非官方网站,参考英文补丁.
再找中文的,也是方法之一.

KB887606    – Microsoft XML Parser (MSXML) 不正确地使用快取的认证
KB889320-V2 – 当您停用 “ Windows 防火墙 ” 服务在 Windows XP Service Pack 2
              架构您的电脑上, Computer Browser 服务会停止在五分钟后及事件
              ID 7023 是记录在事件检视器
KB890830    – 恶意软体移除工具
KB895961    – 安装此更新可以在已安装“KB900325:Windows XP Media Center Edition 2005
              更新汇总套件 2”的 Windows XP Media Center Edition 2005
              电脑上支援 Media Center Extender。
KB898461    – 此更新会安装一份永久性“Windows 套件安装程式”的复本,让 Windows 在下载
              软体更新时不用花太久的时间。
KB909520    – “基础智慧卡密码编译服务提供者”(Base Smart Card Cryptographic Service
               Provider,Base CSP) 可让智慧卡厂商更轻松地从远端启用已安装轻量型专属
               介面卡模组 (而非完整专用 CSP) 之 Windows 上的智慧卡。
KB915800 – Hotfix 是供 IFilters 在 Windows XP 及 Windows Server 2003 Windows 桌面搜寻文件
KB917275 – 需要 Microsoft Windows Rights Management Services (RMS) 用户端,才能执行具备 Windows RMS 技术功能的应用程式。
KB922120 – 连结层拓扑探索 (LLTD) 回应程式
KB932521 – XP – based 用户端电脑在无线 Active Directory 网域中新的凭证自动注册之后使用封存的凭证来进行网路验证
KB932716 – Image Mastering API v2.0 (IMAPIv2.0) 允许 IMAPIv2 相依应用程式编制影像并烧录成 CD 和 DVD 光学储存媒体。
KB940458 – 用户端的第一个磁碟机代号不当您使用 “ 远端桌面连线来建立 Windows Server 2003-终端机伺服器
          “ 终端机服务 ” 工作阶段时,重新导向至 “ 终端机服务 ” 工作阶段
KB940648 – error message when 您试着您继续 [ 将电脑从休眠状态之后, 开启 Windows XP 的电脑上 [ 我的文件 ] 资料夹 ”
           您可能没有足够的权限能够使用这个网路资源 ”:
KB942213 – 当使用者按一下 [ 确定 ] 或 [ 取消 ] 数次以关闭 Windows Form 在 Windows Server 2003 MMC . exe 程式会随机
           变成没有回应
KB942288 – Windows Installer 4.5 Redistributable
KB943326 – 重叠的层次视窗不会显示在正确的顺序
KB943729 – 更新 XP用户端对于 VISTA 及 WIN 2008 群组权限.
KB944043 – 安装此更新以解决当 Windows Server 2008 唯读网域控制站新增至具有 Windows XP 或
           Windows Server 2003 的网路时所出现的问题。
KB944505 – DFS 用户端可能会存取位于远端站台 DFS 根目录伺服器即使此本机站台中的 DFS 根目录
           伺服器是可用在 Windows Server 2003 的网域
KB945060 – Exchangeable Image File (EXIF) 延伸中继资料平台 (XMP) 和值给在 Windows Vista 和
           Windows XP 中影像档中可能有不一致
KB945436 – 当您尝试解除安装或解除载入 Windows XP 为基础的电脑上多功能 USB 装置驱动程式
           错误讯息: “ STOP: 0 x 000000 D 1 DRIVER_IRQL_NOT_LESS_OR_EQUAL “

KB946666 – 当您使用协力厂商工具来开启一张图片, 先前已在 Windows 相片艺廊, 编辑某些中继资料栏位
           是重复、 卸除, 或损毁
KB947460 – error message when 您试着开启电脑随附的待命在 Windows XP Service Pack 2 之后, DFS
           对应资料夹 / 是无法存取: < 磁碟机代号 > ”: “
KB948046 – 用来将 Word 文件无法如预期般在您安装 Windows 欧盟扩充字型套件在 Windows XP 或
           Windows Server 2003 中列印
KB948101 – 当您重新启动 Windows XP 的电脑有安装 NVIDIA 680i 主机板无法运作 USB 键盘
KB948277 – 如果您登入到 Windows XP 的电脑可能会出现空白的桌上型电脑
KB948720 – 如果驱动程式包含 LZ – 压缩档案, 则无法在 Windows Server 2008 丛集环境中安装装置驱动程式
KB948877 – 一或多个档案在卡上从电脑是执行 Windows XP 与 SRAM PCMCIA 卡, 多个档案复制之后已经损毁
KB949033 – 当 USB 网路摄影机您连线到 Windows XP 的电脑时, 可能会遇到严重降低视讯和 Stop 错误
KB949127 – 您无法建立无线连线在 Windows XP 的用户端电脑上使用 EAP 验证如果服务组识别元 (SSID) 包含一个逗号
KB949764 – 您继续 Windows XP 的电脑从休眠状态 (S4) 之后, USB 装置无法再运作
KB949860 – 在 Windows XP-电脑上, 当您藉由执行为另一个使用者帐户,启动的应用程式时,应用程式的
           对话方块或功能表中的内容不会更新自动
KB949900 – Windows XP 为基础的电脑上安装驱动程式处理序期间, RunOnce.exe 处理序可能会停止回应
KB950162 – 在执行 Windows XP 或 Windows Vista 电脑会变成没有回应的驱动程式载入之后而会重复许多次卸载作业
KB950312 – 当您尝试在 Windows XP 的电脑上启动主控台应用程式, 例如 Cmd . exe, 错误讯息:
          “ 应用的程式无法正确地初始化 (0xc0000142) ”
KB950565 – FIX: 当您插入资料至资料表, 其中包含两个影像资料行藉由使用 SQL Server ODBC 驱动程式错误讯息
           de-referenced 不正确的定位程式 [ SQL Server ] [ Microsoft ][ ODBC SQL Server Driver ] ”: “
KB950616 – 当您执行音讯应用程式, 在执行 Windows XP 电脑上使用 Portcls.sys 档音效的应用程式, 可能会停止回应
KB950759 – 攻击者可能利用这些问题侵入执行 Microsoft Internet Explorer 的电脑并取得该电脑的控制权。
KB950760 – 已经证实 ActiveX 控制项有一些安全性问题,攻击者可能利用这些问题侵入执行 IE 的系统
KB950762 – 未经过验证的远端攻击者可能利用此问题造成受影响的系统停止回应。
KB950982 – ODBC 系统 DSN 的清单会截断超过 7,500 在 Windows XP 架构电脑上时的使用在所有 [ DSN 名称的字元总数
KB951072 – 解决许多国家因为修改日光节约时间规定所造成的问题。
KB951312 – 当您执行应用程式, Windows XP 的电脑上使用计时器伫列应用程式可能会停止回应
KB951126 – Microsoft Windows 作业系统在执行多处理器电脑停止回应在黑色画面上您继续 [ 将电脑从休眠状态后
KB951347 – 当您使用 IFaxIncomingMessageIterator 介面来查询传入的传真讯息, 在执行 Windows Server 2003
           或 Windows XP 传真伺服器上时, 就会发生记忆体遗漏 (Memory Leak)
KB951376 – 未经过验证的远端攻击者可能利用此问题侵入 Microsoft Windows 电脑并取得该电脑的控制权。
KB951531 – W32Time 服务不会不同步处理 CMOS 时钟时间至网际网路时间在 Windows XP 或 Windows Server 2003 电脑上 W32Time 服务停止之后
KB951618 – 解决已知的 Saming OneKey 资料复原软体驱动程式 Safnt.sys 所造成的应用程式相容性问题。
KB951624 – 启动 Windows XP Service Pack 2 时的一些网路为基础的应用程式初始化期间发生 – 30 秒延迟
KB951698 – Microsoft DirectShow 有一个安全性问题,攻击者可能利用此问题侵入 Windows 系统并取得该系统的控制权。
KB951709 – 事件识别码 26 当您为 Windows XP 为基础的电脑上 master 和从属 IDE 装置附加两个 IDE ATA / ATAPI 装置
KB951748 – 远端攻击者可能利用此问题伪装 Microsoft Windows 系统使用者所不知道的系统动作或行为。
KB951822 – 您接收一则错误讯息、 列印作业失败, 或部分页面列印当您试着列印至星辰印表机及 Alps
           印表机在 Windows XP
KB951978 – 解决 CScript/WScript 主机的 VBScript/JScript 指令码问题,也就是当 [地区选项] 中的
           [标准及格式] 变更时,特定内建功能无法正常运作的情况。
KB952020 – 当您试着开启纯文字时,出现错误讯息签名邮件的 Outlook 西元 2007 年在 Windows XP-电脑上:
           (的必要的安全性演算法不受支援)
KB952079 – 您无法使用备份公用程式来还原 Windows XP 的电脑上某些 – EFS 加密档案并且发生资料损毁
KB952117 – 当您尝试将 Windows XP 的电脑进入休眠或进入待命, 电脑停止回应
KB952206 – 印表机驱动程式将升级作业失败时,在同一时间升级多个印表机伫列时执行 Windows Server 2003
           或 Windows XP 印表机用户端上
KB952287 – 解决在 Windows XP SP2 或 XP SP3 的电脑上使用 Microsoft Data Access Components
           (MDAC) 元件时,发生运作失常或资料遗失的问题。
KB952825 – 在 Windows XP 架构的电脑上无法显示的连接到一个 OHCI 主机控制器 IEEE 1394-相容的储存装置
KB952909 – When you try to print a document to a PostScript printer in an application,
           the application exits unexpectedly, or you find that an invalid PDF file is created from
           the incorrect data in the PostScript file
KB953028 – 在执行 Windows Server 2003 或 Windows XP, 电脑上的应用程式发生存取违规并再损毁如果
           电脑具有四个以上 cores 或四个以上的逻辑处理器
KB953609 – Error message when you try to add a wireless network to a Windows XP-based computer
           that has hotfix 917021 applied: “At least one of your changes was not applied successfully
           to the wireless configuration”
KB953760 – 当您从 Windows XP SP3 用户端电脑终端机伺服器启用 SSO 时,系统会仍会提示使用者认证登入
           到终端机伺服器时您
KB953761 – Some DHCP Options are not recognized on a Windows XP SP3-based client computer when
           the DHCP server offer includes option 43
KB953955 – Win32_Processor 类别传回不正确的名称 ] 属性为处理器已安装 Intel 核心 2 Duo 处理器
           在 Windows XP 架构的电脑上.
           (KB946554) – Win 32 _Processor 类别针对处理器不正确的 Name 属性会传回在一部 XP 的
           电脑有安装 Intel Celeron 处理器.
KB954232 – XP 架构的电脑上的 [ 荧幕小键盘 ] 行为并无法模仿在某些案例中的实体键盘行为

KB954232 – 当您执行应用程式的时,出现错误讯息,在执行 Windows XP SP2 或 Windows XP SP3 电脑上使用
           应用程式桌面工具列 (AppBar) 元件: “ 0xC0000005 (存取违规 ”) ”
KB954543 – Web 相关应用程式可能无法正常运作安装累积安全性更新的 Internet Explorer MS08-024 (KB947864) 之后.
KB955109 – 当您执行应用程式的时,出现错误讯息,在执行 Windows XP SP2 或 Windows XP SP3 电脑上使用
           应用程式桌面工具列 (AppBar) 元件: “ 0xC0000005 (存取违规 ”) ”

english  尚无中文补丁
KB948698 – 您无法使用 Reg . exe 公用程式若要从执行 32 位元版本的 Windows Server 2003 电脑上存取 64 位元的登录机码在 64 位元电脑上
KB953546 – 列印多工缓冲处理器处理序 (Spoolsv.exe) 损毁而它正在复制,执行 Windows Server 2003 或 Windows XP 电脑上的列印驱动程式档案

C#给其他程序发消息

1、相关声明函数,SendMessage可定义两种格式。

[DllImport(“User32.DLL”, CharSet = CharSet.Auto)]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

 

[DllImport(“User32.dll”)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

 

[DllImport(“User32.DLL”)]
public static extern int SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
[DllImport(“User32.DLL”)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam);

 

[DllImport(“user32.dll”)]
public static extern IntPtr PostMessage(IntPtr hwnd, int wMsg, IntPtr wParam, string lParam);

 

2、相关消息

public const uint WM_SETTEXT = 0x000C;

public const uint WM_CHAR = 0x0102;

public const uint EM_SETSEL = 0x00B1;

 

3、
用spy++观察是哪个窗口处理消息,然后用FindWindow找到窗口句柄
IntPtr main = FindWindow(“TFrmMain”, null);


自己启动,比如记事本
Process vProcess = Process.Start(“notepad.exe”);
while (vProcess.MainWindowHandle == IntPtr.Zero) vProcess.Refresh();
注:启动之后可以直接发键值
SendKeys.Send(“01234/n”);SendKeys.Send(“56789/n”);


枚举所有进程
Process[] vP2 = Process.GetProcesses();

 

用FindWindowEx找子窗口句柄,一层层找下去。
IntPtr panel1 = FindWindowEx(main, IntPtr.Zero, “TPanel”, null);
IntPtr panel2 = FindWindowEx(panel1, IntPtr.Zero, “TPanel”, null);

 

如果有多个同类子窗口,FindWindowEx第二个参数,控制从哪个子窗口开始找何开始找。
IntPtr edit1 = FindWindowEx(panel2, (IntPtr)null, “TEdit”, null);
IntPtr edit2 = FindWindowEx(panel2, edit1, “TEdit”, null);

 

逐个发消息
SendMessage(edit1, WM_CHAR, (uint)Keys.F3, 0);

 

用循环发
string end=”hello”;
for(int i=0;i<5;i++)
  SendMessage(edit1, WM_CHAR, (uint)end[i], 0);

 

发字符串
SendMessage(vHandle, WM_SETTEXT, IntPtr.Zero, “测试/r/n换行”);

 

选中7个文本
SendMessage(vHandle, EM_SETSEL, 0, 7);

信号量Semaphore

信号量说简单点就是为了线程同步,或者说是为了限制线程能运行的数量。

那它又是怎么限制线程的数量的哩?是因为它内部有个计数器,比如你想限制最多5个线程运行,那么这个计数器的值就会被设置成5,如果一个线程调用了这个Semaphore,那么它的计数器就会相应的减1,直到这个计数器变为0。这时,如果有另一个线程继续调用这个Semaphore,那么这个线程就会被阻塞。

获得Semaphore的线程处理完它的逻辑之后,你就可以调用它的Release()函数将它的计数器重新加1,这样其它被阻塞的线程就可以得到调用了。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading;  namespace Semaphore1 {     class Program     {         //我设置一个最大允许5个线程允许的信号量         //并将它的计数器的初始值设为0         //这就是说除了调用该信号量的线程都将被阻塞         static Semaphore semaphore = new Semaphore(0, 5);          static void Main(string[] args)         {             for (int i = 1; i <= 5; i++)             {                 Thread thread = new Thread(new ParameterizedThreadStart(work));                  thread.Start(i);             }              Thread.Sleep(1000);             Console.WriteLine("Main thread over!");              //释放信号量,将初始值设回5,你可以将             //将这个函数看成你给它传的是多少值,计数器             //就会加多少回去,Release()相当于是Release(1)             semaphore.Release(5);         }          static void work(object obj)         {             semaphore.WaitOne();              Console.WriteLine("Thread {0} start!",obj);                          semaphore.Release();         }     } }

结果如下图所示,其它的线程只有等到主线程释放才会执行,因为我给信号量计数器的初始值是0,所以其它线程在主线程释放前都会被阻塞。而后,我在主线程直接用Release()函数将计数器置为5,所以5个线程可以同时得到执行。

信号量Semaphore

 

调用WebServices超时

1. 服务器端设置超时

在 web.config 的 system.web 里添加如下配置项:

< httpRuntime
executionTimeout=”300000″
/>

以上时间单位是微秒.

记得要把 web.config 的 debug 模式关闭:

< compilation 
defaultLanguage=”c#”
debug=”false”
/>

2. 客户端设置超时

在 WebService 的客户端代理程序(用 wsdl.exe 生成)里设置 Request 超时时间, 单位是毫秒:
protected override WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest wr = (HttpWebRequest)base.GetWebRequest( uri );
wr.Timeout = 30*1000;
return wr;
}

 
 

字符串分割–java中String.split()用法

在java.lang包中有String.split()方法,返回是一个数组。
  1、“.”和“|”都是转义字符,必须得加”//”;
  如果用“.”作为分隔的话,必须是如下写法:
String.split(“//.”),这样才能正确的分隔开,不能用String.split(“.”);
    如果用“|”作为分隔的话,必须是如下写法:
String.split(“//|”),这样才能正确的分隔开,不能用String.split(“|”);

  2、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“acount=? and uu =? or n=?”,把三个都分隔出来,可以用
  String.split(“and|or”);

  3、public String[] split(String regex,int limit)根据匹配给定的正则表达式来拆分此字符串。
  此方法返回的数组包含此字符串的每个子字符串,这些子字符串由另一个匹配给定的表达式的子字符串终止或由字符串结束来终止。数组中
  的子字符串按它们在此字符串中的顺序排列。如果表达式不匹配输入的任何部分,则结果数组只具有一个元素,即此字符串。

  4、public string[] split(string regex)
  这里的参数的名称是 regex ,也就是 regular expression (正则表达式)。这个参数并不是一个简单的分割用的字符,而是一个正则表达式,
他对一些特殊的字符可能会出现你预想不到的结果,比如测试下面的代码:

(1) 用竖线 | 分隔字符串,你将得不到预期的结果

String[] aa =“aaa|bbb|ccc”.split(“|”); 
//String[] aa = “aaa|bbb|ccc”.split(“//|”); 这样才能得到正确的结果 
for(int i =0; i <aa.length ; i++){ 
System.out.println(“–“+aa); 
}

(2)用竖 * 分隔字符串运行将抛出java.util.regex.PatternSyntaxException异常,用加号 + 也是如此。

String[] aa =“aaa*bbb*ccc”.split(“*”); 
//String[] aa = “aaa|bbb|ccc”.split(“//*”); 这样才能得到正确的结果    
for(int i =0; i <aa.length ; i++){ 
System.out.println(“–“+aa); 
}

(3)显然,+ * 不是有效的模式匹配规则表达式,用”//*” “//+”转义后即可得到正确的结果。 
(4) “|” 分隔串时虽然能够执行,但是却不是预期的目的,”//|”转义后即可得到正确的结果。 
(5)还有如果想在串中使用””字符,则也需要转义.首先要表达”aaaa/bbbb”这个串就应该用”aaaa//bbbb”,如果要分隔就应该这样才能得到正确结果: 
String[] aa = “aaa//bbb//bccc”.split(////); 
(6) 还有就是点号”.”,也要首先转义才能得到正确的结果。

第一种方法:

string s=“abcdeabcdeabcde”;
string[] sArray=s.Split(‘c’);
foreach(string i in sArray)Console.WriteLine(i.ToString());

输出下面的结果:
 ab
deab
deab
de

第二种方法:
我们看到了结果是以一个指定的字符进行的分割。使用另一种构造方法对多个字符进行分割:

string s=“abcdeabcdeabcde”;
string[] sArray1=s.Split(newchar[3]{‘c’,‘d’,‘e’});
foreach(string i in sArray1)Console.WriteLine(i.ToString());

可以输出下面的结果:
ab
ab
ab

第三种方法:
除了以上的这两种方法以外,第三种方法是使用正则表达式。新建一个控制台项目。
然后先添加 using System.Text.RegularExpressions;

using  System.Text.RegularExpressions
string content=agcsmallmacsmallgggsmallytx;
string[] resultString=Regex.Split(content,small,RegexOptions.IgnoreCase)
foreach(string i in resultString)
     Console.WriteLine(i.ToString());

输出下面的结果:
agc
 mac
 ggg
ytx

第四种方法:

 string str1=“我*****是*****一*****个*****教*****师”;
string[] str2; str1=str1.Replace(“*****”,“*”);
str2=str1.Split(’*‘);foreach(string i in str2)
Console.WriteLine(i.ToString());

第五种方法:
string str1=”我**是*****一*****个*****教*****师“;
我希望显示的结果为:我是一个教师。 我如果采用上面的第四种方法来做就会产生下面的错误:我 是一个教师。中间有空格输出,所以输出结果并不是希望的结果,这就又回到了正则表达式了,这时可以采用下面的第五种方法:

string str1=‘我**是*****一*****个*****教*****师“;
string[] str2 =System.Text.RegularExpressions.Regex.Split(str1,@[*]+);
foreach(string i in str2)
Console.WriteLine(i.ToString());

这里通过[*]+ 巧妙的完成了我们的目标。

how to deactivate the direct3d screen on vlc player

question:

As the Direct3D is a little unstable and complicated, I want to deactivate it. Can anyone tell me how to deactivate the Direct3D screen on vlc player? Thanks in advance.

 

answer:

In the Tools menu, go to Preferences. Click the Video item on the side bar, then where it says Output, switch it to DirectX (DirectDraw) video output. This will tell VLC not to use Direct3D and to use the older DirectDraw output mode instead.

I hope this helps.

Answered Oct, 19 2010

There is a question that is similar with yours. May be it can help.

http://forums.techarena.in/windows-software/1364384.htm

sql server 字符串转成日期格式

SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的。本文我们主要就介绍一下SQL Server日期时间转字符串的相关知识,接下来就让我们一起来了解一下这部分内容。

字符串转日期时间:

convert(datetime,列名)

日期时间转字符串:

  1. Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM   
  2. Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06   
  3. Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16   
  4. Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06   
  5. Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06   
  6. Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06   
  7. Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06   
  8. Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06   
  9. Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46   
  10. Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM   
  11. Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06   
  12. Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16   
  13. Select CONVERT(varchar(100), GETDATE(), 12): 060516   
  14. Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937   
  15. Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967   
  16. Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47   
  17. Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157   
  18. Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM   
  19. Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16   
  20. Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47   
  21. Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250   
  22. Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM   
  23. Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006   
  24. Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16   
  25. Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006   
  26. Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006   
  27. Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006   
  28. Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006   
  29. Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006   
  30. Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49   
  31. Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM   
  32. Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006   
  33. Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16   
  34. Select CONVERT(varchar(100), GETDATE(), 112): 20060516   
  35. Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513   
  36. Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547   
  37. Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49   
  38. Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700   
  39. Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827   
  40. Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM  

在SQL数据库中,有一类函数是不得不提的,那就是SQL Server日期时间函数,这是SQL Server处理日期和时间最常用的函数,下面就将为介绍这类函数。

Sql Server日期与时间函数:

1.  当前系统日期、时间 

select getdate() 

2. dateadd  在向指定日期加上一段时间的基础上,返回新的 datetime 值

例如:向日期加上2天 

select dateadd(day,2,’2004-10-15′)  –返回:2004-10-17 00:00:00.000

3. datediff 返回跨两个指定日期的日期和时间边界数。

select datediff(day,’2004-09-01′,’2004-09-18′)   –返回:17

4. datepart 返回代表指定日期的指定日期部分的整数。

SELECT DATEPART(month, ‘2004-10-15′)  –返回 10

5. datename 返回代表指定日期的指定日期部分的字符串

SELECT datename(weekday, ‘2004-10-15′)  –返回:星期五

6. day(), month(),year() –可以与datepart对照一下

select 当前日期=convert(varchar(10),getdate(),120) ,当前时间=convert(varchar(8),getdate(),114)

select datename(dw,’2004-10-15′)

select 本年第多少周=datename(week,’2004-10-15′),今天是周几=datename(weekday,’2004-10-15′)

SQL Server日期函数     参数/功能

GetDate( )    返回系统目前的日期与时间

DateDiff (interval,date1,date2)   以interval 指定的方式,返回date2 与date1两个日期之间的差值 date2-date1

DateAdd (interval,number,date)   以interval指定的方式,加上number之后的日期

DatePart (interval,date)    返回日期date中,interval指定部分所对应的整数值

DateName (interval,date)   返回日期date中,interval指定部分所对应的字符串名称

参数interval的设定值如下:

值缩写(Sql Server) (Access 和 ASP) 说明

Year Yy yyyy 年 1753 ~ 9999

Quarter Qq q   季 1 ~ 4

Month Mm m   月1 ~ 12

Day of year Dy y  一年的日数,一年中的第几日 1-366

Day Dd d   日,1-31

Weekday Dw w 一周的日数,一周中的第几日 1-7

Week Wk ww  周,一年中的第几周 0 ~ 51

Hour Hh h   时0 ~ 23

Minute Mi n  分钟0 ~ 59

Second Ss s 秒 0 ~ 59

Millisecond Ms – 毫秒 0 ~ 999

Access 和Asp中用date()和now()取得系统日期时间;其中DateDiff,DateAdd,DatePart也同是能用于Access和asp中,这些函数的用法也类似。

SQL Server日期函数举例:

1.GetDate() 用于sql server :select GetDate()

2.DateDiff(‘s’,’2005-07-20′,’2005-7-25 22:56:32′)返回值为 514592 秒

DateDiff(‘d’,’2005-07-20′,’2005-7-25 22:56:32′)返回值为 5 天

3.DatePart(‘w’,’2005-7-25 22:56:32′)返回值为 2 即星期一(周日为1,周六为7)

DatePart(‘d’,’2005-7-25 22:56:32′)返回值为 25即25号

DatePart(‘y’,’2005-7-25 22:56:32′)返回值为 206即这一年中第206天

DatePart(‘yyyy’,’2005-7-25 22:56:32′)返回值为 2005即2005年

关于SQL Server日期时间格式转换字符串的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!

JAVA上加密算法的实现用例

来源:www.ibm.com
关于作者王辉 ddxxkk@21cn.com
王辉,具有八年的编程及系统管理经验,所使用的语言为C和Java 编程语言。目前在深圳一家公司做程序员,使用C和JAVA为DB2数据库编程.可通过 ddxxkk@21cn.com 联系。 

第1章 基础知识

 
1.1. 单钥密码体制 
  单钥密码体制是一种传统的加密算法,是指信息的发送方和接收方共同使用同一把密钥进行加解密。
  通常,使用的加密算法 比较简便高效,密钥简短,加解密速度快,破译极其困难。但是加密的安全性依靠密钥保管的安全性,在公开的计算机网络上安全地传送和保管密钥是一个严峻的问 题,并且如果在多用户的情况下密钥的保管安全性也是一个问题。
  单钥密码体制的代表是美国的DES

 1.2. 消息摘要 
  一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。
  消息摘要有两个基本属性: 
  两个不同的报文难以生成相同的摘要 
  难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要
  代表:美国国家标准技术研究所的SHA1和麻省理工学院Ronald Rivest提出的MD5

 1.3. Diffie-Hellman密钥一致协议 
  密钥一致协议是由公开密钥密码体制的奠基人Diffie和Hellman所提出的一种思想。
  先决条件,允许两名用户在公开媒体上交换信息以生成”一致”的,可以共享的密钥
  代表:指数密钥一致协议(Exponential Key Agreement Protocol)

 1.4. 非对称算法与公钥体系 
  1976年,Dittie和Hellman为解决密钥管理问题,在他们的奠基性的工作”密码学的新方向”一文中,提出一种密钥交换协议,允许在不安全的媒 体上通过通讯双方交换信息,安全地传送秘密密钥。在此新思想的基础上,很快出现了非对称密钥密码体制,即公钥密码体制。在公钥体制中,加密密钥不同于解密 密钥,加密密钥公之于众,谁都可以使用;解密密钥只有解密人自己知道。它们分别称为公开密钥(Public key)和秘密密钥(Private key)。 
  迄今为止的所有公钥密码体系中,RSA系统是最著名、最多使用的一种。RSA公开密钥密码系统是由R.Rivest、A.Shamir和 L.Adleman俊教授于1977年提出的。RSA的取名就是来自于这三位发明者的姓的第一个字母

 1.5. 数字签名 
  所谓数字签名就是信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖 性),同时也确保信息报文在经签名后末被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。  
  在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH函数)生成的,对这些HASH函数的特殊要求是: 

  接受的输入报文数据没有长度限制; 
  对任何输入报文数据生成固定长度的摘要(数字指纹)输出 
  从报文能方便地算出摘要; 
  难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要; 
  两个不同的报文难以生成相同的摘要
  代表:DSA

第2章 在JAVA中的实现

 2.1. 相关 
  Diffie-Hellman密钥一致协议和DES程序需要JCE工具库的支持,可以到 http://java.sun.com/security/index.html 下载JCE,并进行安装。简易安装把 jce1.2.1lib 下的所有内容复制到 %java_home%libext下,如果没有ext目录自行建立,再把jce1_2_1.jar和sunjce_provider.jar添加到 CLASSPATH内,更详细说明请看相应用户手册

 2.2. 消息摘要MD5和SHA的使用 
 
使用方法:
  首先用生成一个MessageDigest类,确定计算方法
  java.security.MessageDigest alga=java.security.MessageDigest.getInstance(“SHA-1″);

  添加要进行计算摘要的信息

alga.update(myinfo.getBytes());

  计算出摘要

byte[] digesta=alga.digest();

  发送给其他人你的信息和摘要

其他人用相同的方法初始化,添加信息,最后进行比较摘要是否相同

algb.isEqual(digesta,algb.digest())

  相关AIP

java.security.MessageDigest 类

static getInstance(String algorithm)

返回一个MessageDigest对象,它实现指定的算法

  参数:算法名,如 SHA-1 或MD5

void update (byte input)

void update (byte[] input)

void update(byte[] input, int offset, int len)

  添加要进行计算摘要的信息

byte[] digest()

  完成计算,返回计算得到的摘要(对于MD5是16位,SHA是20位)

void reset()

  复位

static boolean isEqual(byte[] digesta, byte[] digestb)

比效两个摘要是否相同

代码: 
import java.security.*;
public class myDigest {
public static void main(String[] args) {

myDigest my=new myDigest();
my.testDigest();

}
public void testDigest()
{
try {
String myinfo=”我的测试信息”;

//java.security.MessageDigest alg=java.security.MessageDigest.getInstance(“MD5″);
java.security.MessageDigest alga=java.security.MessageDigest.getInstance(“SHA-1″);
alga.update(myinfo.getBytes());
byte[] digesta=alga.digest();
System.out.println(“本信息摘要是:”+byte2hex(digesta));
//通过某中方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常
java.security.MessageDigest algb=java.security.MessageDigest.getInstance(“SHA-1″);
algb.update(myinfo.getBytes());
if (algb.isEqual(digesta,algb.digest())) {
System.out.println(“信息检查正常”);
}
else
{
System.out.println(“摘要不相同”);
}

}
catch (java.security.NoSuchAlgorithmException ex) {
System.out.println(“非法摘要算法”);
}

}
public String byte2hex(byte[] b) //二行制转字符串
{
String hs=””;
String stmp=””;
for (int n=0;n {
stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length()==1) hs=hs+”0″+stmp;
else hs=hs+stmp;
if (n }
return hs.toUpperCase();
}

}

2.3. 数字签名DSA

对于一个用户来讲首先要生成他的密钥对,并且分别保存 
生成一个KeyPairGenerator实例 
java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance(“DSA”);
如果设定随机产生器就用如相代码初始化
SecureRandom secrand=new SecureRandom(); 

secrand.setSeed(“tttt”.getBytes()); //初始化随机产生器
keygen.initialize(512,secrand); //初始化密钥生成器
否则
keygen.initialize(512);
生成密钥公钥pubkey和私钥prikey
KeyPair keys=keygen.generateKeyPair(); //生成密钥组
PublicKey pubkey=keys.getPublic();
PrivateKey prikey=keys.getPrivate();
分别保存在myprikey.dat和mypubkey.dat中,以便下次不在生成
(生成密钥对的时间比较长
java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream(“myprikey.dat”));
out.writeObject(prikey);
out.close();
out=new java.io.ObjectOutputStream(new java.io.FileOutputStream(“mypubkey.dat”));
out.writeObject(pubkey);
out.close();

用他私人密钥(prikey)对他所确认的信息(info)进行数字签名产生一个签名数组 
  从文件中读入私人密钥(prikey) 
java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream(“myprikey.dat”));
PrivateKey myprikey=(PrivateKey)in.readObject();
in.close();
  初始一个Signature对象,并用私钥对信息签名
java.security.Signature signet=java.security.Signature.getInstance(“DSA”);
signet.initSign(myprikey);
signet.update(myinfo.getBytes());
byte[] signed=signet.sign();
  把信息和签名保存在一个文件中(myinfo.dat)
java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream(“myinfo.dat”));
out.writeObject(myinfo);
out.writeObject(signed);
out.close();
  把他的公钥的信息及签名发给其它用户

其他用户用他的公共密钥(pubkey)和签名(signed)和信息(info)进行验证是否由他签名的信息 
  读入公钥
java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream(“mypubkey.dat”)); 
PublicKey pubkey=(PublicKey)in.readObject(); 
in.close();

  读入签名和信息
in=new java.io.ObjectInputStream(new java.io.FileInputStream(“myinfo.dat”)); 
String info=(String)in.readObject(); 
byte[] signed=(byte[])in.readObject(); 
in.close();

  初始一个Signature对象,并用公钥和签名进行验证
java.security.Signature signetcheck=java.security.Signature.getInstance(“DSA”); 
signetcheck.initVerify(pubkey); 
signetcheck.update(info.getBytes()); 
if (signetcheck.verify(signed)) { System.out.println(“签名正常”);}

  对于密钥的保存本文是用对象流的方式保存和传送的,也可可以用编码的方式保存.注意要
import java.security.spec.* 
import java.security.*

具休说明如下

public key是用X.509编码的,例码如下: 
byte[] bobEncodedPubKey=mypublic.getEncoded(); //生成编码
//传送二进制编码
//以下代码转换编码为相应key对象
X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey);
KeyFactory keyFactory = KeyFactory.getInstance(“DSA”);
PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec);

对于Private key是用PKCS#8编码,例码如下: 
byte[] bPKCS=myprikey.getEncoded();
//传送二进制编码
//以下代码转换编码为相应key对象
PKCS8EncodedKeySpec priPKCS8=new PKCS8EncodedKeySpec(bPKCS);
KeyFactory keyf=KeyFactory.getInstance(“DSA”);
PrivateKey otherprikey=keyf.generatePrivate(priPKCS8);

  常用API 
java.security.KeyPairGenerator 密钥生成器类 
public static KeyPairGenerator getInstance(String algorithm) throws NoSuchAlgorithmException 
以指定的算法返回一个KeyPairGenerator 对象 
参数: algorithm 算法名.如:”DSA”,”RSA”

public void initialize(int keysize)

以指定的长度初始化KeyPairGenerator对象,如果没有初始化系统以1024长度默认设置

参数:keysize 算法位长.其范围必须在 512 到 1024 之间,且必须为 64 的倍数

public void initialize(int keysize, SecureRandom random)
以指定的长度初始化和随机发生器初始化KeyPairGenerator对象
参数:keysize 算法位长.其范围必须在 512 到 1024 之间,且必须为 64 的倍数
random 一个随机位的来源(对于initialize(int keysize)使用了默认随机器

public abstract KeyPair generateKeyPair()
产生新密钥对

java.security.KeyPair 密钥对类
public PrivateKey getPrivate()
返回私钥

public PublicKey getPublic()
返回公钥

java.security.Signature 签名类
public static Signature getInstance(String algorithm) throws NoSuchAlgorithmException
返回一个指定算法的Signature对象
参数 algorithm 如:”DSA”

public final void initSign(PrivateKey privateKey)
throws InvalidKeyException
用指定的私钥初始化
参数rivateKey 所进行签名时用的私钥

public final void update(byte data)
throws SignatureException
public final void update(byte[] data)
throws SignatureException
public final void update(byte[] data, int off, int len)
throws SignatureException 

添加要签名的信息

public final byte[] sign()
throws SignatureException
返回签名的数组,前提是initSign和update

public final void initVerify(PublicKey publicKey)
throws InvalidKeyException
用指定的公钥初始化
参数ublicKey 验证时用的公钥

public final boolean verify(byte[] signature)
throws SignatureException
验证签名是否有效,前提是已经initVerify初始化
参数: signature 签名数组 
*/
import java.security.*;
import java.security.spec.*;
public class testdsa {
public static void main(String[] args) throws java.security.NoSuchAlgorithmException,java.lang.Exception {
testdsa my=new testdsa();
my.run();
}
public void run()
{

//数字签名生成密钥
//第一步生成密钥对,如果已经生成过,本过程就可以跳过,对用户来讲myprikey.dat要保存在本地
//而mypubkey.dat给发布给其它用户
if ((new java.io.File(“myprikey.dat”)).exists()==false) {
if (generatekey()==false) {
System.out.println(“生成密钥对败”);
return;
};
}
//第二步,此用户
//从文件中读入私钥,对一个字符串进行签名后保存在一个文件(myinfo.dat)中
//并且再把myinfo.dat发送出去
//为了方便数字签名也放进了myifno.dat文件中,当然也可分别发送
try {
java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream(“myprikey.dat”));
PrivateKey myprikey=(PrivateKey)in.readObject();
in.close();

// java.security.spec.X509EncodedKeySpec pubX509=new java.security.spec.X509EncodedKeySpec(bX509);

//java.security.spec.X509EncodedKeySpec pubkeyEncode=java.security.spec.X509EncodedKeySpec
String myinfo=”这是我的信息”; //要签名的信息
//用私钥对信息生成数字签名
java.security.Signature signet=java.security.Signature.getInstance(“DSA”);
signet.initSign(myprikey);
signet.update(myinfo.getBytes());
byte[] signed=signet.sign(); //对信息的数字签名
System.out.println(“signed(签名内容)=”+byte2hex(signed));
//把信息和数字签名保存在一个文件中
java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream(“myinfo.dat”));
out.writeObject(myinfo);
out.writeObject(signed);
out.close();
System.out.println(“签名并生成文件成功”);
}
catch (java.lang.Exception e) {
e.printStackTrace();
System.out.println(“签名并生成文件失败”);
};

//第三步
//其他人通过公共方式得到此户的公钥和文件
//其他人用此户的公钥,对文件进行检查,如果成功说明是此用户发布的信息.
//
try {

java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream(“mypubkey.dat”));
PublicKey pubkey=(PublicKey)in.readObject();
in.close();
System.out.println(pubkey.getFormat());

in=new java.io.ObjectInputStream(new java.io.FileInputStream(“myinfo.dat”));
String info=(String)in.readObject();
byte[] signed=(byte[])in.readObject();
in.close();

java.security.Signature signetcheck=java.security.Signature.getInstance(“DSA”);
signetcheck.initVerify(pubkey);
signetcheck.update(info.getBytes());
if (signetcheck.verify(signed)) {
System.out.println(“info=”+info);
System.out.println(“签名正常”);
}
else System.out.println(“非签名正常”);
}
catch (java.lang.Exception e) {e.printStackTrace();};

}

//生成一对文件myprikey.dat和mypubkey.dat—私钥和公钥,
//公钥要用户发送(文件,网络等方法)给其它用户,私钥保存在本地
public boolean generatekey()
{
try {
java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance(“DSA”);
// SecureRandom secrand=new SecureRandom();
// secrand.setSeed(“tttt”.getBytes()); //初始化随机产生器
// keygen.initialize(576,secrand); //初始化密钥生成器
keygen.initialize(512);
KeyPair keys=keygen.genKeyPair();
// KeyPair keys=keygen.generateKeyPair(); //生成密钥组
PublicKey pubkey=keys.getPublic();
PrivateKey prikey=keys.getPrivate();

java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream(“myprikey.dat”));
out.writeObject(prikey);
out.close();
System.out.println(“写入对象 prikeys ok”);
out=new java.io.ObjectOutputStream(new java.io.FileOutputStream(“mypubkey.dat”));
out.writeObject(pubkey);
out.close();
System.out.println(“写入对象 pubkeys ok”);
System.out.println(“生成密钥对成功”);
return true;
}
catch (java.lang.Exception e) {
e.printStackTrace();
System.out.println(“生成密钥对失败”);

return false;
};

}

public String byte2hex(byte[] b)
{
String hs=””;
String stmp=””;
for (int n=0;n {
stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length()==1) hs=hs+”0″+stmp;
else hs=hs+stmp;
if (n }
return hs.toUpperCase();
}

}

 2.4. DESede/DES对称算法  
  首先生成密钥,并保存(这里并没的保存的代码,可参考DSA中的方法)

KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);

SecretKey deskey = keygen.generateKey();

用密钥加密明文(myinfo),生成密文(cipherByte)

Cipher c1 = Cipher.getInstance(Algorithm);

c1.init(Cipher.ENCRYPT_MODE,deskey);

byte[] cipherByte=c1.doFinal(myinfo.getBytes());

传送密文和密钥,本文没有相应代码可参考DSA

………….

  用密钥解密密文

c1 = Cipher.getInstance(Algorithm);

c1.init(Cipher.DECRYPT_MODE,deskey);

byte[] clearByte=c1.doFinal(cipherByte);

相对来说对称密钥的使用是很简单的,对于JCE来讲支技DES,DESede,Blowfish三种加密术

对于密钥的保存各传送可使用对象流或者用二进制编码,相关参考代码如下 
SecretKey deskey = keygen.generateKey();
byte[] desEncode=deskey.getEncoded();
javax.crypto.spec.SecretKeySpec destmp=new javax.crypto.spec.SecretKeySpec(desEncode,Algorithm);
SecretKey mydeskey=destmp;

  相关API

KeyGenerator 在DSA中已经说明,在添加JCE后在instance进可以如下参数

DES,DESede,Blowfish,HmacMD5,HmacSHA1

javax.crypto.Cipher 加/解密器 public static final Cipher getInstance(java.lang.String transformation)
throws java.security.NoSuchAlgorithmException,
NoSuchPaddingException
返回一个指定方法的Cipher对象

参数:transformation 方法名(可用 DES,DESede,Blowfish)

public final void init(int opmode, java.security.Key key)
throws java.security.InvalidKeyException

用指定的密钥和模式初始化Cipher对象

参数pmode 方式(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)

  key 密钥

public final byte[] doFinal(byte[] input)
throws java.lang.IllegalStateException,
IllegalBlockSizeException,
BadPaddingException

对input内的串,进行编码处理,返回处理后二进制串,是返回解密文还是加解文由init时的opmode决定

注意:本方法的执行前如果有update,是对updat和本次input全部处理,否则是本inout的内容

/*
安全程序 DESede/DES测试
*/
import java.security.*;
import javax.crypto.*;
public class testdes {
public static void main(String[] args){
testdes my=new testdes();
my.run();
}
public void run() {
//添加新安全算法,如果用JCE就要把它添加进去
Security.addProvider(new com.sun.crypto.provider.SunJCE());
String Algorithm=”DES”; //定义 加密算法,可用 DES,DESede,Blowfish
String myinfo=”要加密的信息”;
try {
//生成密钥
KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);
SecretKey deskey = keygen.generateKey();

//加密
System.out.println(“加密前的二进串:”+byte2hex(myinfo.getBytes()));
System.out.println(“加密前的信息:”+myinfo);
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE,deskey);
byte[] cipherByte=c1.doFinal(myinfo.getBytes());
System.out.println(“加密后的二进串:”+byte2hex(cipherByte));
//解密
c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE,deskey);
byte[] clearByte=c1.doFinal(cipherByte);
System.out.println(“解密后的二进串:”+byte2hex(clearByte));
System.out.println(“解密后的信息:”+(new String(clearByte)));

}
catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();}
catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();}
catch (java.lang.Exception e3) {e3.printStackTrace();}
}
public String byte2hex(byte[] b) //二行制转字符串
{
String hs=””;
String stmp=””;
for (int n=0;n {
stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length()==1) hs=hs+”0″+stmp;
else hs=hs+stmp;
if (n }
return hs.toUpperCase();
}

}

 2.5. Diffie-Hellman密钥一致协议 
  公开密钥密码体制的奠基人Diffie和Hellman所提出的 “指数密钥一致协议”(Exponential Key Agreement Protocol),该协议不要求别的安全性 先决条件,允许两名用户在公开媒体上交换信息以生成”一致”的,可以共享的密钥。在JCE的中实现用户alice生成DH类型的密钥对,如果长度用 1024生成的时间请,推荐第一次生成后保存DHParameterSpec,以便下次使用直接初始化.使其速度加快 

System.out.println(“ALICE: 产生 DH 对 …”);
KeyPairGenerator aliceKpairGen = KeyPairGenerator.getInstance(“DH”);
aliceKpairGen.initialize(512);
KeyPair aliceKpair = aliceKpairGen.generateKeyPair();

alice生成公钥发送组bob byte[] alicePubKeyEnc = aliceKpair.getPublic().getEncoded();

bob从alice发送来的公钥中读出DH密钥对的初始参数生成bob的DH密钥对

注意这一步一定要做,要保证每个用户用相同的初始参数生成的 
DHParameterSpec dhParamSpec = ((DHPublicKey)alicePubKey).getParams();
KeyPairGenerator bobKpairGen = KeyPairGenerator.getInstance(“DH”);
bobKpairGen.initialize(dhParamSpec);
KeyPair bobKpair = bobKpairGen.generateKeyPair();

  bob根据alice的公钥生成本地的DES密钥
KeyAgreement bobKeyAgree = KeyAgreement.getInstance(“DH”);
bobKeyAgree.init(bobKpair.getPrivate());
bobKeyAgree.doPhase(alicePubKey, true);
SecretKey bobDesKey = bobKeyAgree.generateSecret(“DES”);

bob已经生成了他的DES密钥,他现把他的公钥发给alice,
byte[] bobPubKeyEnc = bobKpair.getPublic().getEncoded();

  alice根据bob的公钥生成本地的DES密钥
,,,,,,解码
KeyAgreement aliceKeyAgree = KeyAgreement.getInstance(“DH”);
aliceKeyAgree.init(aliceKpair.getPrivate());
aliceKeyAgree.doPhase(bobPubKey, true);
SecretKey aliceDesKey = aliceKeyAgree.generateSecret(“DES”);

bob和alice能过这个过程就生成了相同的DES密钥,在这种基础就可进行安全能信

  常用API

java.security.KeyPairGenerator 密钥生成器类
public static KeyPairGenerator getInstance(String algorithm)
throws NoSuchAlgorithmException
以指定的算法返回一个KeyPairGenerator 对象
参数: algorithm 算法名.如:原来是DSA,现在添加了 DiffieHellman(DH)

public void initialize(int keysize)
以指定的长度初始化KeyPairGenerator对象,如果没有初始化系统以1024长度默认设置
参数:keysize 算法位长.其范围必须在 512 到 1024 之间,且必须为 64 的倍数
注意:如果用1024生长的时间很长,最好生成一次后就保存,下次就不用生成了

public void initialize(AlgorithmParameterSpec params)
throws InvalidAlgorithmParameterException
以指定参数初始化

javax.crypto.interfaces.DHPublicKey
public DHParameterSpec getParams()
返回
java.security.KeyFactory

public static KeyFactory getInstance(String algorithm)
throws NoSuchAlgorithmException
以指定的算法返回一个KeyFactory
参数: algorithm 算法名SH,DH

public final PublicKey generatePublic(KeySpec keySpec)
throws InvalidKeySpecException
根据指定的key说明,返回一个PublicKey对象

java.security.spec.X509EncodedKeySpec
public X509EncodedKeySpec(byte[] encodedKey)
根据指定的二进制编码的字串生成一个key的说明
参数:encodedKey 二进制编码的字串(一般能过PublicKey.getEncoded()生成)
javax.crypto.KeyAgreement 密码一至类

public static final KeyAgreement getInstance(java.lang.String algorithm)
throws java.security.NoSuchAlgorithmException
返回一个指定算法的KeyAgreement对象
参数:algorithm 算法名,现在只能是DiffieHellman(DH)

public final void init(java.security.Key key)
throws java.security.InvalidKeyException
用指定的私钥初始化
参数:key 一个私钥

public final java.security.Key doPhase(java.security.Key key,
boolean lastPhase)
throws java.security.InvalidKeyException,
java.lang.IllegalStateException
用指定的公钥进行定位,lastPhase确定这是否是最后一个公钥,对于两个用户的
情况下就可以多次定次,最后确定
参数:key 公钥
lastPhase 是否最后公钥

public final SecretKey generateSecret(java.lang.String algorithm)
throws java.lang.IllegalStateException,
java.security.NoSuchAlgorithmException,
java.security.InvalidKeyException
根据指定的算法生成密钥
参数:algorithm 加密算法(可用 DES,DESede,Blowfish)

*/
import java.io.*;
import java.math.BigInteger;
import java.security.*;
import java.security.spec.*;
import java.security.interfaces.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.crypto.interfaces.*;
import com.sun.crypto.provider.SunJCE;

public class testDHKey {

public static void main(String argv[]) {
try {
testDHKey my= new testDHKey();
my.run();
} catch (Exception e) {
System.err.println(e);

}
}

private void run() throws Exception {
Security.addProvider(new com.sun.crypto.provider.SunJCE());

System.out.println(“ALICE: 产生 DH 对 …”);
KeyPairGenerator aliceKpairGen = KeyPairGenerator.getInstance(“DH”);
aliceKpairGen.initialize(512);
KeyPair aliceKpair = aliceKpairGen.generateKeyPair(); //生成时间长 

// 张三(Alice)生成公共密钥 alicePubKeyEnc 并发送给李四(Bob) ,
//比如用文件方式,socket…..
byte[] alicePubKeyEnc = aliceKpair.getPublic().getEncoded();

//bob接收到alice的编码后的公钥,将其解码
KeyFactory bobKeyFac = KeyFactory.getInstance(“DH”);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec (alicePubKeyEnc);
PublicKey alicePubKey = bobKeyFac.generatePublic(x509KeySpec);
System.out.println(“alice公钥bob解码成功”);
// bob必须用相同的参数初始化的他的DH KEY对,所以要从Alice发给他的公开密钥,
//中读出参数,再用这个参数初始化他的 DH key对

//从alicePubKye中取alice初始化时用的参数
DHParameterSpec dhParamSpec = ((DHPublicKey)alicePubKey).getParams();
KeyPairGenerator bobKpairGen = KeyPairGenerator.getInstance(“DH”);
bobKpairGen.initialize(dhParamSpec);
KeyPair bobKpair = bobKpairGen.generateKeyPair();
System.out.println(“BOB: 生成 DH key 对成功”);
KeyAgreement bobKeyAgree = KeyAgreement.getInstance(“DH”);
bobKeyAgree.init(bobKpair.getPrivate());
System.out.println(“BOB: 初始化本地key成功”);
//李四(bob) 生成本地的密钥 bobDesKey
bobKeyAgree.doPhase(alicePubKey, true);
SecretKey bobDesKey = bobKeyAgree.generateSecret(“DES”);
System.out.println(“BOB: 用alice的公钥定位本地key,生成本地DES密钥成功”);
// Bob生成公共密钥 bobPubKeyEnc 并发送给Alice,
//比如用文件方式,socket…..,使其生成本地密钥
byte[] bobPubKeyEnc = bobKpair.getPublic().getEncoded();
System.out.println(“BOB向ALICE发送公钥”);

// alice接收到 bobPubKeyEnc后生成bobPubKey
// 再进行定位,使aliceKeyAgree定位在bobPubKey
KeyFactory aliceKeyFac = KeyFactory.getInstance(“DH”);
x509KeySpec = new X509EncodedKeySpec(bobPubKeyEnc);
PublicKey bobPubKey = aliceKeyFac.generatePublic(x509KeySpec);
System.out.println(“ALICE接收BOB公钥并解码成功”);
;
KeyAgreement aliceKeyAgree = KeyAgreement.getInstance(“DH”);
aliceKeyAgree.init(aliceKpair.getPrivate());
System.out.println(“ALICE: 初始化本地key成功”);

aliceKeyAgree.doPhase(bobPubKey, true);
// 张三(alice) 生成本地的密钥 aliceDesKey
SecretKey aliceDesKey = aliceKeyAgree.generateSecret(“DES”);
System.out.println(“ALICE: 用bob的公钥定位本地key,并生成本地DES密钥”);

if (aliceDesKey.equals(bobDesKey)) System.out.println(“张三和李四的密钥相同”);
//现在张三和李四的本地的deskey是相同的所以,完全可以进行发送加密,接收后解密,达到
//安全通道的的目的

/*
* bob用bobDesKey密钥加密信息
*/
Cipher bobCipher = Cipher.getInstance(“DES”);
bobCipher.init(Cipher.ENCRYPT_MODE, bobDesKey);
String bobinfo= “这是李四的机密信息”;
System.out.println(“李四加密前原文:”+bobinfo);
byte[] cleartext =bobinfo.getBytes();
byte[] ciphertext = bobCipher.doFinal(cleartext);

/*
* alice用aliceDesKey密钥解密
*/
Cipher aliceCipher = Cipher.getInstance(“DES”);
aliceCipher.init(Cipher.DECRYPT_MODE, aliceDesKey);
byte[] recovered = aliceCipher.doFinal(ciphertext);
System.out.println(“alice解密bob的信息:”+(new String(recovered)));
if (!java.util.Arrays.equals(cleartext, recovered))
throw new Exception(“解密后与原文信息不同”);
System.out.println(“解密后相同”);

}

}



第3章 小结 
  在加密术中生成密钥对时,密钥对的当然是越长越好,但费时也越多,请从中从实际出发选取合适的长度,大部分例码中的密钥是每次运行就从新生成,在实际的情 况中是生成后在一段时间保存在文件中,再次运行直接从文件中读入,从而加快速度。当然定时更新和加强密钥保管的安全性也是必须的。

网上支付方式 ,网上支付方式有哪些

2010年03月16日

  网上购物中施用的支付方式有许多种,网上银行是最基本的形式。比较常见的支付方式作一介绍:

  一、支付宝

  支付宝网站(www.alipay.com)是国内进步前辈的网上支付平台 ,由阿里巴巴公司创办,致力于为网络生意业务用户供给优质的安全支付服务。

  支付宝服务自2003年10月18日在淘宝网网推出以来,在短短的几年时间,迅速成为会员网上生意业务不可缺少的支付方式,深受淘宝网会员喜爱。

  经过不断的革新,支付宝服务日趋完善。为了更好的运营支付宝,为用户供给更优质的服务,成立了支付宝公司,并于2004年12月30日推出支付宝账户体系。

  2、贝宝

   贝宝是由上海网付易信息技术有限公司与世界领先的网络支付公司——PayPal公司共同起劲为中国市场度身定做的网络支付服务。贝宝利用 PayPal 公司在电子商务支付领域进步前辈的技术、风险管理与控制以及客户服务等方面的能力,通过研发适合中国电子商务市场与环境的产品,为电子商务的生意业务平台 和生意业务者供给安全、便捷和快速的生意业务支付支持。

  3、快钱

  快钱公司是独立第三方支付企业,最早推出基于Email和手机号码的综合电子支付服务,拥有千万级注册用户。

   快钱致力于为各类企业及小我私家供给安全、便捷和保密的电子收付款平台及服务。作为快钱的基础服务,快钱帐户供给了充值、收款、付款、提现、对于帐、生 意业务明细查询等功能。以“快钱”为品牌的支付产品包括人民币网关、外卡网关和神州行网关等众多产品,支持互联网、手机和固话等多种终端, 满足各类企业和小我私家的差别支付需求。其中人民币网关支持银行卡支付、快钱帐户支付、电话支付、线下汇款等多种支付方式。同时,快钱还为商家供给众多实 用的生意业务工具,包括快钱钮、快钱链、多笔生意业务付款、电子优惠券等,协助商家广泛深入地开展电子商务。

  四、云网

   北京云网公司成立于1999年12月,云网目前拥有国内极其完善的银行卡在线实时支付平台和5年的数码商品电子商务运营经验。占有国内网上数码卡生意业 务市场份额的80%以上,日成功生意业务过4万笔,年营业额逾2亿元人民币,连续多年在全国各个银行网上支付B2C商户中压倒一切。目前云网支付@网是在 支持银行卡卡种、覆盖范围和实时生意业务速率等方面都居国内领先位置的支付平台。

  5、网汇通

  中国供给互 联网现金汇款、支付的服务供给商,集联天下公司与中国邮政精密互助, 供给“网汇通”业务的数据处理和谋划。2005年成立以来,作为在线支付市场的新力量, 集联天下公司致力互联网新经济和传统行业相结合的研究,为电子支付的贸易应用, 开创性地推出崭新的电子金融服务产品——网汇通。由于中国邮政的网络散布到城乡, “网汇通”产品更加具备服务于普通民众的特性。集联天下公司兼蓄国表里进步前辈资源、 建造的大型计算机处理体系,会遵照消费者的指令,将资金安全、靠得住、实时地送达。

  6、财付通

  财付通网 站 (www.tenpay.com) 作为功能壮大的支付平台,作为在线支付工具,在B2C、C2C在线生意业务中,起到了信用中介的效用,同时为CP、SP供给了在线支付通道以及统一的计费 平台,排除了小我私家用户和广大商家的安全顾虑,保证了在线生意业务的资金和商品安全。

  七、拉卡啦

  北京 拉卡啦信息咨询有限公司(BeiJing Lakala Billing Service Co.,Ltd)是遐想投资、金山投资等多家著名公司参与投资组建的专业化电子账单支付平台运营公司。公司汇聚了一批IT、金融领域的人才,致力于用创新 精力、创新技术、创新模式处理完成中国电子商务的支付“瓶颈”,推动中国电子商务的成长。

  申请的方式:网上申请

  我收集的网上B2支付公司推荐列表

  一、国内支付网关:

  支付宝(https://www.alipay.com/)

  说明:浙江支付宝网络科技有限公司 是阿里巴巴旗下支付公司,拥有淘宝网、阿里巴巴网站上的大量用户。

  贝宝(http://www.paypal.com/cn)

  说明:上海网付易信息技术有限公司 与PayPal互助供给网络支付服务。PayPal为全球最大支付公司。

  网银在线(http://www.chinabank.com.cn)

  说明:网银在线科技有限公司

  快钱(http://www.99bill.com/)

  说明:上海快钱信息服务有限公司 供给基于EMAIL和手机号码的网上收付款服务,已形成了一定例模的本身的用户群。

  环讯IPS(http://www.ips.com.cn/) 已互助

  说明:上海环迅电子商务有限公司

  腾讯财付通(http://www.tepay.com/)

  说明:腾讯的支付平台,拥有QQ用户群。

  首信易支付(http://www.beijing.com.cn/)

  说明:首信易支付(前身为“首都电子商城”)具有北京政府投资配景,主体企业——首都信息成长股份有限公司由北京市财政局资金管理分局等六家股东拿出钱财设立。香港联交所上市。

  YeePay易宝(http://web.yeepay.com/)已互助

  说明:北京通融通信息技术有限公司 电话支付为主

  Chinapay支付(http://www.chinapay.com/)

  说明:中国银联控股公司,支付网关。

  拉卡啦(http://www.lakala.com/) 已互助

  说明:北京拉卡啦信息咨询有限公司 刷卡电话支付

  云网支付(http://www.cncard.net/)

  说明:北京云网公司 的支付网关,拥有云网的用户群。

  汇付天下(http://www.chinapnr.com/)

  说明:汇付网络科技有限公司 今年新成立支付公司,印尼第二大财团三宝麟投资,总裁周晔为前CHINAPAY的总经理,具有银联配景。

  酷币(http://pay.95cool.com)

  说明:鸿联九五旗下支付网关。

  BilltoBill(http://www.billtobill.com.cn)

  说明:澳大利亚的注册公司,在上海。上风在于BilltoBill能够供给最全面的支付方式和对于国际支付业务的支持,与国际支付卡组织、国内数十几家银行的互助,支持国内银行卡支付、国际信用卡支付、电话支付、线下支付和手机支付,与南航有互助。

  ALLBUY(www.allbuy.cn )

  无忧钱包(http://www.51qb.com/)

  西部支付

  说明:已并入YeePay,成为YeePay成都分公司。

  6688支付

  8848支付

  EPAY网关

  NPS网关

  和讯支付

  XPAY支付

  IPAY支付

  二、国外支付网关:

  PayPal(http://www.paypal.com/)

  说明:全球商务网站eBay旗下支付公司,全球最大支付网关,可向55 个国度和地域的用户发送和接收付款,

  Google Checkout

  说明:搜索引擎公司Google于今年6月在美国市场推出的在线支付体系,此刻看来效果不佳。

  Nochex

  三、移动支付:

  联动上风(http://www.umpay.com/)

  说明:北京联动上风科技有限公司

  成立于2003年8月的北京联动上风科技有限公司是中国移动与中国银联的合资公司,至力于为中国移动用户和商户供给“手机钱包”服务。

   “手机钱包”是中国移动与中国银联络合各大国有及股份制贸易银行共同推出的一项全新移动电子支付、金融信息服务,顾名思义,是通过把客户的手机号码与银 行卡等支付帐户进行绑定,随时随地为中国移动手机客户供给的移动支付通道服务。用户可施用手机短信、语音、WAP 、K-Java、USSD等操作方式,管理本身指定的银行卡帐户或小额中间帐户,并实现从帐户中进行扣费。

  “手机钱包”是中国移动对于其移动支付服务的统一叫法,而银联方面除了称此业务为“手机钱包”,在有些情况下还习惯称之为“移动支付”、“移动银行”或者“手机银行”。

   寄托在运营商和金融界的壮大配景与资金实力,联动上风自2004年8月开通业力以来成长迅速,据称其注册用户已跨越300万,近期联动上风又与TOM等 门户网站开展互助,签定协议共同研发中国移动支付市场,此次互助既可当做TOM等门户涉足移动支付领域的信号,也可以看出联动上风在移动支付行业中所处地 位和实力。

  业务范围

  手机钱包主要包括三部分基本业务:理财、缴费和购物。

  联龙博通(http://www.chinamworld.com/)

  说明:北京联龙博通电子商务技术有限公司

  北京联龙博通电子商务技术有限公司成立于2001年,通过其主营业务–手机银行–为联通用户供给移动金融、移动支付、移动电子商务服务。

   2004年3月北京联龙博通电子商务技术有限公司与中国建设银行和中国联通公司共同签署了“关于手机银行业务的三方互助协议”,并于同年7月19日在全 国范围内正式上线开通手机银行业务,业务开展初期运行于联通CDMA1X数据通信网络和BREW技术平台,2005年11月联通WAP(包括1.2和 2.0)版手机银行业务正试上线。

  手机银行

  手机银行是利用手机终端办理非现金类银行业务、各类远程支付 业务以及移动电子商务等业务的简称。BREW(BREW在CDMA手机上的具体体现为“神奇宝典”功能)版本的手机银行业务是将专用的金融服务程序通过空 中下载或程序预装到客户手机,使客户的手机变成一个专用的金融终端,通过将客户的手机号码与银行账户绑定之后,运中国联通有限公司的移动通信网络及数据业 务平台,实时和银行服务器保持联网状态,让客户的手机嬗变成具有金融理财、远程支付和移动电子商务等功能的综合性自助金融工具。WAP版本手机银行功能与 BREW版手机银行功能基本一致。

  具体功能

  金融终端功能:查询、缴费(与各地建行代理缴费项目保持一致)、转账、汇款、银证转账、外汇生意和银行账户管理

  支付功能:远程支付平台用户终端

  电子商务功能:购买数码卡(IP卡、移动联通充值卡、游戏点卡、邮箱卡、杀毒卡等)、机票(即将开通)、福彩(即将开通)等等。

  业务特点

  全国开通(建行总行接入,全国38个一级分行同时开通)

  全网漫游(联通总部接入)

  二十四小时在线(与建行网银体系时实互联)

  全功能支持(除现金存取外银行栏柜所有功能均可实现)

  资费

  服务费:10元/月(BREW、WAP)

  流量费:2分/K

  银行手续费:汇款费率为0.6% 最大限度30元(栏柜费率的六折)

  此刻服务开通范围:联通BREW、WAP全国 移动WAP部分省市

  上海捷银(http://www.smartpay.com.cn/website/index.html)

  说明:上海捷银信息技术有限公司

  捷银前身是英克斯内部的一个项目行得通性研究小组.

  2002年10月,捷银结合建设银行等7家银行与上海大众燃气公司和浦东燃气公司共同推出了煤气费移动代缴业务。

  通过捷银移动支付平台,用户如持有建设银行、招商银行、深圳成长银行、民生银行、福建兴业银行、中原银行及广东成长银行7家银行中任何一家的借记卡或信用卡,即可施用手机以短信方式缴纳煤气费。

  2002年底,捷银与河北中原银行、河北贸易银行及福利彩票管理中间共同推出福利彩票移动投注业务。

  用户通过手机,发送短信的方式直接购买彩票,支付只需通过银行账户直接转账即可。

  2002年年底,中标广东移动“移动支付体系”招标项目。

  捷银供给给广东移动一套移动支付体系的软件,广东移动则付给捷银软件费用。

  2003年11月,与江苏联通互助运营移动支付业务。

  江苏联通最终同捷银达成了一个让捷银期待的互助模式:捷银供给一个移动支付的平台,而联通则供给他们数量巨大的用户,双方按照约定的比例分摊收入。

   与江苏联通互助模式确立之后,捷银很快进入了高速成长的阶段。同江苏联通的这种互助运营模式很快被其它省市的移动运营商所接受,捷银连续同上海联通、安 徽联通、河北联通、重庆联通、辽宁联通、山东联通等运营商达成互助协议,而且互助的模式都是和江苏联通一样。捷银声称,已经达成互助协议的移动运营商覆盖 着大约5000万的潜在用户市场.

  股东与融资:

  捷银是由英斯克计算机有限公司、IconMedialab和网际威信股份有限公司共同拿出钱财创建的公司。

  英斯克计算机有限公司在中国移动数据通信技术市场具有领先的地位

  IconMedialab是一家在瑞典上市的电子商务咨询公司,其安全支付技术在欧洲占有领先地位。

  网际威信股份有限公司是一家由Acer、VeriSign 、香港上海汇丰银行 (HSBC)和美国国际集团 (AIG)共同投资的公司,在银行体系集成和安全电子商务市场具有领先地位。

  2004年7月28日,捷银在香港宣布新一轮融资6500万港元已经到位。

  依照融资协议,著名投资商2b Holdings 将带领众多战略投资者和现有股东向捷银供给6500万港元的资本投资。

  2b Holdings是中国第一家用电器子商务及网上拍卖公司易趣的最早的一批投资人之一。并一手促成2002年易趣和eBay 建立了战略伙伴关系,在随即的2003年又以22500万美元现金完成了eBay对于易趣的收购。

  2005年9月,捷银宣布获第三轮融资,融资额为2000万美元,虽然一定的数目并不惊人,但它仍引起业界关注的缘故原由在于其融资方RRE涉足中国手机支付市场背后所蕴涵的重大信号。

   RRE是国际著名金融领域投资机构,其创始人Robinson先生和McGinn先生曾经分别长期担任过美国运通公司和朗讯公司的总裁和CEO。RRE 的董事顾问还包括现Yahoo主 席和CEOSemel先生,现奥美(Ogilvy&Mather)总裁和CEOLazarus先生,曾经任美洲银 行(BankofAmerica)总裁和CEO的Coulter先生以及曾经任百事公司和CBS广播公司总裁和CEO的Jordan先生。如此之多的行业 巨头要在中国手机市场涉水,行业信号是相当明显的。

  捷银首席执行官罗圣平称,他给捷银的计划表是两年之后,捷银的移动支付用户达到500万,然后去纳斯达克上市。

  梦联信通(http://www.nationm.com.cn/)

   说明:北京梦联信通科技有限公司北大资源集团和北大科技园投资。从事手机银行支付(又称梦联信畅达通支付)和移动电子商务的运营服务和技术研发。支持的 技术平台包括:互联网、移动互联网(WAP)、短信、和电话网平台。梦联信通目前为三百多家主流互联网电子商务网站、互联网门户、WAP门户、交友社区、 电影下载、B2C/C2C生意业务市场、虚拟装备、电话购物、游戏厂商、及移动SP等供给手机代收费服务。

  掌上通(http://59.151.60.4/)

  说明:北京掌上通网络技术有限公司 盟卡支付为其盟卡数码商城(http://card.9588.com/)的支付平台。掌上通现已将主要精力转做电子机票。

用 HttpServletResponseWrapper 实现 Etag 过滤器

原文出处:http://blog.chenlb.com/2009/07/use-httpservletresponsewrapper-implement-etag-filter.html

最近对 http caching 感兴趣,决定一步步学习之。现先来了解 Etag。

什么是“ETag”?

HTTP协议规格说明定义ETag为“被请求变量的实体值” (参见 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html —— 章节 14.19)。 另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单 独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端。

如果http 请求头 If-None-Match 的内容,与服务器对资源算出来的 etag 相同,就返回 304 响应。

下面来动动手,实现一个 etag 过虑器。原理:用 HttpServletResponseWrapper 把正常的页面输出到一个 byte 数组里,然后计算 etag,etag 是否与请求头一致,再进一步处理。

代码实现:

  1. package  com.chenlb.http;  
  2.   
  3. import  java.io.ByteArrayOutputStream;  
  4. import  java.io.IOException;  
  5. import  java.io.PrintWriter;  
  6. import  java.util.Calendar;  
  7. import  java.util.Date;  
  8. import  java.util.zip.CRC32;  
  9.   
  10. import  javax.servlet.Filter;  
  11. import  javax.servlet.FilterChain;  
  12. import  javax.servlet.FilterConfig;  
  13. import  javax.servlet.ServletException;  
  14. import  javax.servlet.ServletOutputStream;  
  15. import  javax.servlet.ServletRequest;  
  16. import  javax.servlet.ServletResponse;  
  17. import  javax.servlet.http.HttpServletRequest;  
  18. import  javax.servlet.http.HttpServletResponse;  
  19. import  javax.servlet.http.HttpServletResponseWrapper;  
  20.   
  21. public   class  EtagFilter  implements  Filter {  
  22.   
  23.     public   void  destroy() {}  
  24.   
  25.     public   void  doFilter(ServletRequest request, ServletResponse response,  
  26.             FilterChain chain) throws  IOException, ServletException {  
  27.   
  28.         HttpServletRequest servletRequest = (HttpServletRequest) request;  
  29.         HttpServletResponse servletResponse = (HttpServletResponse) response;  
  30.   
  31.         ByteArrayOutputStream baos = new  ByteArrayOutputStream();  
  32.         HttpServletResponseWrapper hsrw = new  MyHttpResponseWrapper(servletResponse, baos);  
  33.   
  34.         chain.doFilter(request, hsrw);  
  35.   
  36.         hsrw.flushBuffer();  
  37.   
  38.         byte [] bytes = baos.toByteArray();  
  39.   
  40.         CRC32 crc = new  CRC32();  
  41.         crc.update(bytes);  
  42.   
  43.         String token = “w//””  + crc.getValue() +  ‘”‘ ;  
  44.         servletResponse.setHeader(“ETag” , token);  
  45.         // always store the ETag in the header   
  46.         String previousToken = servletRequest.getHeader(“If-None-Match” );  
  47.         if  (previousToken !=  null  &amp;amp;amp;amp;&amp;amp;amp;amp; previousToken.equals(token)) {  
  48.             // compare previous token with current one         
  49.   
  50.             System.out.println(“ETag match: returning 304 Not Modified” );  
  51.             servletResponse.sendError(HttpServletResponse.SC_NOT_MODIFIED);  
  52.             // use the same date we sent when we created the ETag the first time through   
  53.             servletResponse.setHeader(“Last-Modified” , servletRequest.getHeader( “If-Modified-Since” ));  
  54.         } else   {  
  55.             // first time through – set last modified time to now   
  56.             Calendar cal = Calendar.getInstance();  
  57.             cal.set(Calendar.MILLISECOND, 0 );  
  58.             Date lastModified = cal.getTime();  
  59.             servletResponse.setDateHeader(“Last-Modified” , lastModified.getTime());  
  60.             System.out.println(“Writing body content” );  
  61.             servletResponse.setContentLength(bytes.length);  
  62.             ServletOutputStream sos = servletResponse.getOutputStream();  
  63.             sos.write(bytes);  
  64.             sos.flush();  
  65.             sos.close();  
  66.         }  
  67.   
  68.     }  
  69.   
  70.     public   void  init(FilterConfig config)  throws  ServletException {}  
  71.   
  72.     private   static   class  MyHttpResponseWrapper  extends  HttpServletResponseWrapper {  
  73.   
  74.         ByteServletOutputStream servletOutputStream;  
  75.         PrintWriter printWriter;  
  76.   
  77.         public  MyHttpResponseWrapper(HttpServletResponse response, ByteArrayOutputStream buffer) {  
  78.             super (response);  
  79.             servletOutputStream = new  ByteServletOutputStream(buffer);  
  80.         }  
  81.   
  82.         public  ServletOutputStream getOutputStream()  throws  IOException {  
  83.             return  servletOutputStream;  
  84.         }  
  85.   
  86.         public  PrintWriter getWriter()  throws  IOException {  
  87.             if (printWriter ==  null ) {  
  88.                 printWriter = new  PrintWriter(servletOutputStream);  
  89.             }  
  90.             return  printWriter;  
  91.         }  
  92.   
  93.         public   void  flushBuffer()  throws  IOException {  
  94.             servletOutputStream.flush();  
  95.             if (printWriter !=  null ) {  
  96.                 printWriter.flush();  
  97.             }  
  98.         }  
  99.     }  
  100.   
  101.     private   static   class  ByteServletOutputStream  extends  ServletOutputStream {  
  102.   
  103.         ByteArrayOutputStream baos;  
  104.   
  105.         public  ByteServletOutputStream(ByteArrayOutputStream baos) {  
  106.             super ();  
  107.             this .baos = baos;  
  108.         }  
  109.   
  110.         public   void  write( int  b)  throws  IOException {  
  111.             baos.write(b);  
  112.         }  
  113.     }  
  114. }  

web.xml 配置:

  1. < filter >   
  2.     < filter-name > etag </ filter-name >   
  3.     < filter-class > com.chenlb.http.EtagFilter </ filter-class >   
  4. </ filter >            
  5.   
  6. < filter-mapping >   
  7.     < filter-name > etag </ filter-name >   
  8.     < url-pattern > *.jsp </ url-pattern >   
  9. </ filter-mapping >   

测试环境是 tomcat 6.0.18。

用 httpwatch 可以观察效果。

用 HttpServletResponseWrapper 实现 Etag 过滤器

etag-filter,点击放大

第二次请求(刷新),返回 304 。说明有效了。

过虑器同时还加了 Last-Modified 是为了兼容不支持 Etag 头的客户端。

参考:使用ETags减少Web应用带宽和负载

infoq 下载来的代码没试用通过,原因是没有 flush PrintWriter。虽然有 304,但返回的内容为空。

当然算 etag 可用其它算法,我这里用 crc32。infoq 例子中用 md5。