开发CXF客户端通过HTTP Basic Authorization 安全认证的几种办法
来源:互联网 发布:淘宝直播红包雨怎么玩 编辑:程序博客网 时间:2024/06/06 02:15
开发CXF客户端通过HTTP Basic Authorization 安全认证的几种办法,有很多个,但是网上包括英文stackoverflow网站和官方文档全部是错误的。一般的CXF客户端开发方法是首先通过网络获取WSDL文件,然后再发送验证用户名密码调用服务,然而在客户端声明并创建服务实例的时候,如
HelloWorldService ss = new HelloWorldService(wsdlURL, SERVICE_NAME);
就无法通过Http basic 验证,所以之后的所有用户名和密码设置全部失效。
下面贴出几种CXF客户端通过HTTP Basic Authorization 安全认证的方法代码:
private static final QName SERVICE_NAME = new QName("http://example.org/", "HelloWorldService"); private HelloWorld_HelloWorldPort_Client() { } public static void main(String args[]) throws java.lang.Exception { URL wsdlURL = HelloWorldService.WSDL_LOCATION; if (args.length > 0 && args[0] != null && !"".equals(args[0])) { File wsdlFile = new File(args[0]); try { if (wsdlFile.exists()) { wsdlURL = wsdlFile.toURI().toURL(); } else { wsdlURL = new URL(args[0]); } } catch (MalformedURLException e) { e.printStackTrace(); } } System.setProperty( "proxySet", "true" ); System.setProperty( "http.proxyHost", "10.133.96.245" ); System.setProperty( "http.proxyPort", "8080" ); //very important!!!wsdlURL=new File("D:/hello.xml").toURI().toURL(); HelloWorldService ss = new HelloWorldService(wsdlURL, SERVICE_NAME);//如果wsdlURL是来自HTTP的网络,则此处无法通过Http Basic 验证,已经出错 HelloWorld port = ss.getHelloWorldPort(); //1、使用本地wsdl文件,而不是从网络中获取wsdl,则可以正常工作//Service service = Service.create(wsdlURL, SERVICE_NAME); //HelloWorld port = (HelloWorld) service.getPort(HelloWorld.class);// BindingProvider bp=(BindingProvider)port;// bp.getRequestContext().put(// BindingProvider.USERNAME_PROPERTY, "ross");// bp.getRequestContext().put(// BindingProvider.PASSWORD_PROPERTY, "ross");//2、以下可正常工作//JaxWsProxyFactoryBean clientFactory = new JaxWsProxyFactoryBean(); //clientFactory.setAddress("http://localhost:8081/hello"); //clientFactory.setServiceClass(HelloWorld.class); //clientFactory.setUsername("ross"); //clientFactory.setPassword("ross"); //HelloWorld port = (HelloWorld)clientFactory.create();//end //3、使用本地wsdl文件,而不是从网络中获取wsdl,则可以正常工作// Client client = ClientProxy.getClient(port);// HTTPConduit http = (HTTPConduit) client.getConduit();// AuthorizationPolicy authorizationPolicy = new AuthorizationPolicy();// authorizationPolicy.setUserName("ross");// authorizationPolicy.setPassword("ross");// authorizationPolicy.setAuthorizationType("Basic");// http.setAuthorization(authorizationPolicy); //end //4、使用本地wsdl文件,而不是从网络中获取wsdl,则可以正常工作// Map<String, List<String>> headers = new HashMap<String, List<String>>();// headers.put("Authorization", Arrays.asList("Basic cm9zczpyb3Nz"));// Client client = ClientProxy.getClient(port);// client.getRequestContext().put(Message.PROTOCOL_HEADERS, headers); //end //5、使用本地wsdl文件,而不是从网络中获取wsdl,则可以正常工作 Client client = ClientProxy.getClient(port); HTTPConduit http = (HTTPConduit) client.getConduit(); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setAutoRedirect(true); http.setClient(httpClientPolicy); http.setAuthSupplier( new MyBasicAuthSupplier("mule-realm", "ross", "ross")); //end // Okay, are you sick of configuration files ? // This will show you how to configure the http conduit dynamically// Client client = ClientProxy.getClient(port);// HTTPConduit http = (HTTPConduit) client.getConduit();// HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();// httpClientPolicy.setConnectionTimeout(36000);// httpClientPolicy.setAllowChunking(false);// httpClientPolicy.setReceiveTimeout(32000);// httpClientPolicy.setConnection(ConnectionType.CLOSE);// http.setClient(httpClientPolicy); { System.out.println("Invoking sayHi..."); java.lang.String _sayHi_arg0 = ""; java.lang.String _sayHi__return = port.sayHi(_sayHi_arg0); System.out.println("sayHi.result=" + _sayHi__return); } System.exit(0); }
使用
// 5、使用本地wsdl文件,而不是从网络中获取wsdl,则可以正常工作Client client = ClientProxy.getClient(port);HTTPConduit http =(HTTPConduit) client.getConduit();HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();httpClientPolicy.setAutoRedirect(true);http.setClient(httpClientPolicy);http.setAuthSupplier(new MyBasicAuthSupplier());
MyBasicAuthSupplier 類實現HttpAuthSupplier接口
public class MyBasicAuthSupplier implements HttpAuthSupplier{ MyBasicAuthSupplier(){ } /* This is a helper method to build the security header */ private String createUserPass(String usr, String pwd) { String userpass = usr + ":" + pwd; String token = Base64Utility.encode(userpass.getBytes()); return "Basic " + token; }@Overridepublic String getAuthorization(AuthorizationPolicy arg0, URL arg1,Message arg2, String arg3) {String username = "username"; String password = "password"; return createUserPass(username, password);}@Overridepublic boolean requiresRequestCaching() {// TODO Auto-generated method stubreturn false;}}
- 开发CXF客户端通过HTTP Basic Authorization 安全认证的几种办法
- BASIC认证html通过办法
- Go实战--通过basic认证的http(basic authentication)
- HTTP Basic Authorization
- HTTP basic Authorization
- Python的HTTP Basic认证
- http协议Authorization认证方式在Android开发中的使用
- CXF 简单的安全认证方法
- http协议基本认证 Authorization
- CXF 安全认证
- Cxf Webservice安全认证
- CXF 安全认证
- Cxf Webservice安全认证
- CXF加安全认证
- Cxf Webservice安全认证
- Cxf Webservice安全认证
- webservices 安全方法一 HTTP使用BASIC认证的原理及实现方法
- Http认证之Basic认证
- 老服务器迁移遇到的问题
- [Python]学习资料整理
- 插入排序
- CALayer和Retina显示屏的高分辨率的支持
- Android 开发之旅:短信的收发及在android模拟器之间实践(一)
- 开发CXF客户端通过HTTP Basic Authorization 安全认证的几种办法
- NSCopying协议探究
- Lab4_1树莓派上增加一个Linux系统调用
- C#学习中记录(一)
- Linux内核等待队列机制介绍
- gstreamer的plugin注册流程
- ajaxupload新版试用记录
- Android Binder设计与实现 – 设计篇
- 24点游戏算法(C语言实现)