jetty配置mysql数据库参数_Jetty集群配置Session存储到MySQL、MongoDB

在Web开发中,Session表示HTTP服务器与客户端(例如浏览器)的“会话”,每个客户端会有其对应的Session保存在服务器端,通常用来保存和客户端关联的一些信息,例如是否登录、购物车等。

Session一般情况下是保存在服务器内存中。如果服务器重启,Session就会丢失。另外,如果是集群环境,Web应用部署在多台服务器上,Session如果保存在各自的服务器上,就无法共享了。

针对这个问题,Jetty服务器提供了用于集群环境下的Session实现方式,即通过多台Jetty服务器连接到同一个Session数据库来实现Session共享。

1、配置Session存储到关系数据库(MySQL为例):

配置jetty.xml:

打开Jetty目录下的etc/jetty.xml,在Configure元素内部加入XML片段:

fred

com.mysql.jdbc.Driver

jdbc:mysql://192.168.20.1:3306/jetty_session?user=root&password=123

60

jdbcIdMgr

修改上面XML片段中的数据库连接的URL,如果用其他关系数据库,还要修改数据库驱动。要注意在XML中&符号要转义成&。

配置context xml:

在Jetty的webapps目录下,新建一个XML文件,例如test.xml,这个XML用于配置一个web应用:

/test

D:\test.war

jdbcIdMgr

其中,D:\test.war配置web应用的war包,/test配置web应用的contextPath,例如http://localhost:8080/test。

启动Jetty测试:

在启动Jetty之前,还需要把MySQL驱动jar包放在Jetty的lib/ext目录下。此外,还要创建好数据库,准备好war包。

一切就绪以后,就可以启动Jetty服务器测试Session是否已经保存在数据库中。

通过java -jar start.jar命令启动Jetty服务器,打开浏览器访问页面。可以看到在数据库中会生成两个表:jettysessionids、jettysessions,分别用于存储session id和session的信息。如果重启Jetty服务器,由于Session已经持久化到数据库中,所以Session不会丢失。

fa1b023fae8c76b4b621a88100b27dd8.png

需要注意的是,由于Session保存的是Java对象,会通过Java的序列化写入数据库,也就是Session中的对象必须支持序列化和反序列化,即实现Serializable接口。

配置文件说明:

如果看不懂上面两段XML配置的话,这里做一个简单的说明。

上面的这些XML实际上是Jetty的IOC配置文件,说到IOC首先会想到Spring框架,实际上Jetty的IOC和Spring的IOC解决的问题是类似的,只是XML的格式有些区别。

Jetty的IOC配置也很好理解,例如/test即调用setContextPath("/test"),jdbcIdMgr即调用getAttribute("jdbcIdMgr"),即为Java实例化对象new SessionHandler()。

将上面的两段XML“翻译”成Java代码:

importorg.eclipse.jetty.server.Server;importorg.eclipse.jetty.server.session.JDBCSessionIdManager;importorg.eclipse.jetty.server.session.JDBCSessionManager;importorg.eclipse.jetty.server.session.SessionHandler;importorg.eclipse.jetty.webapp.WebAppContext;public classMain {public static void main(String[] args) throwsException {

Server server= new Server(8080);//以下对应jetty.xml的配置

JDBCSessionIdManager sessionIdManager = newJDBCSessionIdManager(server);

sessionIdManager.setWorkerName("fred");

sessionIdManager.setDriverInfo("com.mysql.jdbc.Driver","jdbc:mysql://192.168.20.1:3306/jetty_session?user=root&password=123");

sessionIdManager.setScavengeInterval(60);

server.setAttribute("jdbcIdMgr", sessionIdManager);//以下对应context xml的配置

WebAppContext webapp = newWebAppContext();

webapp.setContextPath("/test");

webapp.setWar("D:\\test.war");

JDBCSessionIdManager jdbcIdMgr= (JDBCSessionIdManager) server.getAttribute("jdbcIdMgr");

JDBCSessionManager sessionManager= newJDBCSessionManager();

sessionManager.setSessionIdManager(jdbcIdMgr);

SessionHandler sessionHandler= newSessionHandler(sessionManager);

webapp.setSessionHandler(sessionHandler);//启动服务器

server.setHandler(webapp);

server.start();

server.join();

}

}

运行Java代码,同样可以启动服务器,将Session存入数据库,实现同样的效果。

2、配置Session存储到MongoDB

配置jetty.xml:

打开etc/jetty.xml,在Configure元素内部加入XML片段:

192.168.20.1

27017

jetty_session

jetty_session_collection

fred

60

mongoIdMgr

修改上面XML片段中的MongoDB的IP、端口号、数据库名、Collection名。

配置context xml:

在Jetty的webapps目录下,新建一个XML文件,例如test.xml,这个XML用于配置一个web应用:

/test

D:\test.war

启动Jetty测试:

测试前,首先要吧两个jar包放在Jetty的lib/ext目录下,一个是MongoDB的驱动包,另一个是jetty-nosql的jar包,在http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-nosql/下载对应版本的jar包。此外,在MongoDB中创建好对应的数据库。

通过java -jar start.jar命令启动Jetty服务器,打开浏览器打开页面。可以看到在MongoDB中创建了配置的Collection并插入了数据:

bae9456730845f5f5c18e67ddc5ba207.png

“翻译”成Java代码:

将上面的两段Jetty的IOC配置文件转成Java代码,直接运行可以实现同样的功能:

importorg.eclipse.jetty.nosql.mongodb.MongoSessionIdManager;importorg.eclipse.jetty.nosql.mongodb.MongoSessionManager;importorg.eclipse.jetty.server.Server;importorg.eclipse.jetty.server.session.SessionHandler;importorg.eclipse.jetty.webapp.WebAppContext;importcom.mongodb.DB;importcom.mongodb.DBCollection;importcom.mongodb.MongoClient;public classMain {public static void main(String[] args) throwsException {

Server server= new Server(8080);//以下对应jetty.xml的配置

MongoClient mongoClient = new MongoClient("192.168.20.1", 27017);

DB db= mongoClient.getDB("jetty_session");

DBCollection collection= db.getCollection("jetty_session_collection");

MongoSessionIdManager sessionIdManager= newMongoSessionIdManager(server, collection);

sessionIdManager.setWorkerName("fred");

sessionIdManager.setScavengePeriod(60);

server.setAttribute("mongoIdMgr", sessionIdManager);//以下对应context xml的配置

WebAppContext webapp = newWebAppContext();

webapp.setContextPath("/test");

webapp.setWar("D:\\test.war");

MongoSessionIdManager mongoIdMgr= (MongoSessionIdManager) server.getAttribute("mongoIdMgr");

MongoSessionManager sessionManager= newMongoSessionManager();

sessionManager.setSessionIdManager(mongoIdMgr);

SessionHandler sessionHandler= newSessionHandler(sessionManager);

webapp.setSessionHandler(sessionHandler);//启动服务器

server.setHandler(webapp);

server.start();

server.join();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值