使用javax.jws保护java嵌入式web服务,而不使用应用程序服务器

使用javax.jws保护java嵌入式web服务,而不使用应用程序服务器,java,service,web,Java,Service,Web,我编写了以下代码来实现Java web服务,该服务与同一主机上用另一种语言编写的应用程序进行通信: import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; @WebService(name = "MyWebService") @SOAPBinding(par

我编写了以下代码来实现Java web服务,该服务与同一主机上用另一种语言编写的应用程序进行通信:

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService(name = "MyWebService") 
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 
public class MyWebService { 

    @WebMethod(operationName = "methodName", action = "urn:#methodName") 
    @WebResult(name = "result",  partName = "output") 
    public String methodName(@WebParam(name = "param1",  partName = "input")  String param1,
                                        @WebParam(name = "param2",  partName = "input")  String param2){

            // ...do something

        return "You called this service with params: "  + param1 + "," + param2;
    }
由于要求不使用应用服务器公开web服务,因此我从另一个类实例化了该服务,如下所示:

        Endpoint endpoint = Endpoint.create(new MyWebService());
        URL url = new URL("http://localhost:7777/MyWebService");
        endpoint.publish(url.toString());
问题:

1) 考虑到该项目的体系结构,使用用户名和密码保护该服务的最简单方法是什么? 任何代码示例都将不胜感激

2) 我做了一些研究,发现了SOAPHandler的用法,我认为它会对我有用。 在使用SOAPHandler类的情况下,如何向消息添加头以要求客户端进行身份验证

先谢谢你


非常感谢您的回复,这也是我要遵循的方向,但是

当我检查任何标题时,例如:

SOAPHeader header = soapContext.getMessage().getSOAPPart().getEnvelope().getHeader();
Iterator<SOAPElement> iterator = header.getAllAttributes();
SOAPHeader header=soapContext.getMessage().getSOAPPart().getEnvelope().getHeader();
迭代器迭代器=header.getAllAttributes();

我得到一个空指针异常…有什么想法吗?

我做了一个工作程序。为了补充您已经发现的内容,下面是一种使用处理程序的方法

Endpoint endpoint = Endpoint.create(new MyWebService());
        Binding binding = endpoint.getBinding();
        List<Handler> handlerChain = new ArrayList<Handler>(1);
        handlerChain.add(new MyHandler());
        binding.setHandlerChain(handlerChain);
        URL url = new URL("http://localhost:7777/MyWebService");
        endpoint.publish(url.toString());
从客户端来看,如果您的客户端使用JAB-WS,则必须使用客户端处理程序。下面是一个典型的JAX-WS客户端调用示例

Dispatch<Source> dispatch = … create a Dispatch<Source>
dispatch.getBinding().setHandlerChain(chain)
Source request = … create a Source object
Source response = dispatch.invoke(request);
Dispatch Dispatch=…创建调度
dispatch.getBinding().setHandlerChain(chain)
源请求=…创建源对象
源响应=dispatch.invoke(请求);

在这里,链中的处理程序将向传出请求添加头。仅为发出的消息配置此功能。

我执行了一个工作程序。为了补充您已经发现的内容,下面是一种使用处理程序的方法

Endpoint endpoint = Endpoint.create(new MyWebService());
        Binding binding = endpoint.getBinding();
        List<Handler> handlerChain = new ArrayList<Handler>(1);
        handlerChain.add(new MyHandler());
        binding.setHandlerChain(handlerChain);
        URL url = new URL("http://localhost:7777/MyWebService");
        endpoint.publish(url.toString());
从客户端来看,如果您的客户端使用JAB-WS,则必须使用客户端处理程序。下面是一个典型的JAX-WS客户端调用示例

Dispatch<Source> dispatch = … create a Dispatch<Source>
dispatch.getBinding().setHandlerChain(chain)
Source request = … create a Source object
Source response = dispatch.invoke(request);
Dispatch Dispatch=…创建调度
dispatch.getBinding().setHandlerChain(chain)
源请求=…创建源对象
源响应=dispatch.invoke(请求);

在这里,链中的处理程序将向传出请求添加头。仅为发出的消息配置此选项。

您所做的已经足够公平。
关于身份验证,您可以公开一种将用户名和密码作为登录凭据传递的方法。
一旦用户提供了正确的凭据,用户就已经过身份验证。
注意:现在您必须维护会话数据,并确保传入的请求来自经过身份验证的用户。
端点
只是在内部部署了一个轻量级http服务器。您必须设计web服务实现以保持请求之间的“状态”

你还有两个选择

  • 在SOAP级别执行身份验证。我真的不会推荐 信息技术但是如果您这样做,请注意,
    端点
    不会部署
    WSDL
    。因此,您必须准确地与连接的客户端进行通信, 您期望的
    SOAP
    头。不过,也可以通过以下方式编写
    WSDL
    您自己并将其“附加”到
    端点
  • 在http请求级别执行身份验证。即,添加令牌或 将cookie添加到http请求。老实说,我不记得这是不是 使用
    端点很容易

  • 你所做的很公平。
    关于身份验证,您可以公开一种将用户名和密码作为登录凭据传递的方法。
    一旦用户提供了正确的凭据,用户就已经过身份验证。
    注意:现在您必须维护会话数据,并确保传入的请求来自经过身份验证的用户。
    端点
    只是在内部部署了一个轻量级http服务器。您必须设计web服务实现以保持请求之间的“状态”

    你还有两个选择

  • 在SOAP级别执行身份验证。我真的不会推荐 信息技术但是如果您这样做,请注意,
    端点
    不会部署
    WSDL
    。因此,您必须准确地与连接的客户端进行通信, 您期望的
    SOAP
    头。不过,也可以通过以下方式编写
    WSDL
    您自己并将其“附加”到
    端点
  • 在http请求级别执行身份验证。即,添加令牌或 将cookie添加到http请求。老实说,我不记得这是不是 使用
    端点很容易

  • 如果这真的在本地主机上运行,我会(硬代码)服务器只接受来自本地主机的连接和/或将网络配置为不允许世界其他地区与此端口通信。我不能这样做,因为体系结构不由我决定,两个应用程序可能会在一天内以最快的方式重新定位。如果这真的在本地主机上运行,我会(硬代码)服务器只接受来自本地主机的连接和/或将网络配置为不允许世界其他地区与此端口通信。我不能这样做,因为体系结构不由我决定,两个应用程序可能会在一天内以最快的方式重新定位