http://127.0.0.1:8080/web/services  这样可以列出所有方法比如int  add(String  sql){
}
我在桌面程序客户端,可以直接调用这个方法,怎样防止别人调用这个方法呢?

解决方案 »

  1.   

    如楼上所言,配置WS-Security;
    sun公司有下载的,他是webservices安全的保证哦,哈哈
      

  2.   

    关于WebService安全,有很多框架来实现,比如wss4j等,可以有很多action来控制 ,比如UsernameToken、Encrypt和Signature等。
      

  3.   

    上边正解,实现web service可以有很多技术,xfire,cxf,axis等,都会提供一些加密和认证的方法的,比如wss4j
      

  4.   

    可以简单地用登陆用户验证来做。客户端:
    webserivice项目名是:ClientDemo_WebServiceSoapHeader
    package client;import org.codehaus.xfire.MessageContext;
    import org.codehaus.xfire.handler.AbstractHandler;
    import org.jdom.Element;public class ClientAuthenticationHandler extends AbstractHandler { private String username = null;
    private String password = null; public ClientAuthenticationHandler() {
    } public ClientAuthenticationHandler(String username, String password) {
    this.username = username;
    this.password = password;
    } public void setUsername(String username) {
    this.username = username;
    } public void setPassword(String password) {
    this.password = password;
    } public void invoke(MessageContext context) throws Exception { // 为SOAP Header构造验证信息
    Element el = new Element("header");
    context.getOutMessage().setHeader(el);
    Element auth = new Element("AuthenticationToken");
    Element username_el = new Element("Username");
    username_el.addContent(username);
    Element password_el = new Element("Password");
    password_el.addContent(password);
    auth.addContent(username_el);
    auth.addContent(password_el);
    el.addContent(auth);
    }
    }package client;import java.net.MalformedURLException;
    import java.util.Collection;
    import java.util.HashMap;
    import javax.xml.namespace.QName;
    import org.codehaus.xfire.XFireRuntimeException;
    import org.codehaus.xfire.aegis.AegisBindingProvider;
    import org.codehaus.xfire.annotations.AnnotationServiceFactory;
    import org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations;
    import org.codehaus.xfire.client.Client;
    import org.codehaus.xfire.client.XFireProxyFactory;
    import org.codehaus.xfire.jaxb2.JaxbTypeRegistry;
    import org.codehaus.xfire.service.Endpoint;
    import org.codehaus.xfire.service.Service;
    import org.codehaus.xfire.soap.AbstractSoapBinding;
    import org.codehaus.xfire.transport.TransportManager;
    import cal.UserInfo;public class AddTwoIntegerClient {    private static XFireProxyFactory proxyFactory = new XFireProxyFactory();
        private HashMap endpoints = new HashMap();
        private Service service0;    public AddTwoIntegerClient() {
            create0();
            Endpoint AddTwoIntegerHttpPortEP = service0 .addEndpoint(new QName("http://cal", "AddTwoIntegerHttpPort"), new QName("http://cal", "AddTwoIntegerHttpBinding"), "http://127.0.0.1:8001/ServerDemo_WebServiceSoapHeader/services/AddTwoInteger");
            endpoints.put(new QName("http://cal", "AddTwoIntegerHttpPort"), AddTwoIntegerHttpPortEP);
            Endpoint AddTwoIntegerPortTypeLocalEndpointEP = service0 .addEndpoint(new QName("http://cal", "AddTwoIntegerPortTypeLocalEndpoint"), new QName("http://cal", "AddTwoIntegerPortTypeLocalBinding"), "xfire.local://AddTwoInteger");
            endpoints.put(new QName("http://cal", "AddTwoIntegerPortTypeLocalEndpoint"), AddTwoIntegerPortTypeLocalEndpointEP);
        }    public Object getEndpoint(Endpoint endpoint) {
            try {
                return proxyFactory.create((endpoint).getBinding(), (endpoint).getUrl());
            } catch (MalformedURLException e) {
                throw new XFireRuntimeException("Invalid URL", e);
            }
        }    public Object getEndpoint(QName name) {
            Endpoint endpoint = ((Endpoint) endpoints.get((name)));
            if ((endpoint) == null) {
                throw new IllegalStateException("No such endpoint!");
            }
            return getEndpoint((endpoint));
        }    public Collection getEndpoints() {
            return endpoints.values();
        }    private void create0() {
            TransportManager tm = (org.codehaus.xfire.XFireFactory.newInstance().getXFire().getTransportManager());
            HashMap props = new HashMap();
            props.put("annotations.allow.interface", true);
            AnnotationServiceFactory asf = new AnnotationServiceFactory(new Jsr181WebAnnotations(), tm, new AegisBindingProvider(new JaxbTypeRegistry()));
            asf.setBindingCreationEnabled(false);
            service0 = asf.create((client.AddTwoIntegerPortType.class), props);
            {
                AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://cal", "AddTwoIntegerPortTypeLocalBinding"), "urn:xfire:transport:local");
            }
            {
                AbstractSoapBinding soapBinding = asf.createSoap11Binding(service0, new QName("http://cal", "AddTwoIntegerHttpBinding"), "http://schemas.xmlsoap.org/soap/http");
            }
        }    public AddTwoIntegerPortType getAddTwoIntegerHttpPort() {
            return ((AddTwoIntegerPortType)(this).getEndpoint(new QName("http://cal", "AddTwoIntegerHttpPort")));
        }    public AddTwoIntegerPortType getAddTwoIntegerHttpPort(String url) {
            AddTwoIntegerPortType var = getAddTwoIntegerHttpPort();
            org.codehaus.xfire.client.Client.getInstance(var).setUrl(url);
            return var;
        }    public AddTwoIntegerPortType getAddTwoIntegerPortTypeLocalEndpoint() {
            return ((AddTwoIntegerPortType)(this).getEndpoint(new QName("http://cal", "AddTwoIntegerPortTypeLocalEndpoint")));
        }    public AddTwoIntegerPortType getAddTwoIntegerPortTypeLocalEndpoint(String url) {
            AddTwoIntegerPortType var = getAddTwoIntegerPortTypeLocalEndpoint();
            org.codehaus.xfire.client.Client.getInstance(var).setUrl(url);
            return var;
        }    public static void main(String[] args) {
                    AddTwoIntegerClient client = new AddTwoIntegerClient();        
    //create a default service endpoint
            AddTwoIntegerPortType service = client.getAddTwoIntegerHttpPort();        
    //TODO: Add custom client code here
             //
             //service.yourServiceOperationHere();
            UserInfo u = new UserInfo();
            Client c = Client.getInstance(service);
    //        c.addOutHandler(new ClientAuthenticationHandler("abcd","1234")); 
            c.addOutHandler(new ClientAuthenticationHandler("abcd","1234")); 
            
            int i = service.add(1,2);
    System.out.println(i);
             System.exit(0);
        }}服务端:
    webserivice项目名是ServerDemo_WebServiceSoapHeader
    package cal;import org.codehaus.xfire.MessageContext;
    import org.codehaus.xfire.handler.AbstractHandler;
    import org.jdom.Element;public class AuthenticationHandler extends AbstractHandler { public void invoke(MessageContext cfx) throws Exception {
    if (cfx.getInMessage().getHeader() == null) {
    throw new org.codehaus.xfire.fault.XFireFault("header为空",
    org.codehaus.xfire.fault.XFireFault.SENDER);
    }
    Element token = cfx.getInMessage().getHeader().getChild(
    "AuthenticationToken");
    if (token == null) {
    throw new org.codehaus.xfire.fault.XFireFault("HEADER名不存在",
    org.codehaus.xfire.fault.XFireFault.SENDER);
    } String username = token.getChild("Username").getValue();
    String password = token.getChild("Password").getValue(); try {
    // 进行身份验证 ,只有abcd@1234的用户为授权用户
    if (username.equals("abcd") && password.equals("1234"))
    // 这语句不显示
    System.out.println("身份验证通过");
    else
    throw new Exception();
    } catch (Exception e) {
    throw new org.codehaus.xfire.fault.XFireFault("非法的用户名和密码",
    org.codehaus.xfire.fault.XFireFault.SENDER);
    } }
    }不清楚的话:Email to: [email protected]