在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就可以了.
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就可以了.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。