2013年1月 的存档
2013一月31

映射持久网络驱动器

windows server 评论关闭
net use x: \\172.16.88.204\soft-0509 密码 /user:administrator /persistent:yes
2013一月31

存储过程版本控制-DDL触发器

sql server 评论关闭

USE CedarLog
GO

CREATE TABLE [dbo].[ChangeLog](
	[LogId] [INT] IDENTITY(1,1) NOT NULL,
	[DatabaseName] [VARCHAR](256) NOT NULL,
	[EventType] [VARCHAR](50) NOT NULL,
	[ObjectName] [VARCHAR](256) NOT NULL,
	[ObjectType] [VARCHAR](25) NOT NULL,
	[SqlCommand] [NVARCHAR](MAX) NOT NULL,
	[EventDate] [DATETIME] NOT NULL CONSTRAINT [DF_EventsLog_EventDate]  DEFAULT (GETDATE()),
	[LoginName] [VARCHAR](256) NOT NULL,
	[IP] [VARCHAR](50) NOT NULL,
 CONSTRAINT [PK_ChangeLog] PRIMARY KEY CLUSTERED
(
	[LogId] DESC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

CREATE TRIGGER [backup_objects]
ON ALL SERVER
FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE,
CREATE_TABLE, ALTER_TABLE, DROP_TABLE,CREATE_VIEW, ALTER_VIEW, DROP_VIEW,
CREATE_FUNCTION, ALTER_FUNCTION, DROP_FUNCTION
AS
SET NOCOUNT ON
DECLARE @data XML SET @data = EVENTDATA()
IF @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)') NOT LIKE 'SqlQuery%'
BEGIN
	INSERT INTO CedarLog.dbo.changelog(databasename, eventtype, objectname, objecttype, sqlcommand, loginname,IP)
	VALUES( @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'varchar(256)'),
	@data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(50)'),
	@data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(256)'),
	@data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(25)'),
	@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'varchar(max)'),
	@data.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(256)'),
	CONVERT(VARCHAR(50),CONNECTIONPROPERTY('client_net_address') ) )
END
GO

ENABLE TRIGGER [backup_objects] ON ALL SERVER
GO

--查看服务器级别的触发器
SELECT TOP 50 * FROM sys.server_triggers 

--查看服务器级别的触发器的定义
SELECT * FROM sys.server_sql_modules 

--查看激发触发器的数据库事件的信息
SELECT TOP 50 * FROM sys.server_trigger_events

--删除服务器上的DDL触发器
DROP TRIGGER backup_objects ON ALL SERVER

--失效DDL触发器
DISABLE TRIGGER backup_objects ON ALL SERVER

--获取有关数据库范围内的触发器的信息
SELECT * FROM sys.triggers 

--获取有关激发触发器的数据库事件的信息
SELECT * FROM sys.trigger_events 

--查看数据库范围内的触发器的定义
SELECT * FROM sys.sql_modules 

--删除当前数据库上的DDL触发器
DROP TRIGGER backup_objects ON DATABASE
 
2013一月28

iframe嵌套session失效问题

开发遇到的问题 评论关闭

起因:
IE6/IE7从安全性角度考虑,
支持的P3P(Platform for Privacy Preferences Project (P3P) specification)协议默认阻止第三方无隐私安全声明的cookie,firefox,chrome无此问题。
即在IE6/IE7下,嵌入的页面若与主页面域不同,则嵌入页的cookie不能被主域读取,也就意味着保存在cookie中的sessionid是没有的,在上传服务器时,因没有传sessionid,服务器是读取不了已经创建的session中的内容。
解决方案:
第1种:

> 打开IIS管理器 inetmgr
> 选择被嵌入iframe源站点或者目录,右键点击打开属性框 
> 切换到HTTP头 
> 添加 
> 自定义HTTP头名: P3P
> 自定义HTTP头值: CP="CAO PSA OUR"
> 关闭属性框退出,即刻生效

第2种:
在被嵌入页面page_onload里添加一语句:Response.AddHeader("P3P","CP=CAO PSA OUR");

2013一月27

