升級至 Tomcat 6.0 部份網頁會發生錯誤的解決方式

最近公司某個專案的網站是請外包廠商在開發測試機上開發新版網站,開發測試機上執行的是 Tomcat 6.0,當要部署回上線機(執行Tomcat 5.5)時因為有使用自訂標籤,發現不能正常執行,於是決定將上線機的Ap Server由原先的Tomcat 5.5.26升級到最新版的Tomcat 6.0.20。由於我們是採用Shared Tomcat的虛擬主機架構,所有的網站都共用同一版的Tomcat,所以升級Tomcat 的版本將會影響到所有的網站。因此升級後,需要針對每個網站測試一下是否還是可以正常運作。 

目前在該主機上的各網站基本功能測試大致上 OK,但有另一個專案網站的有部分JSP網頁出現錯誤,訊息大致如下: 
2009/9/7 上午 11:43:49 org.apache.catalina.core.StandardWrapperValve invoke 
嚴重的: Servlet.service() for servlet jsp threw exception 
org.apache.jasper.JasperException: /center/center.jsp(170,61) Attribute value request.getParameter("category") is quoted with " which must be escaped when used within the value
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40) 
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407) 
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:198) 
at org.apache.jasper.compiler.Parser.parseQuoted(Parser.java:299) 
at org.apache.jasper.compiler.Parser.parseAttributeValue(Parser.java:249) 
at org.apache.jasper.compiler.Parser.parseAttribute(Parser.java:211) 
at org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:154) 
at org.apache.jasper.compiler.Parser.parseParam(Parser.java:845) 
at org.apache.jasper.compiler.Parser.parseBody(Parser.java:1678) 
at org.apache.jasper.compiler.Parser.parseOptionalBody(Parser.java:1020) 
at org.apache.jasper.compiler.Parser.parseInclude(Parser.java:872) 
at org.apache.jasper.compiler.Parser.parseStandardAction(Parser.java:1134) 
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1461) 
at org.apache.jasper.compiler.Parser.parse(Parser.java:137) 
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:255) 
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:103) 
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:170) 
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:332) 
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:312) 
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:299) 
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586) 
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317) 
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) 
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at com.jspbook.GZIPFilter.doFilter(Unknown Source) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:567) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)


上網搜尋了一下,依搜尋到的這篇  https://issues.apache.org/bugzilla/show_bug.cgi?id=45015  的說法,有網友認為 Tomcat 沒有遵循  JSP 2.0 specification (JSP.1.6 Quoting and Escape Conventions, Quoting in Attributes, Page 72-73),讓下面不合法的語法在Tomcat 5.5.26之前的版本是可以被接受的 

<mytags:tag value="<%= "hi!" %>" /> 

但是合法的寫法應該是下列這幾種: 
<mytags:tag value='<%= "hi!" %>' /> 
<mytags:tag value="<%= \"hi!\" %>" /> 
<mytags:tag value='<%= \"hi!\" %>' /> 

也就是作為標籤屬性值時不能使用兩次雙引號,可以改用單引號取代外面的雙引號或是裡面的雙引號前要加跳脫字元(\),為了符合遵循標準的參考實作這個精神,所以Tomcat開發團隊就修正了這個問題,自 Tomcat 5.5.27 和 6.0.17 起改成這樣。 

解決方式: 

方法 1:使用單引號 

 <jsp:include page="split_page.jsp">
    <jsp:param name="jspUrl" value="<%=jspUrl%>" />
    <jsp:param name="category" value='<%=equest.getParameter("category")%>' />
    <jsp:param name="searchFlag" value="T" />
 </jsp:include>


方法 2:使用跳脫符號("\") 

<jsp:include page="split_page.jsp">
    <jsp:param name="jspUrl" value="<%=jspUrl%>" />
    <jsp:param name="category" value="<%=equest.getParameter(\"category\")%>" />
    <jsp:param name="searchFlag" value="T" />
</jsp:include>


方法 3:修改Tomcat設定(不修改程式碼) 

如果網頁比較多的話,另外的解決方法是在${CATALINA_BASE}/conf下面的catalina.properties中加入以下内容,重新啟動Tomcat即可: 

org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false


參考資料: 
https://issues.apache.org/bugzilla/show_bug.cgi?id=45015  
http://blog.csdn.net/qzj5851/archive/2009/08/12/4437493.aspx  
http://tomcat.apache.org/tomcat-5.5-doc/config/systemprops.html  
http://tomcat.apache.org/tomcat-6.0-doc/config/systemprops.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值