JAX-WS实做webservice验证
发布时间:2020-12-17 00:17:00 所属栏目:安全 来源:网络整理
导读:在JAX WS标准中,做websevice变得容易,都是用注解等就可以实现了,其中用来做 webservice的权限也是很容易的,比如要根据用户名和密码才能访问ws,下面直接代码, 给出对应的例子,使用的是cxf了. 1 ws接口类 ? ?[code="java"] import javax.jws.WebMethod; import
在JAX WS标准中,做websevice变得容易,都是用注解等就可以实现了,其中用来做
webservice的权限也是很容易的,比如要根据用户名和密码才能访问ws,下面直接代码, 给出对应的例子,使用的是cxf了. 1 ws接口类 ? ?[code="java"] import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; ? @WebService @SOAPBinding(style = Style.RPC) public interface HelloWorld { ? ? @WebMethod ? ? String getHelloWorldMessage(); }? [/code] 2 WS 接口实现类: ? ?[code="java"] @WebService(endpointInterface = "com.ws.HelloWorld") public class HelloWorldImpl implements HelloWorld { ? ? @Resource ? ? WebServiceContext wsctx; ? ? @Override ? ? public String getHelloWorldMessage() { ? ? ? ? MessageContext mctx = wsctx.getMessageContext(); ? ? ? ? // 取得报文头 ? ? ? ? Map http_headers = ? ? ? ? ? ? (Map) mctx.get( ? ? ? ? ? ? MessageContext.HTTP_REQUEST_HEADERS); ? ? ? ? List<String> userList = (List) http_headers.get("Username"); ? ? ? ? List<String> passList = (List) http_headers.get("Password"); ? ? ? ? String username = ""; ? ? ? ? String password = ""; ? ? ? ? if (userList != null) { ? ? ? ? ? ? username = userList.get(0); ? ? ? ? } ? ? ? ? if (passList != null) { ? ? ? ? ? ? password = passList.get(0); ? ? ? ? } ? ? ? ? if (username.equals("test")&&password.equals("password")) { ? ? ? ? ? ? return "Hello " ? ? ? ? ? ? ? ? + username + ? ? ? ? ? ? ? ? " to world of Jax WS - Valid User!"; ? ? ? ? } else { ? ? ? ? ? ? return " User No Valid!"; ? ? ? ? } ? ? } ? }? [/code] ? 其中,其实就是取出header的信息取进行判断是否有这个权限了,很容易明白. 3 然后是发布这个ws ? ?[code="java"] ? public static void main(String[] args){ ? ? ? ?Endpoint.publish( ? ? ? ?"http://localhost:9000/ws/hello",new HelloWorldImpl()); ? ? ? ? ?} [/code] 4 客户端去调用这个WS,其中注意要用户名和密码的传递,这里为了简单,没用证书等了,只是示意,实际上是复杂多了: ? [code="java"] ?public class HelloWorldClient { ? ? private static final String WS_URL = ? ? ? ? ? ? "http://localhost:9000/ws/hello?wsdl"; ? ? public static void main(String[] args) throws Exception { ? ? ? ? URL url = new URL(WS_URL); ? ? ? ? QName qname = new QName( ? ? ? ? ? ? "http://ws.test.com/",? ? ? ? ? ? "HelloWorldImplService"); ? ? ? ? Service service = Service.create(url,qname); ? ? ? ? HelloWorld hello = service.getPort(HelloWorld.class); ? ? ? ? BindingProvider provider = (BindingProvider) hello; ? ? ? ? Map<String,Object> req_ctx = provider.getRequestContext(); ? ? ? ? req_ctx.put( ? ? ? ? BindingProvider.ENDPOINT_ADDRESS_PROPERTY,WS_URL); //调用的用户名和密码,用map Map<String,List<String>> headers = new HashMap<String,List<String>>(); ? ? ? ? headers.put("Username",Collections.singletonList("test")); ? ? ? ? headers.put("Password",? ? ? ? ? ? Collections.singletonList("password")); ? ? ? ? req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS,headers); ? ? } } [/code] ? 其实核心就是: ? headers.put("Username",? ? ? ? ? ? Collections.singletonList("password")); ? ? ? ? req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS,headers); 在消息头中设置好MAP就可以了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |