JAX-WS实做webservice验证

在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("test"));
        headers.put("Password",
            Collections.singletonList("password"));
        req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);


在消息头中设置好MAP就可以了.


你可能感兴趣的:(JAX-WS实做webservice验证)