RESTful Web Service 的安全以及性能

可扩展性(scalability)和可用性(availability)

customtokenauthentication

使用一个独一无二的标志,来标示每一次的数据请求。

这个标志有两种用法:1.它可以作为URI的2.它可以加入到HTTP的请求头中。

@Path("/users/token={token}")

publicclassUsersResource{

@GET

@Produces("application/xml")

publicStringgetXML(@PathParam("token")Stringtoken){

if(AuthenticationService.authenticate(token)){

returnUserBO.getAllXML();

}else{

thrownewWebApplicationException(401);

}

}

}

先检验URI中的标志——Token,如果token变量未通过验证,返回401错误,即未授权。

HTTPbasicauthentication

即在HTTP请求头中加入一个Authorization:BasicQWxhZGRpbjpvcGVulHNIc2FtZQ==域,就相当于一个证书。对于浏览器而言,会把证书放入缓存中,这样就不必每次都要输入用户名和密码。但这样会导致越权访问,此时由于存在缓存,所以WebService很难区分请求是否授权。

而且用户名和密码是用Base64encoding编码的,这个很容易破解,解决这个问题,我们可以用HTTPS(SSL)协议代替HTTP协议。

如果用浏览器访问但没有加入对应的证书,浏览器会出现一个对话框,要求你输入用户名和密码,当用户输入完后,浏览器会再次发送求情。浏览器对401错误会自动处理。

如果使用其他的客户端,则会收到一个401错误。

也可以在刚开始的时候就设置好HTTP请求头,这样就不用每次都输入证书了。

...

HttpClientclient=newHttpClient();

client.getState().setCredentials(newAuthScope("www.restfuljava.com",

443,"realm"),newUsernamePasswordCredentials("username",

"password"));

GetMethodget=newGetMethod("http://www.restfuljava.com/webservice

/users");

get.setDoAuthentication(true);

client.executeMethod(get);

...

不过,这样一来,该客户端就只能用于访问证书对应的网站。

OAuth认证方式。

允许第三方访问用户数据,只通过授权验证方式,即每次访问不需要提供用户名及密码。需要为该认证方式提供另外一个独立的WebService。

如果不用这种方式,如果一个服务提供者想要别人来使用自己的服务,那就必须向使用者提供相应的证书。

OAuth和OpenID是不同的两种协议。OpenID是指,使用同一个证书,访问不同的网络应用。

性能

简单来说,RESTfulwebservice的性能是由web框架决定的。

Highavailability意味着0或者最低的运行故障时间。对于一个复杂的web结构,达到0运行故障时间是不可能的。有时候我们不得不关掉整个系统,这是不可避免的。

对于如何减少系统故障运行时间最常用的方法就是,硬件冗余,即当一个机器出了问题,停止工作,另外一个机器会接替他的工作。

Scalability

相关推荐