最近自己在学习CXFWebService,现在服务端发布成功,客户端也能成功调用。我没用Spring发布,通过JaxWsServerFactoryBean 发布的,现在面临的问题就是,如何保证客户端的调用安全性,只允许通过验证的客户端调用我的服务,我的问题就是这个验证应该怎么做。虚心向大家学习下,我也是刚刚接触WebService,希望大家能提供下帮助,谢谢了!
2条回答 默认 最新
- Dead_Knight 2013-08-23 07:33关注
用WSS4J的安全handler处理即可。
服务端定义:
[code="java"]
jaxws:serviceBean
/jaxws:serviceBean
jaxws:inInterceptors
/jaxws:inInterceptors
jaxws:outInterceptors
/jaxws:outInterceptors
/jaxws:server
[/code]
注意:ServerPasswordCallback实现CallbackHandler接口
[code="java"]
import java.io.IOException;import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;import org.apache.ws.security.WSPasswordCallback;
public class ServerPasswordCallback implements CallbackHandler {
@Override
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
if("wsbs".equals(pc.getIdentifier())){
pc.setPassword("111111");
}
}}
[/code]客户端调用:
调用时,需要增加输出的WSS4J的拦截,如:
[code="java"]
JaxWsProxyFactoryBean bean = new JaxWsProxyFactoryBean();
bean.getInInterceptors().add(new LoggingInInterceptor());
bean.getInFaultInterceptors().add(new LoggingOutInterceptor());
bean.setServiceClass(getServiceClass());
bean.setAddress(url + getServiceURI());
log.info(bean.getAddress());
Object proxy = bean.create();
ClientProxy clientProxy = (ClientProxy)Proxy.getInvocationHandler(proxy);
Client client = clientProxy.getClient();
client.getOutInterceptors().add(new SAAJOutInterceptor());
client.getOutInterceptors().add(new WSS4JOutInterceptor(environment));
[/code]
注意:environment为HashMap的对象,用于设置环境变量
[code="java"]
environment.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
environment.put(WSHandlerConstants.USER, Config.getProperty(REMOTE_USER));
environment.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
environment.put(WSHandlerConstants.PW_CALLBACK_CLASS, ClientPasswordHandler.class.getName());
[/code]
ClientPasswordHandler与ServerPasswordCallback写法类似。网上有一些例子,你参考一下,应该差不多
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 在若依框架下实现人脸识别
- ¥15 网络科学导论,网络控制
- ¥100 安卓tv程序连接SQLSERVER2008问题
- ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
- ¥15 metadata提取的PDF元数据,如何转换为一个Excel
- ¥15 关于arduino编程toCharArray()函数的使用
- ¥100 vc++混合CEF采用CLR方式编译报错
- ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
- ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
- ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同