`
wowlinda80
  • 浏览: 62082 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

WebService CXF3 范例

    博客分类:
  • JAVA
阅读更多
有几个原则:
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 CXF详解与入门】 WebService是一种允许不同系统之间进行通信和交互的标准协议,它基于HTTP协议,使得应用程序可以无视具体实现细节地调用互联网上的服务。这种技术使得分布式应用程序的发展成为可能,...

    WebService CXF 详细教程

    **WebService CXF 详解** **一、WebService简介** WebService是一种基于标准的,可以在不同操作系统、编程语言之间交换数据的Web应用程序。它通过WSDL(Web服务描述语言)定义了服务接口,利用SOAP(简单对象访问...

    webservice cxf_demo

    【标题】"webservice cxf_demo" 涉及到的是使用Apache CXF框架创建的Web服务示例项目。在Web服务的世界里,CXF是一个流行的开源工具,它支持SOAP和RESTful风格的服务,用于构建和消费Web服务。这个"CXF_demo"很可能...

    WebService CXF学习文档

    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

    ### WebService CXF与Servlet集成详解 #### 一、项目准备与搭建 ##### 1. 创建Web Project - **项目命名**:首先,在开发环境中创建一个新的Web项目,并将其命名为`cxf_bigdata`。 ##### 2. 目录结构 - 项目的...

    WebService CXF 对象传递 附

    **WebService CXF 对象传递详解** 在Web服务领域,CXF是一个非常重要的开源框架,它允许开发者创建和消费各种Web服务。CXF支持SOAP、RESTful等多种通信模式,并且能够处理复杂的对象传递,使得Web服务的数据交换...

    webService(基于cxf)的完整例子

    3. **创建Web服务**:在CXF中,可以通过注解或XML配置文件定义服务接口和服务实现。例如,可以使用`@WebService`注解标记一个Java类为Web服务接口,并使用`@Path`注解来定义RESTful服务的URL路径。 4. **CXF服务...

    webservice cxf.jar 相关包

    3. 插件支持:CXF有丰富的插件系统,可以集成到IDE如Eclipse中,方便开发和调试。 4. 编码解码:CXF支持多种数据绑定技术,如JAXB(Java Architecture for XML Binding)和Aegis,用于XML与Java对象之间的转换。 5. ...

    WebService CXF 对应版本及资源

    WebService CXF 用了一天时间找,官网打不开,国内要积分,下下来又永不了。最后终于搞到手,上传上来分享给大家。 jdk版本 CXF版本 java 9及以上 3.3.x java 8 3.x java 7 2.2x --- 3.2之前版本 java 6 3.1 ...

    Java webservice cxf客户端调用demo和服务端

    3. 配置服务:使用CXF提供的注解(如`@WebService`)标记接口和实现类,指定服务的元数据,如服务名、端点地址等。 4. 发布服务:通过CXF的Server类实例化并启动服务,使其可供客户端调用。 **客户端调用:** 1. ...

    WebService CXF 开发教程

    WebService CXF 开发教程 eclipse插件配置 开发及代码说明

    webservice cxf 整合spring例子源代码

    3. **服务接口与实现**:定义Web服务的接口,通常是一个JAX-WS的@WebService注解的Java接口。接口的实现类则提供具体的功能。Spring可以帮助管理这些bean,包括依赖注入和事务控制。 4. **发布Web服务**:在Spring...

    WebService CXF --- 传输文件MTOM

    WebService CXF,全称Apache CXF,是一款开源的Java框架,用于构建和开发Web服务。它支持多种协议和规范,包括SOAP、RESTful、XML以及Web服务标准如WS-*。在"WebService CXF --- 传输文件MTOM"这个主题中,我们将...

    webservice-cxf-spring-jar.zip

    3. **CXF与Spring的集成**:在Spring环境中,CXF可以通过Spring的Bean定义来配置,这简化了服务端点的创建和管理。同时,Spring容器可以处理CXF服务的生命周期,包括初始化、启动和停止。 4. **Web服务协议**:CXF...

    webservice cxf jar包

    【标题】"Webservice CXF Jar包"是一个用于构建Web服务的开源框架,它整合了Apache CXF项目的核心库。这个包中包含了多个组件和依赖,以支持开发、部署和运行基于SOAP和RESTful风格的Web服务。 【描述】提到的...

    WebService CXF使用说明

    【WebService CXF 使用详解】 WebService CXF 是一个开源框架,用于构建和开发符合 WS-* 标准的 Web 服务。它提供了丰富的功能,包括支持多种协议和服务风格,以及与 Spring 框架的深度集成。CXF 允许开发者轻松地...

    webservice cxf的demo和相关文档

    最近公司要用到webservice ,最后经过对比、考虑选择cxf,最近在网上找了一些资料写的很零散,如果是新手的话还得查很多资料,比较麻烦,所以将cxf开发中使用的资料和要用到的工具与大家分享,并附上自己测试的demo,以...

    webservice_cxf Demo

    3. **CXF 的工作流程** - **服务定义**:首先,我们需要定义 Web 服务的接口,这通常是一个 Java 接口,包含将要暴露给客户端调用的方法。 - **WSDL 生成**:CXF 可以根据 Java 接口自动生成 WSDL 文件,这是 Web ...

    webservice cxf 开发实战

    【标题】"WebService CXF 开发实战"涵盖了在Java环境中使用Apache CXF框架进行Web服务开发的关键技术。Apache CXF是一个开源项目,它提供了一种简单且强大的方式来实现和消费SOAP和RESTful Web服务。CXF允许开发者...

    SpringBoot WebService cxf接口发布以及logbok日志集成

    在IT行业中,SpringBoot、WebService和cxf是三个非常重要的技术组件,它们分别代表了现代Java应用程序开发的基础、服务间通信的重要方式以及一种强大的服务框架。在这个主题中,我们将深入探讨如何在SpringBoot项目...

Global site tag (gtag.js) - Google Analytics