BASE64 VLQ 编码规则

好的代码 评论关闭

VLQ 是 Variable-length quantity 的缩写,是一种通用的,使用任意位数的二进制来表示一个任意大的数字的一种编码方式。这个编码方式是在 MIDI 文件格式中定义的,用来节省空间

线编码解码的网站:http://murzwin.com/base64vlq.html ,
开源库相关实现:
https://github.com/mozilla/source-map/blob/master/lib/source-map/base64-vlq.js,

首先我们先来了解下 VLQ 是什么,VLQ 是 Variable-length quantity 的缩写,是一种通用的,使用任意位数的二进制来表示一个任意大的数字的一种编码方式。这个编码方式是在 MIDI 文件格式中定义的,用来节省空间。在其他地方也有很多类似这样的编码格式,比如在 Google’s protocol buffers 中,还有我们马上要讨论到的 BASE64 VLQ 中。想了解的更多,请参考wikipedia

我们先来看看 MIDI 中的 VLQ 编码是如何编码 137 这个数字的吧:(摘抄自 wikipedia)

  • 先把 137 转换成二进制:10001001
  • 7 bit 一组,把二进制分开,不足的补 0 ,变成 0000001 0001001
  • 把最低的7位拿出来,在最高位补0表示最后一位,变成 0000 1001,这个作为最低位,放在最后边。
  • 在其他组的最高位补 1 ,表示没有结束,后面跟着还有数据。在这里就是 1000 0001
  • 拼在一起,就变成了 1000 0001 0000 1001 .

这就是 VLQ 的变化过程。

那么什么是 Base64 VLQ 呢?和上面的变换过程有什么区别呢?

我们可以先来参考我博客的另外一篇文章,先来回顾下 Base64 编码:BASE64 编码规则

我们可以看到 Base64 是一种可以把二进制数据编码成用 ASCII 表示的一种编码规则,但是受限于 Base64 采用的字符集,一个 Base64 字符只能表示 6bit 的数据。所以上面的 VLQ 中 7 bit 一组的分组方式,在这里就要变成 5 bit 一组的分组了。

另外,Base64 VLQ 需要能够表示负数,于是规定了需要先把数字变成无符号数,用最后一位来作为符号标志位。我们直接来做一个变换吧,这样理解的最快。在例子中可以看到和上面的 VLQ 编码还是有一定差别的。

不妨还拿 137 来做示例吧。

  • 先把 137 转换成二进制:10001001
  • 由于 137 是正数,所以在最低位补0 变成 100010010
  • 按照 5bit 一组的方式分组,变成 01000 10010
  • 按照从低位到高位的顺序,以 5bit 一组为单位,依次拿出数据做转换。
  • 先拿出第一组 10010 , 因为后面还有数据,所以需要在高位补 1,变成 110010 ,编码成 Base64: y
  • 再拿出第二组,也是我们这里的最后一组,01000 , 由于是最后一组,所以在高位补 0 变成 001000,编码成 Base64: I
  • 按照从低位到高位的顺序把这些 ASCII 字符拼接起来,变成 yI

可以看到在 VLQ 中,编码顺序是从高位到低位,在 Base64 VLQ 中,编码顺序是从低位到高位。

那么如何解码呢?相信了解了编码过程后,解码过程就不必再讲解了。

参考:http://blog.allenm.me/2012/12/base64-vlq-encoding/

http://www.ruanyifeng.com/blog/2013/01/javascript_source_map.html

2013一月26

跨域问题

同一域:指协议、域名,端口号都相同,否则为跨域。
表现为:如在a.com/index.html 利用iframe引用了b.com/index.html,
那么:在a.com/index.html无法更改b.com/index.html的对象,如dom,css等,但是可读取的。即只读
反之,在b.com/index.html中对a.com/index.html也是只读的。
//在b.com/index.html中可用document.referrer来引用a.com/index.html的网址
不过,可在a.com/index.html利用对b.com/index.html的访问权限,在b.com中创建一对象,此对象在a.com中是可以操作的。

