权限是系统中必不可少的。
客户端访问服务器的过程为: 客户端发起请求 -> 服务器路由 -> 访问服务端资源
如果要使用安全验证,可以在路由之前验证: 客户端发起请求 -> 认证 -> 服务器路由 -> 访问服务端资源
第一步:编写服务端资源
public interface MovieResource { @Get public String getMovieInfo(); @Put public String uploadMovie(Movie movie) throws IOException ; }
public class MovieServerResource extends ServerResource implements MovieResource{ public String uploadMovie(Movie movie) throws IOException{ String result = String.format("upload movie{name:%s size:%d minutes:%d} success!" , movie.getName() , movie.getSize(), movie.getMinutes()); return result ; } @Override public String getMovieInfo() { return "movie info"; } }
第三步:创建应用配置路由与认证管理器
public class MovieApplication extends Application{ /** * 注意:Router 与 ChallengeAuthenticator 均是Restlet的子类 */ @Override public Restlet createInboundRoot() { Router router = new Router(getContext()); //绑定资源 router.attach("/" , MovieServerResource.class); //创建认真器 ChallengeAuthenticator authenticator = new ChallengeAuthenticator(getContext(), ChallengeScheme.HTTP_BASIC, "Movie Realm"); //配置用户 MapVerifier verifier = new MapVerifier(); verifier.getLocalSecrets().put("zhoufeng", "123456".toCharArray()); authenticator.setVerifier(verifier); //将路由器放在认证器之后 authenticator.setNext(router); //返回认证器 return authenticator ; } }
public class MovieServer { public static void main(String[] args) throws Exception { Component comp = new Component() ; comp.getServers().add(Protocol.HTTP , 8888) ; comp.getDefaultHost().attach(new MovieApplication()); comp.start(); } }此时用浏览器访问http://localhost:8888 会提示输入用户名和密码
客户端代码示例:
public class MovieClient { /** * 不使用用户名密码直接访问Get方法,将会抛出异常 */ @Test public void test01() throws IOException{ ClientResource cr = new ClientResource("http://localhost:8888/"); cr.get().write(System.out); } /** * 加入用户名密码访问Get方法,成功得到返回值 */ @Test public void test02() throws IOException{ ClientResource cr = new ClientResource("http://localhost:8888/"); cr.setChallengeResponse(ChallengeScheme.HTTP_BASIC , "zhoufeng", "123456"); cr.get().write(System.out); } /** * 不使用用户名密码访问put方法 */ @Test public void test03() throws IOException{ MovieResource mr = ClientResource.create("http://localhost:8888/", MovieResource.class); Movie movie = new Movie(); movie.setName("速度与激情6"); movie.setSize(10000000l); movie.setMinutes(120); String result = mr.uploadMovie(movie); System.out.println(result ); } /** * 使用用户名密码访问put方法 */ @Test public void test04() throws IOException{ ClientResource cr = new ClientResource("http://localhost:8080/"); cr.setChallengeResponse(ChallengeScheme.HTTP_BASIC , "zhoufeng", "123456"); MovieResource mr = cr.wrap(MovieResource.class); Movie movie = new Movie(); movie.setName("速度与激情6"); movie.setSize(10000000l); movie.setMinutes(120); String result = mr.uploadMovie(movie); System.out.println(result); } }