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