对于主域相同而子域不同的例子,可以通过设置document.domain的办法来解决。
具体的做法是可以在http://www.a.com/a.html和http://script.a.com/b.html两个文件中分别加上document.domain = ‘a.com’;然后通过a.html文件中创建一个iframe,去控制iframe的contentDocument,这样两个js文件之间就可以“交互”了。当然这种办法只能解决主域相同而二级域名不同的情况

引用:http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html

2013一月19

网站并发数

开发遇到的问题 评论关闭

浏览器对同一个域名访问的并发数是有限制的,同一时间下,如下表:

浏览器 并发数
IE 6,7 2
IE 8 6
Firefox 2 2
Firefox 3 6
Safari 3,4 4
Chrome 1,2 6
Chrome 3 4
Chrome 4+ 6
iPhone 2 4
iPhone 3 6
iPhone 4 4
Opera 9.63,10.00alpha 4
Opera 10.51+ 8

因为浏览器只对单个域名限制并发数,而不对单个IP限制并发数,所以可将一个IP地址映射到多个域名,然后使用这些域名访问网站资源,这样原本浏览器的并发数为6,使用两个域名并发数就可以达到12个了。但需要注意的是,域名并不是越多就越好的,因为域名解析也需要花费时间,而且并发数太多也会耗费客户端太多的CPU,域名数量到了一定程度,网页性能就会开始下降,所以在应用中需要根据实际情况寻找一个平衡点。如果不是特别需要,一般24个为佳。

2013一月18

sql版本

sql server 评论关闭
SELECT  DATABASEPROPERTYEX('mydb','version'),SERVERPROPERTY('Edition') [已安装产品版本], SERVERPROPERTY('ProductLevel') [SQL Server 实例的版本级别],SERVERPROPERTY('ProductVersion') [SQL Server 实例的版本]
QL Server Version

Internal Database Version

SQL Server 2008 R2

665

SQL Server 2008

661

SQL Server 2005 SP2+ with vardecimal enabled

612

SQL Server 2005

611

SQL Server 2000

539

SQL Server 7

515
Release
Product Version
SQL Server 2012 Service Pack 1 11.00.3000.00
SQL Server 2012 RTM 11.00.2100.60
SQL Server 2008 R2 Versions
Release Product Version
SQL Server 2008 R2 Service Pack 1 10.50.2500.0
SQL Server 2008 R2 RTM 10.50.1600.1
SQL Server 2008 Versions
Release Product Version
SQL Server 2008 Service Pack 3 10.00.5500.00
SQL Server 2008 Service Pack 2 10.00.4000.00
SQL Server 2008 Service Pack 1 10.00.2531.00
SQL Server 2008 RTM 10.00.1600.22
SQL Server 2005 Versions
Release Product version
SQL Server 2005 Service Pack 4 9.00.5000.00
SQL Server 2005 Service Pack 3 9.00.4035
SQL Server 2005 Service Pack 2 9.00.3042
SQL Server 2005 Service Pack 1 9.00.2047
SQL Server 2005 RTM 9.00.1399
SQL Server 2000 Versions
Release Product version
SQL Server 2000 Service Pack 4 8.00.2039
SQL Server 2000 Service Pack 3 8.00.760
SQL Server 2000 Service Pack 3 8.00.760
SQL Server 2000 Service Pack 2 8.00.534
SQL Server 2000 Service Pack 1 8.00.384
SQL Server 2000 RTM 8.00.194
 
2013一月16

伪静态 URL重写

ASP.NET 评论关闭

1,引入DLL
2,配置对应关系html与aspx
3,加入配置
4,IIS中配置isapi,以解析html

参考:http://www.bingd.com/blog/html/UrlRewriter.htm
参考:http://blog.zhaojie.me/2008/01/url-rewrite-2.html

2013一月9

HTTP 错误401.1 – 未经授权:访问由于凭据无效

IIS 评论关闭

1、错误号401.1

症状:HTTP 错误 401.1 – 未经授权:访问由于凭据无效被拒绝。

分析:

由于用户匿名访问使用的账号(默认是IUSR_机器名)被禁用,或者没有权限访问计算机,将造成用户无法访问。

