在我们的项目中,我们使用ApacheCXF框架实现了SOAP Web服务。客户端用于请求服务器执行某些命令。请求由主机、端口和用于连接的协议组成。如果客户机使用HTTPS配置的端口号,并将协议指定为HTTP,那么我们会得到一个连接被拒绝-套接字异常。但是,我需要抛出一条正确的错误消息,比如“无法使用http协议连接到端口为“ABC”的主机“XYZ”。为此,我需要从tomcat服务器获取配置好的http和https端口号。xml文件,然后将其与我的请求参数进行比较。
有人能帮我把它找回来吗?
可以通过这种方式在运行时访问Tomcat核心类(对于Tomcat 7,我没有使用Tomcat 8进行测试):
import java.lang.management.ManagementFactory;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.apache.catalina.Service;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardServer;
import org.apache.log4j.Logger;
public class TomcatConnectors {
public static final String CATALINA_SERVICE_NAME = "Catalina";
public static final String CONNECTOR_HTTP_PROTOCOL_NAME = "HTTP/1.1";
private Logger logger = Logger.getLogger(this.getClass());
private Collection<Connector> connectors;
/**
*
*/
public TomcatConnectors() {
super();
this.connectors = new HashSet<Connector>();
this.loadConnectors();
this.getConnectorPorts();
}
/**
*
* @return
*/
protected StandardServer getServerInstance(){
org.apache.catalina.core.StandardServer server = null;
try{
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
server = (StandardServer)mbeanServer.getAttribute(
new ObjectName("Catalina:type=Server"),
"managedResource"
);
if(logger.isDebugEnabled()){
logger.debug("Server found. Info: ");
logger.debug(" - address : " + server.getAddress());
logger.debug(" - domain : " + server.getDomain());
logger.debug(" - info : " + server.getInfo());
logger.debug(" - shutdown port : " + server.getPort());
logger.debug(" - shutdown command : " + server.getShutdown());
logger.debug(" - serverInfo : " + server.getServerInfo());
logger.debug(" - status : " + server.getStateName());
}
}catch(Throwable t){
logger.fatal("Fatal Error Recovering StandardServer from MBeanServer : " + t.getClass().getName() + ": " + t.getMessage(), t);
}
return server;
}
/*
*
*/
protected Service getCatalinaService(){
org.apache.catalina.core.StandardServer server = this.getServerInstance();
Service[] services = server.findServices();
for(Service aService : services){
if(logger.isDebugEnabled()){
logger.debug("Service: " + aService.getName() +
", info: " + aService.getInfo() +
", state: " + aService.getStateName());
}
if(aService.getName().equalsIgnoreCase(CATALINA_SERVICE_NAME)){
return aService;
}
}
return null;
}
protected void loadConnectors() {
Service catalinaService = this.getCatalinaService();
if(catalinaService == null){
throw new IllegalStateException("Service Catalina cannot be null");
}
if(catalinaService.findConnectors() != null && catalinaService.findConnectors().length > 0){
logger.debug("List of connectors: ");
for(Connector aConnector : catalinaService.findConnectors()){
if(logger.isDebugEnabled()){
logger.debug("Connector.getProtocol: " + aConnector.getProtocol());
logger.debug("Connector.getPort: " + aConnector.getPort());
logger.debug("Connector.getInfo: " + aConnector.getInfo());
logger.debug("Connector.getStateName: " + aConnector.getStateName());
logger.debug("Connector.property.bindOnInit: " + aConnector.getProperty("bindOnInit"));
logger.debug("Connector.attribute.bindOnInit: " + aConnector.getAttribute("bindOnInit"));
logger.debug("Connector.getState: " + aConnector.getState());
}
this.connectors.add(aConnector);
}
}
}
/**
* @return the connectors
*/
public Collection<Connector> getConnectors() {
if(this.connectors.isEmpty()){
this.loadConnectors();
}
return connectors;
}
public Map<String, Set<Integer>> getConnectorPorts(){
if(this.connectors.isEmpty()){
this.loadConnectors();
}
Map<String, Set<Integer>> connectorPorts = new HashMap<String, Set<Integer>>();
for(Connector c: this.connectors){
Set<Integer> set;
if(!connectorPorts.containsKey(c.getProtocol())){
set = new HashSet<Integer>();
set.add(c.getLocalPort());
}else{
set = connectorPorts.get(c.getProtocol());
set.add(c.getLocalPort());
}
connectorPorts.put(c.getProtocol(), set);
}
logger.debug("connectorPorts : " + connectorPorts);
return connectorPorts;
}
}
这是我测试过的配置:
<Service name="Catalina">
<Connector port="8787" protocol="HTTP/1.1" />
<Connector port="8009" protocol="AJP/1.3" />
...
这是输出:
TomcatConnectors:137 - connectorPorts : {HTTP/1.1=[8787], AJP/1.3=[8009]}
你总是可以解析tomcat的服务器。xml文件并获取端口值:
public static Integer getTomcatPortFromConfigXml(File serverXml) {
Integer port;
try {
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(serverXml);
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile
("/Server/Service[@name='Catalina']/Connector[count(@scheme)=0]/@port[1]");
String result = (String) expr.evaluate(doc, XPathConstants.STRING);
port = result != null && result.length() > 0 ? Integer.valueOf(result) : null;
} catch (Exception e) {
port = null;
}
return port;
}
上面的代码应该可以从服务器获取HTTP端口。xml。对于HTTPS端口,必须将XPathExpression修改为
XPathExpression expr = xpath.compile
("/Server/Service[@name='Catalina']/Connector[@scheme='https']/@port[1]");
请注意,上面的代码片段是基于服务器。xml是标准的tomcat服务器文件,其中服务名称被定义为“Catalina”。下面是一个标准服务器。xml文件:
<Server>
<Service name="Catalina">
<Connector port="8080">
#...
</Connector>
</Service>
</Server>
参考:代码链接
我需要为我的表单操作创建URL,但表单应该在<code>https</code>下提交,当前底层系统运行在https的9002端口上。我不能在JSP页面中使用以下选项 由于在HTTP中,上下文路径作为HTTP出现,系统会抛出异常,因为表单应由HTTPS提交。我不能硬编码动作URL,因为主机名是,甚至HTTPS端口是可配置的,所以它甚至不能硬编码。 有什么方法可以让我用JSTL或其他方法在我的JSP
问题内容: 使用以下选项启动Java应用程序时: Java使用临时端口,这对于避免冲突非常有用。 是否可以从应用程序内部以编程方式获取实际端口(或连接URL)? 问题答案: 这将打印如下网址
我试图最小化我的webapp的配置,我要删除的事情之一是端口号映射: http:80- 因为配置已经存在于conf/server中。xml,我不想在我的应用程序中重复这些设置。必须更改(并记住更改)多个配置文件是一种痛苦。此外,只要应用程序支持http和https,就不应该关心它部署到了什么环境/容器中。 我在我的网站上配置了以下内容。xml,但除了重定向之外,我还需要能够构建https URL:
我需要在2个或更多带有HTTPS的端口上运行同一台服务器。在早期的生产中,我们为服务配置了端口10500。目前,我们需要在启用SSL的情况下在443和10500上运行它。 java.lang.IllegalArgumentException:在方法名[0x160x030X010X010X000X010XFC0x030X030X810X00AC0x1B0x10`0xB80X8D0xAE0x9E0xE
问题内容: 您经常会看到Node的示例hello world代码,该代码创建Http Server,开始侦听端口,然后执行以下操作: 但理想情况下,您希望这样做: 如何在调用前不将服务器号存储在变量中的情况下检索服务器当前正在侦听的端口? 我之前已经看过这件事,但是在Node文档中找不到。也许这是表达的特定内容? 问题答案: Express 4.x答案: Express 4.x(根据下面的Tien
我正在用Apache Camel路由为Spring Boot应用程序创建一些单元测试,使用Spock作为测试框架,我需要模拟来自另一个应用程序的响应。我为此制作了一个模拟控制器,但我需要将测试正在运行的端口注入一个属性。有没有方法获得测试正在运行的端口? 我试过 另外,是否有方法在文件中注入该随机端口?理想情况下,我需要在文件中执行以下操作: 其中端口是运行测试的随机端口。