練功房推薦書單

  • 猛虎出柙雙劍合璧版--最新 OCA / OCP Java SE 7 Programmer 專業認證 (電子書)
  • 流浪教師存零股存到3000萬(全新增修版)(書+DVD)
  • 開始在關西自助旅行(京都‧大阪‧神戶‧奈良)(全新增訂版)
  • 不敗教主的300張股票存股術

升級至 Tomcat 6.0 部份網頁會發生錯誤的解決方式 RSS feed
Forum Index » Tomcat
Author Message
andowson

七段學員
[Avatar]

Joined: 2007/1/2
Messages: 709
Location: 台北
Offline
最近公司某個專案的網站是請外包廠商在開發測試機上開發新版網站,開發測試機上執行的是 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

分享經驗 累積智慧
[WWW]
 
Forum Index » Tomcat
Go to:   
Mobile view