
在Java Web服务器领域,Jetty始终以“轻量、灵活、高性能”的标签占据一席之地,无论是嵌入式部署场景,还是高并发生产环境,都能看到它的身影。不同于Tomcat的“重量级全能”,Jetty以模块化设计为核心,凭借优秀的架构设计和高效的算法支撑,成为微服务、嵌入式应用的首选服务器之一。本文将从Jetty的核心功能、显著特点入手,层层拆解其底层架构和核心算法,揭秘这些特性背后的技术支撑。
Learn and share.

在Java Web服务器领域,Jetty始终以“轻量、灵活、高性能”的标签占据一席之地,无论是嵌入式部署场景,还是高并发生产环境,都能看到它的身影。不同于Tomcat的“重量级全能”,Jetty以模块化设计为核心,凭借优秀的架构设计和高效的算法支撑,成为微服务、嵌入式应用的首选服务器之一。本文将从Jetty的核心功能、显著特点入手,层层拆解其底层架构和核心算法,揭秘这些特性背后的技术支撑。

Nginx 是一款高性能的 HTTP 和反向代理服务器,以其高并发、低内存消耗和高稳定性著称,广泛应用于互联网架构的流量入口、负载分发等场景,同时支持多种现代协议与云原生集成,是企业级架构的核心组件。本文介绍了Nginx的功能、特点及其核心架构与算法。
一、申请证书
各大云厂商均有销售,如果没有特殊需求买最便宜的或免费的,需要做域名验证,按指引做好验证即可
申请后会得到三个文件,保管好,不要给别人
ca.crt、server.crt、server.key
将这三个文件拷贝到/etc/apache2/ssl/
二、启用https
1、apache2启用ssl模块
sudo apt-get install openssl sudo a2enmod ssl
2、配置ssl虚拟站点
# 建立软连接 sudo ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/001-default-ssl.conf # 编辑https配置文件 sudo vi /etc/apache2/sites-enabled/001-default-ssl.conf # 修改下面三行 SSLCertificateFile /etc/apache2/ssl/server.crt SSLCertificateKeyFile /etc/apache2/ssl/server.key SSLCertificateChainFile /etc/apache2/ssl/ca.crt
3、重启apache服务
# 重启服务 sudo systemctl apache2 restart # 查看状态 sudo systemctl status apache2.service
4、登录wordpress后台,修改网站地址为https地址
5、此时应该就可以用https进行访问了
三、设置http重定向到https
1、启动重定向模块
sudo a2enmod rewrite
2、设置http重定向
# 编辑http配置文件
sudo vi /etc/apache2/sites-available/000-default.conf
# 在需要重定向的VirtualHost中,增加下面三行
<VirtualHost *:80>
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R]
<\VirtualHost>
3、重启apache服务
# 重启服务 sudo systemctl apache2 restart # 查看状态 sudo systemctl status apache2.service
4、现在访问http地址,就会自动跳转到https地址了
1、首先配置JVM
JVM要放到NTFS卷中,在JVM路径下找到jmxremote.access及jmxremote.password.template两个文件。
将jmxremote.password.template复制一份为jmxremote.password,对运行用户可读,对普通用户不可读。
2、配置Tomcat启动参数
修改catalina.bat,增加下面一行
SET "JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=8686 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true"
3、启动Tomcat
4、客户端程序JMXInfo.java
package com.neohope.jmx.test;
import java.io.IOException;
import java.lang.management.MemoryUsage;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class JMXInfo {
public static void main(String[] args) throws Exception {
JMXConnector connector = null;
try {
// 获取JMX连接
String ip = "127.0.0.1";
String port = "8686";
JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + ip + ":" + port + "/jmxrmi");
Map<String, String[]> map = new HashMap<String, String[]>();
String[] credentials = new String[] { "controlRole", "R&D" };
map.put("jmx.remote.credentials", credentials);
connector = JMXConnectorFactory.connect(serviceURL, map);
MBeanServerConnection mbsc = connector.getMBeanServerConnection();
// 获取JVM信息
ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
System.out.println("厂商:" + (String) mbsc.getAttribute(runtimeObjName, "VmVendor"));
System.out.println("程序:" + (String) mbsc.getAttribute(runtimeObjName, "VmName"));
System.out.println("版本:" + (String) mbsc.getAttribute(runtimeObjName, "VmVersion"));
// 获取JVM运行时间
Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName, "StartTime"));
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("启动时间:" + df.format(starttime));
Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime");
System.out.println("持续工作时间:" + JMXInfo.formatTimeSpan(timespan));
// 获取JVM内存信息
ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
MemoryUsage heapMemoryUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(heapObjName, "HeapMemoryUsage"));
long heapMaxMemory = heapMemoryUsage.getMax();
long heapCommitMemory = heapMemoryUsage.getCommitted();
long heapUsedMemory = heapMemoryUsage.getUsed();
System.out.println("heap:" + (double) heapUsedMemory * 100 / heapCommitMemory + "%");
MemoryUsage nonheapMemoryUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(heapObjName, "NonHeapMemoryUsage"));
long nonHeapCommitMemory = nonheapMemoryUsage.getCommitted();
long nonHeapUsedMemory = heapMemoryUsage.getUsed();
System.out.println("nonheap:" + (double) nonHeapUsedMemory * 100 / nonHeapCommitMemory + "%");
ObjectName permObjName = new ObjectName("java.lang:type=MemoryPool,name=Perm Gen");
MemoryUsage permGenUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(permObjName, "Usage"));
long permCommitted = permGenUsage.getCommitted();
long permUsed = heapMemoryUsage.getUsed();
System.out.println("perm gen:" + (double) permUsed * 100 / permCommitted + "%");
// All Domains
for (int j = 0; j < mbsc.getDomains().length; j++) {
System.out.println(mbsc.getDomains()[j]);
}
// All MBeans
Set<ObjectInstance> MBeanset = mbsc.queryMBeans(null, null);
System.out.println("MBeanset.size() : " + MBeanset.size());
Iterator<ObjectInstance> MBeansetIterator = MBeanset.iterator();
while (MBeansetIterator.hasNext()) {
ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator.next();
ObjectName objectName = objectInstance.getObjectName();
String canonicalName = objectName.getCanonicalName();
System.out.println("canonicalName : " + canonicalName);
}
// 全部线程池
ObjectName threadpoolObjName = new ObjectName("Catalina:type=ThreadPool,*");
Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null);
for (ObjectName obj : s2) {
System.out.println("端口名:" + obj.getKeyProperty("name"));
ObjectName objname = new ObjectName(obj.getCanonicalName());
System.out.println("最大线程数:" + mbsc.getAttribute(objname, "maxThreads"));
System.out.println("当前线程数:" + mbsc.getAttribute(objname, "currentThreadCount"));
System.out.println("繁忙线程数:" + mbsc.getAttribute(objname, "currentThreadsBusy"));
}
//HTTP Thread Pool
ObjectName threadPoolObjName = new ObjectName("Catalina:type=ThreadPool,*");
Set<ObjectName> threadPoolObjNames = mbsc.queryNames(threadPoolObjName, null);
for (ObjectName obj : threadPoolObjNames) {
if (obj.getKeyProperty("name").contains("http")) {
ObjectName objname = new ObjectName(obj.getCanonicalName());
System.out.println("HTTP最大线程数:"+ mbsc.getAttribute(objname, "maxThreads").toString());// 最大线程数
System.out.println("HTTP当前线程数:"+ mbsc.getAttribute(objname, "currentThreadCount").toString());// 当前线程数
System.out.println("HTTP繁忙线程数:" + mbsc.getAttribute(objname, "currentThreadsBusy").toString());// 繁忙线程数
}
}
// 全部应用
ObjectName managerObjName = new ObjectName("Catalina:type=Manager,*");
Set<ObjectName> s = mbsc.queryNames(managerObjName, null);
for (ObjectName obj : s) {
System.out.println("应用名:" + obj.getKeyProperty("path"));
ObjectName objname = new ObjectName(obj.getCanonicalName());
System.out.println("最大会话数:" + mbsc.getAttribute(objname, "maxActiveSessions"));
System.out.println("会话数:" + mbsc.getAttribute(objname, "activeSessions"));
System.out.println("活动会话数:" + mbsc.getAttribute(objname, "sessionCounter"));
}
//RequestProcessor
ObjectName requestObjName = new ObjectName("Catalina:type=RequestProcessor,*");
Set<ObjectName> requestObjNameSet = mbsc.queryNames(requestObjName, null);
Integer aliveSocketsCount = 0;
Long maxProcessingTime = 0L;
Long processingTime = 0L;
Long requstCount = 0L;
Long errorCount = 0L;
BigDecimal bytesReceived = BigDecimal.ZERO;
BigDecimal bytesSend = BigDecimal.ZERO;
for (ObjectName obj : requestObjNameSet) {
if (mbsc.getAttribute(obj, "stage").toString().trim().equals("1"))
aliveSocketsCount++;
long nowMaxProcessingTime = Long.parseLong(mbsc.getAttribute(obj, "maxTime").toString());
if (maxProcessingTime < nowMaxProcessingTime)
maxProcessingTime = nowMaxProcessingTime;
processingTime += Long.parseLong(mbsc.getAttribute(obj, "processingTime").toString());
requstCount += Long.parseLong(mbsc.getAttribute(obj, "requestCount").toString());
errorCount += Long.parseLong(mbsc.getAttribute(obj, "errorCount").toString());
bytesReceived = bytesReceived.add(new BigDecimal(mbsc.getAttribute(obj, "bytesReceived").toString()));
bytesSend = bytesSend.add(new BigDecimal(mbsc.getAttribute(obj, "bytesSent").toString()));
}
System.out.println("活动sockets计数:"+ aliveSocketsCount.toString());
System.out.println("最大处理时间:"+ maxProcessingTime.toString());
processingTime = processingTime / 1000;
System.out.println("总处理时间:"+ processingTime.toString());
System.out.println("请求总数:"+ requstCount.toString());
System.out.println("错误总数:"+ errorCount.toString());
System.out.println("接收字节数:"+ bytesReceived.divide(new BigDecimal(1024L * 1024))
.setScale(2, RoundingMode.HALF_UP).toPlainString());
System.out.println("发送字节数:"+
bytesSend.divide(new BigDecimal(1024L * 1024)).setScale(2, RoundingMode.HALF_UP).toPlainString());
} catch (Exception e) {
e.printStackTrace();
}
finally
{
if(connector!=null)
{
try {
connector.close();
} catch (IOException e) {
}
}
}
}
public static String formatTimeSpan(long span) {
long minseconds = span % 1000;
span = span / 1000;
long seconds = span % 60;
span = span / 60;
long mins = span % 60;
span = span / 60;
long hours = span % 24;
span = span / 24;
long days = span;
return (new Formatter()).format("%1$d天 %2$02d小时%3$02d分%4$02d秒%5$03d毫秒", days, hours, mins, seconds, minseconds)
.toString();
}
}
5.运行结果
厂商:Oracle Corporation 程序:Java HotSpot(TM) Client VM 版本:24.65-b04 启动时间:2016-06-21 20:57:37 持续工作时间:0天 00小时29分31秒018毫秒 heap:60.11998789417739% nonheap:54.523986450299915% perm gen:165.7018025716146% Users JMImplementation com.sun.management Catalina java.nio java.lang java.util.logging MBeanset.size() : 150 canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=HTMLManager canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=Manager canonicalName : java.lang:type=Memory canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=stock canonicalName : JMImplementation:type=MBeanServerDelegate canonicalName : Catalina:context=/host-manager,host=localhost,name=StandardContextValve,type=Valve canonicalName : Catalina:port=8080,type=Connector canonicalName : Catalina:context=/examples,host=localhost,name=foo/name1,resourcetype=Context,type=Environment canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Tomcat WebSocket (JSR356) Filter canonicalName : Catalina:context=/host-manager,host=localhost,type=WebappClassLoader canonicalName : java.nio:name=mapped,type=BufferPool canonicalName : java.lang:name=MarkSweepCompact,type=GarbageCollector canonicalName : Catalina:context=/manager,host=localhost,name=StandardContextValve,type=Valve canonicalName : Catalina:context=/examples,host=localhost,name=name3,resourcetype=Context,type=Environment canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Filter,name=Tomcat WebSocket (JSR356) Filter canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=default canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Servlet,name=jsp canonicalName : Catalina:host=localhost,name=ErrorReportValve,type=Valve canonicalName : Catalina:context=/host-manager,host=localhost,type=Cache canonicalName : java.lang:name=Tenured Gen,type=MemoryPool canonicalName : Catalina:context=/manager,host=localhost,name=BasicAuthenticator,type=Valve canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Filter,name=Tomcat WebSocket (JSR356) Filter canonicalName : Catalina:type=Engine canonicalName : Catalina:context=/,host=localhost,type=Manager canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=JMXProxy canonicalName : Catalina:context=/docs,host=localhost,type=WebappClassLoader canonicalName : java.lang:name=Code Cache,type=MemoryPool canonicalName : java.util.logging:type=Logging canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,name=jsp,type=JspMonitor canonicalName : Catalina:realmPath=/realm0/realm0,type=Realm canonicalName : Catalina:name=StandardEngineValve,type=Valve canonicalName : Catalina:port=8009,type=ProtocolHandler canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=RequestParamExample canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/ canonicalName : Catalina:context=/manager,host=localhost,type=Manager canonicalName : Catalina:context=/host-manager,host=localhost,name=BasicAuthenticator,type=Valve canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Set Character Encoding canonicalName : Catalina:context=/,host=localhost,type=NamingResources canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Request Dumper Filter canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=ServletToJsp canonicalName : Catalina:name=HttpRequest1,type=RequestProcessor,worker="http-apr-8080" canonicalName : java.lang:type=Compilation canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Filter,name=SetCharacterEncoding canonicalName : java.lang:name=Survivor Space,type=MemoryPool canonicalName : Catalina:port=8080,type=ProtocolHandler canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=ChatServlet canonicalName : Catalina:context=/examples,host=localhost,type=WebappClassLoader canonicalName : Catalina:context=/examples,host=localhost,name=foo/bar/name2,resourcetype=Context,type=Environment canonicalName : Catalina:type=StringCache canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/docs,j2eeType=Filter,name=Tomcat WebSocket (JSR356) Filter canonicalName : java.lang:type=Threading canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=Status canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/manager canonicalName : Catalina:host=localhost,name=StandardHostValve,type=Valve canonicalName : Users:database=UserDatabase,rolename=manager-gui,type=Role canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=default canonicalName : java.lang:name=Perm Gen,type=MemoryPool canonicalName : Catalina:port=8009,type=Mapper canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=wsEchoStream canonicalName : Catalina:context=/docs,host=localhost,type=Loader canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=jsp canonicalName : Catalina:context=/examples,host=localhost,name=FormAuthenticator,type=Valve canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=wsSnake canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Servlet,name=jsp canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Servlet,name=HostManager canonicalName : Catalina:name="http-apr-8080",type=GlobalRequestProcessor canonicalName : Catalina:context=/docs,host=localhost,type=NamingResources canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=jsp canonicalName : java.lang:name=Perm Gen [shared-rw],type=MemoryPool canonicalName : Catalina:context=/,host=localhost,type=Cache canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=wsChat canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=CompressionFilterTestServlet canonicalName : java.lang:name=CodeCacheManager,type=MemoryManager canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Servlet,name=HTMLHostManager canonicalName : Catalina:host=localhost,type=Host canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/docs,j2eeType=Servlet,name=jsp canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=HelloWorldExample canonicalName : Catalina:name=HttpRequest2,type=RequestProcessor,worker="http-apr-8080" canonicalName : Catalina:name="ajp-apr-8009",type=GlobalRequestProcessor canonicalName : java.lang:type=Runtime canonicalName : java.nio:name=direct,type=BufferPool canonicalName : java.lang:name=Copy,type=GarbageCollector canonicalName : Catalina:name=HttpRequest3,type=RequestProcessor,worker="http-apr-8080" canonicalName : Catalina:context=/host-manager,host=localhost,type=Manager canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,name=jsp,type=JspMonitor canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,name=jsp,type=JspMonitor canonicalName : Catalina:host=localhost,name=AccessLogValve,type=Valve canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/examples canonicalName : Catalina:name="ajp-apr-8009",type=ThreadPool canonicalName : Catalina:type=Service canonicalName : com.sun.management:type=HotSpotDiagnostic canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Servlet,name=default canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Filter,name=Tomcat WebSocket (JSR356) Filter canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/docs,j2eeType=Servlet,name=default canonicalName : Catalina:context=/,host=localhost,type=WebappClassLoader canonicalName : java.lang:type=OperatingSystem canonicalName : Catalina:context=/examples,host=localhost,name=StandardContextValve,type=Valve canonicalName : Catalina:type=Server canonicalName : Catalina:port=8009,type=Connector canonicalName : Catalina:name="http-apr-8080",type=ThreadPool canonicalName : Catalina:context=/,host=localhost,name=StandardContextValve,type=Valve canonicalName : Catalina:class=org.apache.catalina.UserDatabase,name="UserDatabase",resourcetype=Global,type=Resource canonicalName : Catalina:context=/manager,host=localhost,type=WebappClassLoader canonicalName : Catalina:context=/examples,host=localhost,type=Manager canonicalName : Catalina:context=/examples,host=localhost,type=Cache canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/host-manager canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/docs canonicalName : Users:database=UserDatabase,type=UserDatabase canonicalName : Catalina:context=/examples,host=localhost,name=foo/name4,resourcetype=Context,type=Environment canonicalName : Catalina:context=/docs,host=localhost,name=StandardContextValve,type=Valve canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Compression Filter canonicalName : Catalina:type=NamingResources canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=SessionExample canonicalName : Catalina:context=/,host=localhost,type=Loader canonicalName : Catalina:name=common,type=ServerClassLoader canonicalName : Catalina:context=/examples,host=localhost,type=Loader canonicalName : Catalina:context=/manager,host=localhost,type=Cache canonicalName : Catalina:context=/docs,host=localhost,type=Cache canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Filter,name=CSRF canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=CookieExample canonicalName : Users:database=UserDatabase,type=User,username="tomcat" canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Filter,name=SetCharacterEncoding canonicalName : Catalina:host=localhost,type=Deployer canonicalName : Catalina:type=MBeanFactory canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=RequestInfoExample canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Timing filter canonicalName : Catalina:context=/examples,host=localhost,type=NamingResources canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Servlet,name=default canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Filter,name=CSRF canonicalName : Catalina:context=/manager,host=localhost,type=Loader canonicalName : Users:database=UserDatabase,type=User,username="admin" canonicalName : Catalina:context=/docs,host=localhost,type=Manager canonicalName : java.lang:name=Eden Space,type=MemoryPool canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=RequestHeaderExample canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/docs,name=jsp,type=JspMonitor canonicalName : java.lang:name=Perm Gen [shared-ro],type=MemoryPool canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,name=jsp,type=JspMonitor canonicalName : Catalina:context=/host-manager,host=localhost,type=NamingResources canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=async2 canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=async3 canonicalName : Catalina:context=/examples,host=localhost,name=minExemptions,resourcetype=Context,type=Environment canonicalName : Catalina:context=/manager,host=localhost,type=NamingResources canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=async0 canonicalName : java.lang:type=ClassLoading canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=async1 canonicalName : Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=wsEchoMessage canonicalName : Catalina:realmPath=/realm0,type=Realm canonicalName : Catalina:context=/host-manager,host=localhost,type=Loader canonicalName : Users:database=UserDatabase,rolename=tomcat,type=Role canonicalName : Catalina:port=8080,type=Mapper 端口名:"ajp-apr-8009" 最大线程数:200 当前线程数:0 繁忙线程数:0 端口名:"http-apr-8080" 最大线程数:200 当前线程数:10 繁忙线程数:0 HTTP最大线程数:200 HTTP当前线程数:10 HTTP繁忙线程数:0 应用名:null 最大会话数:-1 会话数:0 活动会话数:0 应用名:null 最大会话数:-1 会话数:0 活动会话数:0 应用名:null 最大会话数:-1 会话数:0 活动会话数:0 应用名:null 最大会话数:-1 会话数:0 活动会话数:0 应用名:null 最大会话数:-1 会话数:0 活动会话数:0 活动sockets计数:0 最大处理时间:176 总处理时间:0 请求总数:9 错误总数:0 接收字节数:0.00 发送字节数:0.07
一般,指定JVM的native library路径,只需要用下面的参数就好了
-Djava.library.path=PATH_TO_NATIVE_LIBRARY
Tomcat指定native library路径时,还是不要使用这边参数的好。
建议直接修改PATH环境变量,将dll或so放到环境变量PATH的路径下就好了。
TOMCAT默认将PATH赋值给-Djava.library.path参数的。
IIS程序访问NAS,一般有两种情况,加域和没加域
1、加域后,什么都好办,可以通过两种方式认证
A、采用域帐户认证
B、NAS资源可以直接授权给指定计算机访问
2、不加域,那一般有三种方式设置访问权限
A、通过指定程序的用户名和密码访问(这里指定的不是本地的用户名和密码,而是NAS的用户名和密码)
B、不指定用户名和密码,直接通过pass-through authentication方式访问,其规则为:
首先通过用户的真实id进行验证
如果用户没有授权,会尝试使用应用池的账户进行验证
如果应用池账号为NetworkService或LocalSystem,将使用计算机账号进行验证
采取这样的方式IIS会提出警告,因为IIS只有在运行之后,才知道能否访问NAS
C、通过代码实现
//NAS访问封装类
public class NetworkDrive
{
public enum ResourceScope
{
RESOURCE_CONNECTED = 1,
RESOURCE_GLOBALNET,
RESOURCE_REMEMBERED,
RESOURCE_RECENT,
RESOURCE_CONTEXT
}
public enum ResourceType
{
RESOURCETYPE_ANY,
RESOURCETYPE_DISK,
RESOURCETYPE_PRINT,
RESOURCETYPE_RESERVED
}
public enum ResourceUsage
{
RESOURCEUSAGE_CONNECTABLE = 0x00000001,
RESOURCEUSAGE_CONTAINER = 0x00000002,
RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
RESOURCEUSAGE_SIBLING = 0x00000008,
RESOURCEUSAGE_ATTACHED = 0x00000010,
RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
}
public enum ResourceDisplayType
{
RESOURCEDISPLAYTYPE_GENERIC,
RESOURCEDISPLAYTYPE_DOMAIN,
RESOURCEDISPLAYTYPE_SERVER,
RESOURCEDISPLAYTYPE_SHARE,
RESOURCEDISPLAYTYPE_FILE,
RESOURCEDISPLAYTYPE_GROUP,
RESOURCEDISPLAYTYPE_NETWORK,
RESOURCEDISPLAYTYPE_ROOT,
RESOURCEDISPLAYTYPE_SHAREADMIN,
RESOURCEDISPLAYTYPE_DIRECTORY,
RESOURCEDISPLAYTYPE_TREE,
RESOURCEDISPLAYTYPE_NDSCONTAINER
}
[StructLayout(LayoutKind.Sequential)]
private class NETRESOURCE
{
public ResourceScope dwScope = 0;
public ResourceType dwType = 0;
public ResourceDisplayType dwDisplayType = 0;
public ResourceUsage dwUsage = 0;
public string lpLocalName = null;
public string lpRemoteName = null;
public string lpComment = null;
public string lpProvider = null;
}
[DllImport("mpr.dll")]
private static extern int WNetAddConnection2(NETRESOURCE lpNetResource, string lpPassword, string lpUsername, int dwFlags);
public static int MapNetworkDrive(string remotePath, string localDrive, string userName, string passWord)
{
NETRESOURCE myNetResource = new NETRESOURCE();
myNetResource.lpLocalName = localDrive;
myNetResource.lpRemoteName = remotePath;
myNetResource.lpProvider = null;
int result = WNetAddConnection2(myNetResource, passWord, userName, 0);
return result;
}
}
//调用示例
NetworkDrive.MapNetworkDrive("NAS paht with ip", "Local Driver Letter", "user", "password");
1. Download source code from Eclipse.
For example, I used this one:
From here: http://download.eclipse.org/jetty/ Get this one: jetty-8.1.15.v20140411
2. Read this:
http://docs.codehaus.org/display/JETTY/Building+from+Source
3. Prepare JDK and Maven:
SET JAVA_HOME=C:\Languages\Java\JDK\jdk_x86_1.6.0_34 SET MAVEN_HOME=C:\Languages\Java\JavaTools\apache-maven-3.0.4 SET PATH=%MAVEN_HOME%\bin;%JAVA_HOME%\bin;%PATH% CMD
4. Run “mvn install”
5. Use eclipse to import maven project
1. Download one source tag from Apache
For example, I used this tag:
http://svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_41
2. Read this:
http://tomcat.apache.org/tomcat-6.0-doc/building.html
3. Prepare JDK and Ant
SET JAVA_HOME=C:\Languages\Java\JDK\jdk_x86_1.6.0_34 SET ANT_HOME=C:\Languages\Java\JavaTools\apache-ant-1.9.0 SET PATH=%ANT_HOME%\bin;%JAVA_HOME%\bin;%PATH% CMD
4. Copy build.properties.default to build.properties
5. Edit build.properties and set base.path
base.path=the path to store thirdpart libs
6. Run “Ant download”
7. Run “Ant”
8. Rename files
move eclipse.classpath .classpath move eclipse.project .project
9. Use eclipse to import this project
10. Set break point and debug
配置好Tomcat的SSL后,强制使用HTTPS方法如下:
1、全局强制HTTPS
修改%tomcat_home%\conf\web.xml,在文件底部,后面加上这样一段:
<login-config>
<!-- Authorization setting for SSL -->
<auth-method>CLIENT-CERT</auth-method>
<realm-name>Client Cert Users-only Area</realm-name>
</login-config>
<security-constraint>
<!-- Authorization setting for SSL -->
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
2、某个webapp强制使用HTTPS
编辑该webapp的web.xml文件,增加以下内容:
<security-constraint> <web-resource-collection> <web-resource-name>securedapp</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
关闭 SSL,只需要将CONFIDENTIAL改为NONE即可。
1、%Tomcat%/server/server.xml
找到下面一段:
<!--
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
替换为:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" disableUploadTimeout="true" enableLookups="false" keystoreFile="D:/JavaContainer/apache-tomcat-6.0.35-x86/myKeyStore.jks" keystorePass="sslTestPwd" />
这样,就可以用https://127.0.0.1:8443访问Tomcat了。
2、在需要使用https项目的axis2.xml文件中,增加下面内容
<!--修改-->
<transportReceiver name="http"
class="org.apache.axis2.transport.http.AxisServletListener">
<parameter name="port">8080</parameter>
</transportReceiver>
<!--新增-->
<transportReceiver name="https"
class="org.apache.axis2.transport.http.AxisServletListener">
<parameter name="port">8443</parameter>
</transportReceiver>
这样,该WebService就可以使用https进行访问了:)