ssi妖妹hs整合3.0 错误时报错,该怎么处理

交换指令的错误处理方式_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
交换指令的错误处理方式
上传于|0|0|文档简介
&&出错指令处理分析
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩7页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢3576人阅读
Java(64)
最近tomcat升级版本时,遇到了ssi解析的问题,记录下解决的过程,还有tomcat ssi配置的要点。
tomcat 配置SSI的两种方式
Tomcat有两种方式支持SSI:Servlet和Filter。
SSIServlet
通过Servlet,org.apache.catalina.ssi.SSIServlet,默认处理”*.shtml”的URL。
配置方式:
修改tomcat的 conf/web.xml文件,去掉下面配置的注释:
org.apache.catalina.ssi.SSIServlet
&buffered&
&isVirtualWebappRelative&
通过Filter,org.apache.catalina.ssi.SSIFilter,默认处理”*.shtml”的URL。
配置方式:
修改tomcat的 conf/web.xml文件,打开去掉下面配置的注释:
org.apache.catalina.ssi.SSIFilter
&contentType&
&text/x-server-parsed-html(;.*)?&
&isVirtualWebappRelative&
注意:两种配置方式最好不要同时打开,除非很清楚是怎样配置的。
另外,在Tomcat的conf/context.xml里要配置privileged=”true”,否则有些SSI特性不能生效。
privileged="true"&
历史代码里处理SSI的办法
在公司的历史代码里,在一个公共的jar包里通过自定义一个EnhancedSSIServlet,继承了Tomcat的org.apache.catalina.ssi.SSIServlet来实现SSI功能的。
@WebServlet(name="ssi",
initParams={@WebInitParam(name="buffered", value="1"), @WebInitParam(name="debug", value="0"),
@WebInitParam(name="expires", value="666"), @WebInitParam(name="isVirtualWebappRelative", value="0"),
@WebInitParam(name="inputEncoding", value="UTF-8"), @WebInitParam(name="outputEncoding", value="UTF-8") },
loadOnStartup=1, urlPatterns={"*.shtml"}, asyncSupported=true)
public class EnhancedSSIServlet extends SSIServlet {
其中@WebServlet是Servlet3.0规范里的,所以使用到web-common的web项目的web.xml文件都要配置为3.0版本以上,例如:
&?xml version="1.0" encoding="UTF-8"?&
version="3.0" xmlns="/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/javaee
/xml/ns/javaee/web-app_3_0.xsd"&
Tomcat是启动Web应用时,会扫描所有@WebServlet的类,并初始化。
所以在使用到历史代码的项目都只能使用Tomcat服务器,并且不能在tomcat的conf/web.xml里打开SSI相关的配置。
Tomcat版本升级的问题
Tomcat版本从7.0.57升级到7.0.59过程中,出现了无法解析SSI include指令的错误:
SEVERE: #include--Couldn't include file: /pages/test/intelFilter.shtml
java.io.IOException: Couldn't get context for path: /pages/test/intelFilter.shtml
at org.apache.catalina.ssi.SSIServletExternalResolver.getServletContextAndPathFromVirtualPath(SSIServletExternalResolver.java:422)
at org.apache.catalina.ssi.SSIServletExternalResolver.getServletContextAndPath(SSIServletExternalResolver.java:465)
at org.apache.catalina.ssi.SSIServletExternalResolver.getFileText(SSIServletExternalResolver.java:522)
at org.apache.catalina.ssi.SSIMediator.getFileText(SSIMediator.java:161)
at org.apache.catalina.ssi.SSIInclude.process(SSIInclude.java:50)
at org.apache.catalina.ssi.SSIProcessor.process(SSIProcessor.java:159)
at com.test.webcommon.servlet.EnhancedSSIServlet.processSSI(EnhancedSSIServlet.java:72)
at org.apache.catalina.ssi.SSIServlet.requestHandler(SSIServlet.java:181)
at org.apache.catalina.ssi.SSIServlet.doPost(SSIServlet.java:137)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543)
at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:954)
at org.apache.jsp.pages.lottery.jczq.index_jsp._jspService(index_jsp.java:107)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
仔细查看源代码后,发现不能处理的include指令代码如下:
经过对比调试Tomcat的代码,发现是在7.0.58版本时,改变了处理URL的方法,关键的处理函数是
org.apache.catalina.core.ApplicationContext.getContext( String uri)
在7.0.57版本前,Tomcat在处理处理像/pages/test/intelFilter.shtml这样的路径时,恰好循环处理了”/”字符,使得childContext等于StandardContext,最终由StandardContext处理了/pages/test/intelFilter.shtml的请求。
这个代码实际上是错误的,不过恰好处理了include virtual的情况。
在7.0.58版本修改了处理uri的代码,所以在升级Tomcat到7.0.59时出错了。
7.0.57版的代码:
* Return a &code&ServletContext&/code& object that corresponds to a
* specified URI on the server.
This method allows servlets to gain
* access to the context for various parts of the server, and as needed
* obtain &code&RequestDispatcher&/code& objects or resources from the
* context.
The given path must be absolute (beginning with a "/"),
* and is interpreted based on our virtual host's document root.
* uri Absolute URI of a resource on the server
public ServletContext getContext(String uri) {
if ((uri == null) || (!uri.startsWith("/")))
return (null);
Context child = null;
Host host = (Host) context.getParent();
String mapuri =
while (true) {
child = (Context) host.findChild(mapuri);
if (child != null)
int slash = mapuri.lastIndexOf('/');
if (slash & 0)
mapuri = mapuri.substring(0, slash);
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
return (null);
if (child == null)
return (null);
if (context.getCrossContext()) {
return child.getServletContext();
} else if (child == context) {
return context.getServletContext();
return (null);
7.0.58的代码:
那么正确的处理办法是怎样的?
仔细查看Tomcat的SSI配置的说明文档,发现有一个isVirtualWebappRelative的配置,而这个配置默认是false的。
isVirtualWebappRelative - Should "virtual" SSI directive paths be interpreted as relative to the context root, instead of the server root? Default false.
**也就是说,如果要支持“#include virtual=”/b.shtml”绝对路径这种指令,就要配置isVirtualWebappRelative为true。
但是tomcat默认的SSI配置,以及上面的EnhancedSSIServlet类默认都配置isVirtualWebappRelative为false。**
因此,把EnhancedSSIServlet类里的isVirtualWebappRelative配置为true,重新测试,发现已经可以正常处理”#include virtual=”/b.shtml”指令了。
相关的逻辑处理的代码在org.apache.catalina.ssi.SSIServletExternalResolver.getServletContextAndPathFromVirtualPath( String virtualPath):
protected ServletContextAndPath getServletContextAndPathFromVirtualPath(
String virtualPath) throws IOException {
if (!virtualPath.startsWith("/") && !virtualPath.startsWith("\\")) {
return new ServletContextAndPath(context,
getAbsolutePath(virtualPath));
String normalized = RequestUtil.normalize(virtualPath);
if (isVirtualWebappRelative) {
return new ServletContextAndPath(context, normalized);
ServletContext normContext = context.getContext(normalized);
if (normContext == null) {
throw new IOException("Couldn't get context for path: "
+ normalized);
之前的EnhancedSSIServlet类的配置就不支持”#include virtual=”/b.shtml”,这种绝对路径的SSI指令,而以前版本的Tomcat因为恰好处理了”/test.shtml”这种以”/”开头的url,因此以前版本的Tomcat没有报错。而升级后的Tomcat修正了代码,不再处理这种不合理的绝对路径请求了,所以报“ Couldn’t get context for path”的异常。
把tomcat的ssi配置里的isVirtualWebappRelative设置为true就可以了。
最后,留一个小问题:
tomcat是如何知道处理*.jsp请求的?是哪个servlet在起作用?
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1187078次
积分:10378
积分:10378
排名:第1311名
原创:125篇
转载:29篇
评论:292条
(1)(4)(2)(2)(1)(1)(7)(2)(4)(1)(3)(7)(12)(3)(3)(6)(3)(3)(8)(3)(1)(9)(7)(2)(4)(4)(5)(2)(2)(1)(4)(5)(1)(8)(17)(1)(4)(1)(2)浏览网页时出现“处理SSI文件时出错”该怎么解决?
浏览网页时出现“处理SSI文件时出错”该怎么解决?
08-12-16 &
1.把文件$CATALINA_HOME/server/lib/servlets-ssi.renametojar重新命名为$CATALINA_HOME/server/lib/servlets-ssi.jar. 2.在文件$CATALINA_HOME/conf/web.xml中,你需要把两个地方的注释去掉,servlet 声明和servlet mapping。 servlet 声明看起来类似于下面: &servlet& &servlet-name&ssi&/servlet-name& ... &/servlet& 而servlet mapping看起来类似于下面: &servlet-mapping& &servlet-name&ssi&/servlet-name& &url-pattern&*.shtml&/url-pattern& &/servlet-mapping& 这些servlet 声明和mapping可以交替地加入到你的Web 应用程序部署描述符中。
请登录后再发表评论!
请登录后再发表评论!2016年1月 Java大版内专家分月排行榜第二2015年12月 Java大版内专家分月排行榜第二2015年8月 Java大版内专家分月排行榜第二2015年3月 Java大版内专家分月排行榜第二2015年1月 Java大版内专家分月排行榜第二2014年12月 Java大版内专家分月排行榜第二2014年11月 Java大版内专家分月排行榜第二2014年6月 Java大版内专家分月排行榜第二2014年4月 Java大版内专家分月排行榜第二2014年1月 Java大版内专家分月排行榜第二2013年11月 Java大版内专家分月排行榜第二
2015年9月 Java大版内专家分月排行榜第三2015年6月 Java大版内专家分月排行榜第三2015年5月 Java大版内专家分月排行榜第三2015年2月 Java大版内专家分月排行榜第三2014年3月 Java大版内专家分月排行榜第三2013年12月 Java大版内专家分月排行榜第三
2016年10月 Java大版内专家分月排行榜第一2016年9月 Java大版内专家分月排行榜第一2016年8月 Java大版内专家分月排行榜第一2014年4月 Java大版内专家分月排行榜第一
2016年11月 Java大版内专家分月排行榜第二
2014年2月 扩充话题大版内专家分月排行榜第二
2014年2月 扩充话题大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
处理 SSI 文件时出错
下载积分:1500
内容提示:处理 SSI 文件时出错
文档格式:DOC|
浏览次数:66|
上传日期: 10:15:09|
文档星级:
该用户还上传了这些文档
处理 SSI 文件时出错
官方公共微信}

我要回帖

更多关于 处理 ssi 文件时出错 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信