有几个原则:
1. 统一接口、统一方法、统一加密解密方式、统一WebService安全认证方式
新工程确认jar是否存在 sxnic-ws-xxx.jar(此包中包括接口、安全认证、WebService客户工具类) sxnic-comm-3.0.0.jar(此包包括Base64加密解密工具类及Json工具类)
2.加密解密要求:客户端对三个参数都加密,服务端返回的json中只加密业务数据,对status和message不加密
接口如下,仅供参考,无需自己创建
@WebService
public interface SxnicWebService {
/**
*
* @param siteCode 子系统的编码
* @param func 调用方法名
* @param params
* @return
*/
public String execute(String siteCode,String func,String params);
}
服务端配置
首先实现WebService接口,如下
@WebService
@Service("UcenterNewWebServiceBean")
public class UcenterNewWebServiceImpl implements SxnicWebService {
private static Logger logger = LoggerFactory.getLogger(UcenterNewWebServiceImpl.class);
@Autowired
private WebsiteManager siteManager;
@Autowired
private UserExtManager ueManager;
@Autowired
private UserManager userManager;
private String msg;
private String result;
@Override
public String execute(String siteCode, String func, String params) {
logger.debug("===UcenterNewWebServiceImpl===execute start===");
msg = "200";
result = "";
innoExecute(siteCode, func, params);
if ("200".equals(msg)) {
// 无需回传数据
if (StringUtils.isBlank(result)) {
logger.debug("===UcenterNewWebServiceImpl===处理成功,无需返回数据直接返回Json===");
result = MsgUtils.crtSuccessMsg("json");
} else {
logger.debug("===UcenterNewWebServiceImpl===处理成功,需返回业务数据===");
result = MsgUtils.crtSuccessMsg(Base64Utils.encode(result), "json");
}
} else {
logger.warn("===UcenterNewWebServiceImpl===errorCode:{}===", msg);
result = MsgUtils.crtErrorMsg(msg, "json");
}
logger.debug("===UcenterNewWebServiceImpl===execute end===status:" + msg);
return result;
}
public void innoExecute(String siteCode, String func, String params) {
try {
if (StringUtils.isBlank(siteCode) || StringUtils.isBlank(func)) {
msg = "450";
return;
}
// 解密
siteCode = Base64Utils.dccode(siteCode);
func = Base64Utils.dccode(func);
if (StringUtils.isNotBlank(params)) {
params = Base64Utils.dccode(params);
if (JsonUtils.isBadJson(params)) {
msg = "451";
return;
}
}
logger.debug("===UcenterNewWebServiceImpl===参数={}={}={}", new String[] { siteCode, func, params });
// 验证siteCode合法性
if (!"dcenter".equals(siteCode) && !WsConstants.WEBSITE_MAP.containsKey(siteCode)) {
msg = "452";
return;
}
Gson gson = new Gson();
// 判断func
if ("getWebSite".equals(func)) {
// params参数解析,如果没有参数表示查询所有的,如果有参数那么设定参数格式"code":"c1,c2,c3"
// 具体方法调用
if (StringUtils.isBlank(params)) {
result = UcenterWsUtils.WebsiteListtoJson(siteManager.findBy("enabled", true));
} else {
String[] codes = StringUtils.split(StringUtils.substringBetween(params, ":\"", "\""), ",");
HibernateCriteria hc = new HibernateCriteria();
hc.add(Restrictions.in("code", codes));
result = UcenterWsUtils.WebsiteListtoJson(siteManager.getByCriteria(hc));
}
} else if ("getDept".equals(func)) {
// 组织机构
if (StringUtils.isBlank(params)) {
result = UcenterWsUtils.UserExttoJson(ueManager.findBy("userType", UserExt.USERTYPE_XZDW));
}
} else if ("login".equals(func)) {
Map<String, String> map = gson.fromJson(params, Map.class);
// 登陆授权
String usn = map.get("usn");
String pwd = map.get("pwd");
// 判断参数是否有效
if (StringUtils.isBlank(usn) || StringUtils.isBlank(pwd)) {
msg = "201";
return;
}
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(usn, pwd, false);
try {
subject.login(token);
} catch (UnknownAccountException ex) {
msg = "210";
return;
} catch (LockedAccountException lae) {
msg = "211";
return;
} catch (AuthenticationException e) {
msg = "212";
return;
} catch (Exception exp) {
msg = "212";
return;
}
String username = subject.getPrincipal().toString();
User user = userManager.findByUnique("username", username);
if (user != null) {
// 设置user的最后登录时间
user.setLastLoginDate(new Date());
user.setLastLoginClient("wsuc_" + siteCode);
userManager.save(user);
}
result = "{\"roles\":\"" + user.getStringRoles() + "\"}";
} else if ("creUser".equals(func)) {
// 创建用户
Map<String, String> map = gson.fromJson(params, Map.class);
// 登陆授权
String username = map.get("username");
String password = map.get("password");
String email = map.get("email");
if (StringUtils.isBlank(username) || StringUtils.isBlank(password) || StringUtils.isBlank(email)) {
msg = "201";
return;
}
User user = userManager.getUserByUsername((String) map.get("username"));
if (user != null) {
msg = "218";
return;
}
user = userManager.getUserByEmail((String) map.get("email"));
if (user != null) {
msg = "219";
return;
}
user = new User();
user.setUsername((String) map.get("username"));
user.setFullname((String) map.get("fullname"));
user.setPassword((String) map.get("password"));
user.setEmail((String) map.get("email"));
// user.setIdcard((String)map.get("idcard"));
user.setProblem((String) map.get("problem"));
user.setAnswer((String) map.get("answer"));
user.setWebsiteId(siteCode);
user.setPassword(DigestUtils.md5Hex(user.getPassword()));// 对用户+密码加密
user.setPriority(10);
user.setUserOrder(1000);
user.setEnabled(true);
user.setCreationDate(new Date());
try {
userManager.save(user);
} catch (Exception e) {
msg = "220";
return;
}
} else {
// func错误
msg = "453";
return;
}
} catch (DecodeException e) {
msg = "450";
return;
} catch (Exception e) {
msg = "500";
return;
}
}
}
spring-cxf配置文件
<jaxws:endpoint id="nucenterSerivce" implementor="#UcenterNewWebServiceBean"
address="/nwsuc">
<jaxws:inInterceptors>
<bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />
<ref bean="sxnicWsAuthHandler" />
</jaxws:inInterceptors>
</jaxws:endpoint>
<bean id="sxnicWsAuthHandler" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="passwordType" value="PasswordText" />
<entry key="passwordCallbackRef">
<ref bean="wsServerAuthHandler" />
</entry>
</map>
</constructor-arg>
</bean>
客户端
工具类WsClientUtils
包括两个常用的方式:getUcenterService获取用户中心Service 和 getDcenterService获取数据中心Service
注意上述两方法需要在属性表中有两个参数:ucenter.wsurl 和dcenter.wsurl
客户端Demo(带安全认证)
/**
* 根据WebService的URL建立客户端
*
* @param url
* @return
* @throws WebServiceException
*/
public static SxnicWebService getServiceByUrl(String url) throws WebServiceException {
try {
JaxWsProxyFactoryBean svr = new JaxWsProxyFactoryBean();
svr.setServiceClass(SxnicWebService.class);
svr.setAddress(url);
Map<String, Object> props = new HashMap<String, Object>();
props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
// 这个WSHandlerConstants.USER 变量暂时不知道什么作用,但是必须有
props.put(WSHandlerConstants.USER, "sxnic");
props.put(WSHandlerConstants.PASSWORD_TYPE, "PasswordText");
props.put(WSHandlerConstants.PW_CALLBACK_CLASS, WsClientAuthHandler.class.getName());
WSS4JOutInterceptor oi = new WSS4JOutInterceptor(props);
svr.getOutInterceptors().add(new SAAJOutInterceptor());
svr.getOutInterceptors().add(oi);
return (SxnicWebService) svr.create();
} catch (Exception e) {
throw new WebServiceException("===WebService客户端构建异常!===");
}
}
工具类:
public class UcenterWsUtils {
/**
* 把WebSite子站点List转换为Json
* @param list
* @return
*/
public static String WebsiteListtoJson(List<Website> list) {
if (list == null || list.size() == 0) {
return "{}";
}
StringBuffer sb = new StringBuffer();
sb.append("[");
for (Website ws : list) {
sb.append("{");
sb.append("\"code\":\"" + ws.getCode() + "\",");
sb.append("\"name\":\"" + ws.getName() + "\",");
sb.append("\"str1\":\"" + (StringUtils.isBlank(ws.getTokenCode()) ? "token" : ws.getTokenCode()) + "\",");
sb.append("\"str2\":\"" + (StringUtils.isBlank(ws.getUrl()) ? "url" : ws.getUrl()) + "\",");
sb.append("\"str3\":\"" + (StringUtils.isBlank(ws.getWsurl()) ? "wsurl" : ws.getWsurl()) + "\"},");
}
return StringUtils.removeEnd(sb.toString(), ",") + "]";
}
/**
* 把服务器返回来的Json中data部分,转化为map,适用于data部分加密的情况下
* @param json
* @return
*/
public static Map<String, WrapperBean> JsonDatatoWebsiteMap(String json) {
if (JsonUtils.isBadJson(json)) {
return null;
}
Gson gson = new Gson();
Map<String, WrapperBean> map = new HashMap<String, WrapperBean>();
List<WrapperBean> list = gson.fromJson(json, new TypeToken<List<WrapperBean>>() {
}.getType());
for (WrapperBean b : list) {
map.put(b.getCode(), b);
}
return map;
}
/**
* 把服务器返回来的Json,转化为map,json不加密的情况下
* @param json
* @return
*/
public static Map<String, WrapperBean> JsontoWebsiteMap(String json) {
Map<String, WrapperBean> map = new HashMap<String, WrapperBean>();
if (JsonUtils.isBadJson(json)) {
return null;
}
Gson gson = new Gson();
Map<String, Object> map1 = gson.fromJson(json, Map.class);
List<Map> listmap = (List<Map>) map1.get("data");
for (Map u : listmap) {
WrapperBean b = gson.fromJson(u.toString(), WrapperBean.class);
map.put(b.getCode(), b);
}
return map;
}
}
WebService实现类的单元测试
public class UcenterNewWsImplTest extends CommSpringJunitTest {
@Autowired
private SxnicWebService service;
@Autowired
private BaseCodeManager bcManager;
@Autowired
private PropertyManager ptManager;
@Autowired
private WebsiteManager siteManager;
String token = "";
String func = "";
String params = "";
@Test
public void testGetWebSite() {
bcManager.initNoYear();
CommConstant.PROPERTY_MAP = ptManager.init();
//清空数据
siteManager.clear();
//准备数据
Website w = new Website();
w.setCode("ucenter");
w.setName("用户中心");
w.setWsurl("wsurl");
w.setUrl("url");
w.setTokenCode("tokenCode-ucenter");
siteManager.save(w);
w = new Website();
w.setCode("shenbao");
w.setName("申报系统");
w.setWsurl("wsurl");
w.setUrl("url");
w.setTokenCode("tokenCode-shenbao");
siteManager.save(w);
token = Base64Utils.encode("dcenter");
func = Base64Utils.encode("getWebSite");
params = "";
//方法调用
String result = service.execute(token, func, params);
//结果解析
Gson gson = new Gson();
Map<String, Object> map = gson.fromJson(result, Map.class);
//结果验证
Assert.assertEquals("200", map.get("status"));
String data = Base64Utils.dccode(String.valueOf(map.get("data")));
List<WrapperBean> list = gson.fromJson(data, new TypeToken<List<WrapperBean>>() {
}.getType());
Assert.assertEquals(2, list.size());
Assert.assertEquals("ucenter", list.get(0).getCode());
Map<String, WrapperBean> map1 = UcenterWsUtils.JsonDatatoWebsiteMap(data);
Assert.assertEquals(2, map1.size());
Assert.assertTrue(map1.containsKey("shenbao"));
Assert.assertEquals("用户中心", map1.get("ucenter").getName());
}
}
分享到:
相关推荐
【WebService CXF详解与入门】 WebService是一种允许不同系统之间进行通信和交互的标准协议,它基于HTTP协议,使得应用程序可以无视具体实现细节地调用互联网上的服务。这种技术使得分布式应用程序的发展成为可能,...
**WebService CXF 详解** **一、WebService简介** WebService是一种基于标准的,可以在不同操作系统、编程语言之间交换数据的Web应用程序。它通过WSDL(Web服务描述语言)定义了服务接口,利用SOAP(简单对象访问...
【标题】"webservice cxf_demo" 涉及到的是使用Apache CXF框架创建的Web服务示例项目。在Web服务的世界里,CXF是一个流行的开源工具,它支持SOAP和RESTful风格的服务,用于构建和消费Web服务。这个"CXF_demo"很可能...
WebService CXF学习——入门篇 1.CXF由来 2.HelloWorld 3.WSDL描述 WebService CXF学习——进阶篇 1.SOAP讲解 2.JAX-WS讲解 3.对象传递 WebService CXF学习——高级篇(一)(二) 1.整合Spring框架 2.CXF...
### WebService CXF与Servlet集成详解 #### 一、项目准备与搭建 ##### 1. 创建Web Project - **项目命名**:首先,在开发环境中创建一个新的Web项目,并将其命名为`cxf_bigdata`。 ##### 2. 目录结构 - 项目的...
**WebService CXF 对象传递详解** 在Web服务领域,CXF是一个非常重要的开源框架,它允许开发者创建和消费各种Web服务。CXF支持SOAP、RESTful等多种通信模式,并且能够处理复杂的对象传递,使得Web服务的数据交换...
3. **创建Web服务**:在CXF中,可以通过注解或XML配置文件定义服务接口和服务实现。例如,可以使用`@WebService`注解标记一个Java类为Web服务接口,并使用`@Path`注解来定义RESTful服务的URL路径。 4. **CXF服务...
3. 插件支持:CXF有丰富的插件系统,可以集成到IDE如Eclipse中,方便开发和调试。 4. 编码解码:CXF支持多种数据绑定技术,如JAXB(Java Architecture for XML Binding)和Aegis,用于XML与Java对象之间的转换。 5. ...
WebService CXF 用了一天时间找,官网打不开,国内要积分,下下来又永不了。最后终于搞到手,上传上来分享给大家。 jdk版本 CXF版本 java 9及以上 3.3.x java 8 3.x java 7 2.2x --- 3.2之前版本 java 6 3.1 ...
3. 配置服务:使用CXF提供的注解(如`@WebService`)标记接口和实现类,指定服务的元数据,如服务名、端点地址等。 4. 发布服务:通过CXF的Server类实例化并启动服务,使其可供客户端调用。 **客户端调用:** 1. ...
WebService CXF 开发教程 eclipse插件配置 开发及代码说明
3. **服务接口与实现**:定义Web服务的接口,通常是一个JAX-WS的@WebService注解的Java接口。接口的实现类则提供具体的功能。Spring可以帮助管理这些bean,包括依赖注入和事务控制。 4. **发布Web服务**:在Spring...
WebService CXF,全称Apache CXF,是一款开源的Java框架,用于构建和开发Web服务。它支持多种协议和规范,包括SOAP、RESTful、XML以及Web服务标准如WS-*。在"WebService CXF --- 传输文件MTOM"这个主题中,我们将...
3. **CXF与Spring的集成**:在Spring环境中,CXF可以通过Spring的Bean定义来配置,这简化了服务端点的创建和管理。同时,Spring容器可以处理CXF服务的生命周期,包括初始化、启动和停止。 4. **Web服务协议**:CXF...
【标题】"Webservice CXF Jar包"是一个用于构建Web服务的开源框架,它整合了Apache CXF项目的核心库。这个包中包含了多个组件和依赖,以支持开发、部署和运行基于SOAP和RESTful风格的Web服务。 【描述】提到的...
【WebService CXF 使用详解】 WebService CXF 是一个开源框架,用于构建和开发符合 WS-* 标准的 Web 服务。它提供了丰富的功能,包括支持多种协议和服务风格,以及与 Spring 框架的深度集成。CXF 允许开发者轻松地...
最近公司要用到webservice ,最后经过对比、考虑选择cxf,最近在网上找了一些资料写的很零散,如果是新手的话还得查很多资料,比较麻烦,所以将cxf开发中使用的资料和要用到的工具与大家分享,并附上自己测试的demo,以...
3. **CXF 的工作流程** - **服务定义**:首先,我们需要定义 Web 服务的接口,这通常是一个 Java 接口,包含将要暴露给客户端调用的方法。 - **WSDL 生成**:CXF 可以根据 Java 接口自动生成 WSDL 文件,这是 Web ...
【标题】"WebService CXF 开发实战"涵盖了在Java环境中使用Apache CXF框架进行Web服务开发的关键技术。Apache CXF是一个开源项目,它提供了一种简单且强大的方式来实现和消费SOAP和RESTful Web服务。CXF允许开发者...
在IT行业中,SpringBoot、WebService和cxf是三个非常重要的技术组件,它们分别代表了现代Java应用程序开发的基础、服务间通信的重要方式以及一种强大的服务框架。在这个主题中,我们将深入探讨如何在SpringBoot项目...