解决方案:

(1)查看IIS管理器中站点安全设置的匿名帐户是否被禁用,如果是,请尝试用以下办法启用:

控制面板->管理工具->计算机管理->本地用户和组,将IUSR_机器名账号启用。如果还没有解决,请继续下一步。

(2)查看本地安全策略中,IIS管理器中站点的默认匿名访问帐号或者其所属的组是否有通过网络访问服务器的权限,如果没有尝试用以下步骤赋予权限:

开始->程序->管理工具->本地安全策略(secpol.msc)->安全策略->本地策略->用户权限分配,双击“从网络访问此计算机”,添加IIS默认用户或者其所属的组。

注意:一般自定义 IIS默认匿名访问帐号都属于组,为了安全,没有特殊需要,请遵循此规则。 2、错误号401.2


症状:HTTP 错误 401.2 – 未经授权:访问由于服务器配置被拒绝

原因:关闭了匿名身份验证

解决方案:

运行inetmgr,打开站点属性->目录安全性->身份验证和访问控制->选中“启用匿名访问”,输入用户名,或者点击“浏览”选择合法的用户,并两次输入密码后确定。

错误号:401.3

症状:HTTP 错误 401.3 – 未经授权:访问由于 ACL 对所请求资源的设置被拒绝。

原因:IIS匿名用户一般属于Guests组,而我们一般把存放网站的硬盘的权限只分配给administrators组,这时候按照继承原则,网站文件夹也只有administrators组的成员才能访问,导致IIS匿名用户访问该文件的NTFS权限不足,从而导致页面无法访问。

解决方案:

给IIS匿名用户访问网站文件夹的权限,方法:进入该文件夹的安全选项,添加IIS匿名用户,并赋予相应权限,一般是读、写。 

2013一月6

反向代理

IIS 评论关闭

反向代理(Reverse Proxy)方式是指以代理服务器来接受外部的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给外部的请求连接的客户端,此时代理服务器对外就表现为一个服务器。

反向代理服务器位于本地WEB服务器和外部网络之间,如下图所示:

当用户浏览器发出一个HTTP请求时,通过域名解析将请求定向到反向代理服务器(如果要实现多个WEB 服务器的反向代理,需要将多个WEB服务器的域名都指向反向代理服务器)。由反向代理服务器处理器请求。反向代理一般只缓存可缓冲的数据(比如html网 页和图片等),而一些CGI脚本程序或者ASP.NET/JSP之类的程序不缓存。它根据从WEB服务器返回的HTTP头标记来缓冲静态页面。有四个最重要HTTP头标 记:

  • Last-Modified: 告诉反向代理页面什么时间被修改
  • Expires: 告诉反向代理页面什么时间应该从缓冲区中删除
  • Cache-Control: 告诉反向代理页面是否应该被缓冲
  • Pragma: 告诉反向代理页面是否应该被缓冲.

Application Request Routing(ARR)是一个基于代理的路由模块,可以根据HTTP头、服务器变量和负载均衡算法将HTTP请求转发到内容服务器上。它可以增强应用程序的效率和可扩展性,更好地利用内容服务器资源,并能够简化应用程序的部署,包括pilot management和A/B测试。ARR还有一种特性叫做shared hoster,用于修改如何共享目前提供的共享主机,为客户增加额外的服务。IIS 7.0 的应用请求路由模块(Application Request Routing (ARR) module),我们可以轻松实现反向代理.如何使用可参看下列几篇文章:

如何利用 IIS7 的 ARR 模??做 Reverse Proxy ?制

在IIS7中应用Application Request Routing配置反向代理

web developer tips (36):使用IIS7.0 应用请求路由模块管理网站的beta版程序

用 IIS 7、ARR ? Velocity 建设高性能的大型网站

IIS 6可以使用google code上一个项目:A C# reverse proxy for IIS

引自http://www.cnblogs.com/shanyou/archive/2009/11/15/1603245.html

2013一月1

使SQL用户只能看到自己拥有权限的库

sql server 评论关闭
DENY VIEW any DATABASE to PUBLIC;