gpt4 book ai didi

java - 在没有应用程序服务器的情况下使用 javax.jws 保护 java 嵌入式 Web 服务

转载 作者:行者123 更新时间:2023-11-29 09:19:16 25 4
gpt4 key购买 nike

我编写了以下代码来实现一个 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 类的情况下,如何向消息添加 header 以要求客户端进行身份验证?

提前致谢


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

例如,当我检查任何 header 时:

SOAPHeader header = soapContext.getMessage().getSOAPPart().getEnvelope().getHeader();
Iterator<SOAPElement> iterator = 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());

MyHandler 是扩展Handler 接口(interface)的类。或者,您可以使用 @HandlerChain 注释,这将需要处理程序的 xml 配置文件。仅为传入消息配置此

public class MyHandler implements SOAPHandler{

@Override
public Set<?> getHeaders() {
// TODO Auto-generated method stub
return null;
}

@Override
public void close(MessageContext context) {
// TODO Auto-generated method stub

}

@Override
public boolean handleFault(MessageContext context) {
// TODO Auto-generated method stub
return false;
}

@Override
public boolean handleMessage(MessageContext context) {
System.out.println("Hehehe the handler");

SOAPMessageContext soapContext = (SOAPMessageContext)context;
try {
SOAPHeader header = soapContext.getMessage().getSOAPPart().getEnvelope().getHeader();
//Check there if the required data (username/password) is present in header or not and return true/false accordingly.
} catch (SOAPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}

}

同样从客户端来看,如果您的客户端正在使用 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);

此处链中的处理程序将向传出请求添加 header 。仅针对传出 消息配置此项。

关于java - 在没有应用程序服务器的情况下使用 javax.jws 保护 java 嵌入式 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7429453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com