Tomcat实现动态context切换
来源:互联网 发布:android ble 大数据 编辑:程序博客网 时间:2024/05/16 05:40
需求:
希望通过request header来动态请求不同的war包(即Context)
问题:
由于servlet只提供了filter进行过滤,而filter实现在context中,所以该需求以servlet标准无法实现.
解决方法:
Tomcat在context以上存在engine和host层.因此在host层加入一层valve过滤,通过判断request header,重写request URI, context和wrapper(servlet)来动态实现context的切换.
代码实现:
Valve类:
package com.mobiscloud;import java.io.IOException;import javax.servlet.ServletException;import org.apache.catalina.Context;import org.apache.catalina.Host;import org.apache.catalina.Wrapper;import org.apache.catalina.connector.Request;import org.apache.catalina.connector.Response;import org.apache.catalina.valves.ValveBase;import org.apache.tomcat.util.buf.MessageBytes;public class ProxyValve extends ValveBase {//private static String QUESTION_MARK ="?";@Overridepublic void invoke(Request request, Response response) throws IOException,ServletException {String currentContext = "/miaomiao";String currentContextName = "miaomiao";String nextContext = "/cloudcrawlweb";String nextContextName = "cloudcrawlweb";String decodedRequestURI = request.getDecodedRequestURI();// Judge contextif (decodedRequestURI.contains(currentContext)) {// Replace current context to new contextorg.apache.coyote.Request coyoteRequest = request.getCoyoteRequest();String newPathStr = coyoteRequest.decodedURI().getString().replace(currentContextName, nextContextName); // Don't have query stringMessageBytes contextPath = MessageBytes.newInstance();contextPath.setString(nextContext);request.getMappingData().contextPath = contextPath;// Rewrite request URIMessageBytes newPath = MessageBytes.newInstance();newPath.setString(newPathStr); coyoteRequest.requestURI().duplicate(newPath); coyoteRequest.decodedURI().duplicate(newPath); coyoteRequest.getURLDecoder().convert(newPath, false); coyoteRequest.unparsedURI().duplicate(newPath);// Get request suffix URIMessageBytes path = MessageBytes.newInstance();path.setString(newPathStr.substring(nextContext.length()));request.getMappingData().requestPath = path;request.getMappingData().wrapperPath = path;// Get ContextHost host = request.getHost();Context context = (Context)host.findChild(nextContext);request.getMappingData().context = context; request.setContext(context); // Get wrapper String wrapperName = context.findServletMapping(path.getString()); request.setWrapper((Wrapper) context.findChild(wrapperName)); // Get next valvegetNext().invoke(request, response);} else {getNext().invoke(request, response);}}}
Server.xml
<?xml version="1.0" encoding="UTF-8"?><Server port="8005" shutdown="SHUTDOWN">...<Service name="Catalina">...<Engine defaultHost="localhost" name="Catalina">...<Host appBase="webapps" autoDeploy="true" name="localhost"unpackWARs="true">...<Valve className="com.mobiscloud.ProxyValve" /></Host></Engine></Service></Server>
- Tomcat实现动态context切换
- tomcat-context
- Swing实现动态切换Jpanel
- ajax 实现动态图片切换
- Qt实现动态切换语言
- Qt实现动态切换语言
- Spring实现动态数据源切换
- SSH实现动态数据源切换
- Spring实现动态数据源切换
- spring实现动态数据源切换
- AbstractRoutingDataSource动态数据源切换,AOP实现动态数据源切换
- nginx+tomcat实现主备切换
- context切换实例-arm
- appium之Context切换
- 上下文切换(Context Switch)
- eclipse下实现热部署,tomcat不重新reload context
- eclipse下实现热部署,tomcat不重新reload context
- eclipse下实现热部署,tomcat不重新reload context
- 一个研究生的职业规划
- js 拖动层效果[实例]
- douban
- 程序员的10种级别,你是那一级呢?
- 从rect到rgn的函数,圆角效果
- Tomcat实现动态context切换
- 世界前50名大型期刊及新动向
- wince系统功能或设置怎么调用 转
- 猜硬币游戏设计
- 程序员的九重境界,你到了哪一重了??
- 扫雷游戏制作全过程02 之 JButton 弯路
- js option删除代码集合
- 移植内核2.6.24.4到S3C2440
- awk中的gsub函数