在JAX WS标准中,做websevice变得容易,都是用注解等就可以实现了,其中用来做
webservice的权限也是很容易的,比如要根据用户名和密码才能访问ws,下面直接代码,
给出对应的例子,使用的是cxf了.
1 ws接口类
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();
}
2 WS 接口实现类:
@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!";
}
}
}
其中,其实就是取出header的信息取进行判断是否有这个权限了,很容易明白.
3 然后是发布这个ws
public static void main(String[] args){
Endpoint.publish(
"http://localhost:9000/ws/hello", new HelloWorldImpl());
}
4 客户端去调用这个WS,其中注意要用户名和密码的传递,这里为了简单,没用证书等了,
只是示意,实际上是复杂多了:
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);
}
}
其实核心就是:
headers.put("Username", Collections.singletonList("test"));
headers.put("Password",
Collections.singletonList("password"));
req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
在消息头中设置好MAP就可以了.