webservice用main方法发布https接口
来源:互联网 发布:网盘 数据库 编辑:程序博客网 时间:2024/06/08 12:43
刚开始是用webservice发布http接口,但是需求更改,需要发布https,而且是要部署到服务器,这是一个单独的客户端,所以只好用main方法发布,没有使用tomcat。 起初本以为很简单,但发布的总会报很多bug,可是jar包的原因吧。 不废话了,上代码。
package com.topwalk.main;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.security.KeyStore;import javax.net.ssl.KeyManager;import javax.net.ssl.KeyManagerFactory;import javax.net.ssl.TrustManager;import javax.net.ssl.TrustManagerFactory;import org.apache.cxf.configuration.jsse.TLSServerParameters;import org.apache.cxf.configuration.security.ClientAuthentication;import org.apache.cxf.configuration.security.FiltersType;import org.apache.cxf.endpoint.Server;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;import org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory;import com.topwalk.service.DstServiceImpl;import com.topwalk.service.LoginServiceImpl;public class MyServer { private static final int port = 12345; private static final String address = "https://192.168.28.111:"+port+"/ws/ssl/loginService"; public static void main(String[] args) throws Exception { System.out.println("Starting Server"); configureSSLOnTheServer(); JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean(); factoryBean.setServiceClass(LoginServiceImpl.class); factoryBean.setAddress(address); Server server = factoryBean.create(); String endpoint = server.getEndpoint().getEndpointInfo().getAddress(); System.out.println("Server started at " + endpoint); // 启动监听端口 30000 ServerSocket ss; try { ss = new ServerSocket(30000); // 没有连接这个方法就一直堵塞 Socket s = ss.accept(); // 将请求指定一个线程去执行 System.out.println("执行Socket"); new Thread(new DstServiceImpl(s)).start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void configureSSLOnTheServer() { File file = new File(MyServer.class.getResource("/com/conf/test.jks").getFile()); // System.out.println("file:"+"1122334==================="+file); try { TLSServerParameters tlsParams = new TLSServerParameters(); KeyStore keyStore = KeyStore.getInstance("JKS"); String password = "mypassword"; String storePassword = "mypassword"; keyStore.load(new FileInputStream(file), storePassword.toCharArray()); KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyFactory.init(keyStore, password.toCharArray()); KeyManager[] keyManagers = keyFactory.getKeyManagers(); tlsParams.setKeyManagers(keyManagers); keyStore.load(new FileInputStream(file), storePassword.toCharArray()); TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustFactory.init(keyStore); TrustManager[] trustManagers = trustFactory.getTrustManagers(); tlsParams.setTrustManagers(trustManagers); FiltersType filtersTypes = new FiltersType(); filtersTypes.getInclude().add(".*_EXPORT_.*"); filtersTypes.getInclude().add(".*_EXPORT1024_.*"); filtersTypes.getInclude().add(".*_WITH_DES_.*"); filtersTypes.getInclude().add(".*_WITH_NULL_.*"); filtersTypes.getExclude().add(".*_DH_anon_.*"); tlsParams.setCipherSuitesFilter(filtersTypes); ClientAuthentication ca = new ClientAuthentication(); ca.setRequired(true); ca.setWant(true); tlsParams.setClientAuthentication(ca); JettyHTTPServerEngineFactory factory = new JettyHTTPServerEngineFactory(); factory.setTLSServerParametersForPort(port, tlsParams); } catch (Exception e) { e.printStackTrace(); } } }
这就是我发布的服务端,注意的是上面iP一定要与本机ip保持一致。
还有那个是socket判断客户端是否在线的,用的时候可以删掉。
至于那个秘钥,需要在本机生成。生成步骤就写在最下面吧。
接着看一下客户端调用的代码。
/** * 解析https协议,需要知道密钥的密码信息 * * @param obj */ private static void configureSSLOnTheClient(Object obj) { File file = new File(LandingMain.class.getResource("/com/conf/test.jks").getFile()); System.out.println(file); Client client = ClientProxy.getClient(obj); HTTPConduit httpConduit = (HTTPConduit) client.getConduit(); try { TLSClientParameters tlsParams = new TLSClientParameters(); tlsParams.setDisableCNCheck(true); KeyStore keyStore = KeyStore.getInstance("JKS"); String password = "mypassword"; String storePassword = "mypassword"; keyStore.load(new FileInputStream(file), storePassword.toCharArray()); TrustManagerFactory trustFactory = TrustManagerFactory .getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustFactory.init(keyStore); TrustManager[] trustManagers = trustFactory.getTrustManagers(); tlsParams.setTrustManagers(trustManagers); keyStore.load(new FileInputStream(file), storePassword.toCharArray()); KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyFactory.init(keyStore, password.toCharArray()); KeyManager[] keyManagers = keyFactory.getKeyManagers(); tlsParams.setKeyManagers(keyManagers); FiltersType filtersTypes = new FiltersType(); filtersTypes.getInclude().add(".*_EXPORT_.*"); filtersTypes.getInclude().add(".*_EXPORT1024_.*"); filtersTypes.getInclude().add(".*_WITH_DES_.*"); filtersTypes.getInclude().add(".*_WITH_NULL_.*"); filtersTypes.getExclude().add(".*_DH_anon_.*"); tlsParams.setCipherSuitesFilter(filtersTypes); httpConduit.setTlsClientParameters(tlsParams); } catch (Exception e) { e.printStackTrace(); } }
注意的是秘钥文件直接从客户端复制过来就好了。
记住写服务端的接口,直接把接口拿过来就行,然后直接调用。
看一下我的调用代码块
//调用webservice的接口 String address = "https://" + ip + ":12345/ws/ssl/loginService"; factoryBean.setAddress(address); factoryBean.setServiceClass(LoginService.class); Object obj = factoryBean.create(); LoginService loginService = (LoginService) obj; configureSSLOnTheClient(loginService);
这样就调用成功了,我写的是一个exe程序进行登录的,
**//判断用户名密码IP是否一致 (为1代表正确)
if (loginService.uloginService(username, mdpsw, ip) == 1) {
JOptionPane.showConfirmDialog(jf, “登陆成功”, “提示”, JOptionPane.YES_NO_OPTION);
PropertyConfigurator.configure(“.\src\log4j.properties”);
logger.info(“username” + “//” + LandingMain.username + “//” + “—–//loginTime” + “//” + new Date()
+ “—–//ip//” + LoadClass.getLocalIp());**
这样就完成了调用。
再说一下生成秘钥文件的步骤吧,什么理论概念原理什么的就不多说了。
步骤1:win+R打开小黑窗口
步骤2:keytool -genkey -alias android.keystore -keyalg RSA -validity 36500 -keystore test.keystore
注:
-genkey 生成文件。
-alias 别名。
-keyalg 加密算法。
-validity 有效期。
-keystore 文件名。
步骤3:依次填写密钥库口令、确认口令、姓名与姓氏、组织单位、城市或区域、省/市/自治区、国家/地区代码,最后如果正确的话填“y”,如果错误的话直接“Enter”下去,重新再填
注意:密钥库口令一定要记住,以后还会用到。
步骤4:把生成的文件放到项目对应的目录下直接读取就行了。
最后还有很关键的一步,就是jar包,jar包。
jar包木有办法上传,没有的程序猿们可以加我扣扣(329946197)探讨。
- webservice用main方法发布https接口
- 通过Main方法(Endpoint)发布webService服务器
- 用xfire快速发布WebService接口
- xfire发布webservice接口
- Webservice接口部署 、发布
- webservice接口的发布
- webservice:客户端调用https接口
- WebService 简捷开发接口发布
- 编写webservice发布服务接口
- 使用axis2发布webservice接口
- 用AXIS2发布WebService的方法
- 用AXIS2发布WebService的方法
- 用AXIS2发布WebService的方法
- 用AXIS2发布WebService的方法
- 用AXIS2发布WebService的方法
- 用AXIS2发布法WebService的方法
- 用AXIS2发布WebService的方法
- 用AXIS2发布WebService的方法
- Cocos2dx-3.x 打包编译到Android Studio
- unity生成怪物
- CSS —— 继承body 确保最高优先级
- WebStorm 打开Node.js的代码提示功能
- MySQL数据库主从同步
- webservice用main方法发布https接口
- leetcode解题方案--011--Container With Most Water
- 讲真,你真的懂JDBC吗?
- 菜鸟日常错误之点击Run直接跳到子活动界面而不是主活动
- Frida官方手册
- 详解iOS11、iPhone X、Xcode9 适配指南
- 影响数据库性能的因素以及解决方法
- 比特币老兵
- Unity3d灯光问题-一个模型上添加太多灯光出现问题