12/03/2004

如何安裝Roller在WebLogic Server 8.1 SP3

Blog使用者已超過1億, 但多數還是使用PHP, Perl等語言為平台, 所以這裡介紹以Java為主的組合.


使用的軟體包含:



Roller 使用了OSS 與 Java 的很多Framework, 涵蓋Struts, Hibernate, Velocity, JSTL 等, 只要有Web Container 理論上都可以跑, 實際測試後是需要微調的, 原來預設是用Tomcat, 但很順利的, 只要調整一部分設定, 修修小臭蟲, 也可以順利運作.


依照 Roller Installation Guid 1.0 的步驟, 我做了幾項修正:


步驟一


安裝WebLogic Server 8.1 SP3 後, 使用 Configuration Wizard新增一個 Basic WebLogic Server Domain, 這時 CATALINA_HOME 指的就是新產生的Domain的目錄


步驟二


乖乖遵照指示, 解壓縮Roller安裝檔, 例如解到C:\roller


步驟三


接著用 MySQL Query Browser 產生一個 UTF-8 編碼的資料庫, 與法如下


CREATE DATABASE roller
CHARACTER SET utf8
COLLATE utf8_general_ci;


然後執行createdb.sql


步驟四



  • 下載 MySQL 的 JDBC Driver : Connect/J. 我使用的版本是mysql-connector-java-3.0.16-ga-bin.jar

  • 然後把 mysql-connector-java-3.0.16-ga-bin.jar 加到startWebLogic.cmd的Classpath中

(我先跳過安裝JavaMail)
我們先做第七個步驟, 把 JDBC 連線搞定



  • 執行startWebLogic.cmd, 等WebLogic Server啟動完成, 連進去管理主控台, 預設是http://localhost:7001/console

  • 在左邊的Applet選擇Services->JDBC->Connection Pools, 新增一個MySQL Connection Pool, 操作步驟請看這裡, 注意: 在Properties中, 加一行characterEncoding=utf8, 因為中文XP的編碼是MS950, 在新文章打中文存入MySQL會變成亂碼, 因為它是UTF-8的編碼

  • 下一步, 在它隔壁的DataSources新增一個Data Soruce, 也請看這裡; 注意: JNDI Name 要是 jdbc/rollerdb, 不要勾選Honor Global Transactions

步驟五


完全不要理Installation Guide說什麼, 跟著我做



  • 在WEB-INF產生一個weblogic.xml檔, 內容如下:



<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>


<security-role-assignment>
<role-name>admin</role-name>
<principal-name>admin</principal-name>
</security-role-assignment>


<security-role-assignment>
<role-name>editor</role-name>
<principal-name>editor</principal-name>
</security-role-assignment>


<reference-descriptor>
<resource-description>
<res-ref-name>jdbc/rollerdb</res-ref-name>
<jndi-name>jdbc/rollerdb</jndi-name>
</resource-description>
</reference-descriptor>
</weblogic-web-app>



  • 找到login.jsp, 移除<%@ page language="java" errorPage="/error.jsp" contentType="text/html; charset=UTF-8" %>這一行, 不然登入時在WebLogic Server會出現這個錯誤...



####<2004/12/2 下午07時21分12秒 CST> <Error> <HTTP> <kevin> <myserver> <ExecuteThread: '13' for queue: 'weblogic.kernel.Default'> <<WLS Kernel>> <> <BEA-101020> <[ServletContext(id=42241185,name=roller,context-path=/roller)] Servlet failed with Exception
weblogic.servlet.jsp.JspException: (line 1): page directive language at /taglibs.jsp:1 previously defined at /login.jsp:1
at weblogic.servlet.jsp.JspLexer.jspException(Ljava.lang.String;)V(JspLexer.java:712)
at weblogic.servlet.jsp.JspLexer.mPAGE_DIRECTIVE_BODY(ZZ)V(JspLexer.java:5193)
at weblogic.servlet.jsp.JspLexer.mPAGE_DIRECTIVE(Z)V(JspLexer.java:4948)
at weblogic.servlet.jsp.JspLexer.mDIRECTIVE(Z)V(JspLexer.java:4770)
at weblogic.servlet.jsp.JspLexer.mSTANDARD_THING(Z)V(JspLexer.java:2143)
at weblogic.servlet.jsp.JspLexer.mTOKEN(Z)V(JspLexer.java:1929)
at weblogic.servlet.jsp.JspLexer.nextToken()Lantlr.Token;(JspLexer.java:1802)
at weblogic.servlet.jsp.JspLexer.parse()V(JspLexer.java:963)
at weblogic.servlet.jsp.JspLexer.parseJspCode(Ljava.io.Reader;I)V(JspLexer.java:1209)
at weblogic.servlet.jsp.JspLexer.parseJspCode(Ljava.io.Reader;Ljava.lang.String;)V(JspLexer.java:1183)
at weblogic.servlet.jsp.JspLexer.buildTimeInclude(Ljava.lang.String;)V(JspLexer.java:934)
at weblogic.servlet.jsp.JspLexer.mINCLUDE_DIRECTIVE(Z)V(JspLexer.java:5017)
at weblogic.servlet.jsp.JspLexer.mDIRECTIVE(Z)V(JspLexer.java:4775)
at weblogic.servlet.jsp.JspLexer.mSTANDARD_THING(Z)V(JspLexer.java:2143)
at weblogic.servlet.jsp.JspLexer.mTOKEN(Z)V(JspLexer.java:1929)
at weblogic.servlet.jsp.JspLexer.nextToken()Lantlr.Token;(JspLexer.java:1802)
at weblogic.servlet.jsp.JspLexer.parse()V(JspLexer.java:963)
at weblogic.servlet.jsp.JspLexer.parseJspCode(Ljava.io.Reader;I)V(JspLexer.java:1209)
at weblogic.servlet.jsp.JspLexer.parseJspCode(Ljava.io.Reader;Ljava.lang.String;)V(JspLexer.java:1183)
at weblogic.servlet.jsp.JspLexer.buildTimeInclude(Ljava.lang.String;)V(JspLexer.java:934)
at weblogic.servlet.jsp.JspLexer.mINCLUDE_DIRECTIVE(Z)V(JspLexer.java:5017)
at weblogic.servlet.jsp.JspLexer.mDIRECTIVE(Z)V(JspLexer.java:4775)
at weblogic.servlet.jsp.JspLexer.mSTANDARD_THING(Z)V(JspLexer.java:2143)
at weblogic.servlet.jsp.JspLexer.mTOKEN(Z)V(JspLexer.java:1929)
at weblogic.servlet.jsp.JspLexer.nextToken()Lantlr.Token;(JspLexer.java:1802)
at weblogic.servlet.jsp.JspLexer.parse()V(JspLexer.java:963)
at weblogic.servlet.jsp.JspParser.doit()V(JspParser.java:106)
at weblogic.servlet.jsp.JspParser.parse(Ljava.io.Reader;)V(JspParser.java:232)
at weblogic.servlet.jsp.Jsp2Java.outputs([Ljava.lang.Object;)Ljava.util.Enumeration;(Jsp2Java.java:125)
at weblogic.utils.compiler.CodeGenerator.generate([Ljava.lang.Object;)[Ljava.lang.String;(CodeGenerator.java:258)
at weblogic.servlet.jsp.JspStub.compilePage(Lweblogic.servlet.internal.RequestCallback;)V(JspStub.java:388)
at weblogic.servlet.jsp.JspStub.prepareServlet(Lweblogic.servlet.internal.RequestCallback;Z)V(JspStub.java:238)
>


原因: WebLogic Server 不容許JSP程式有些小錯誤, 像這個重複出現二次的directive



  • 修改theme/header.jsp, 將<c:import url="${leftPage}" /> 改為 <c:import url="${leftPage}" charEncoding="UTF-8"/>, 沒做的話, 左邊選單中文會變成亂碼, 這是因為使用JSTL core的import, 卻沒有指定charEncoding

  • 最後一動, 部署Roller, 在管理主控台按左邊Deployments->Web Application Modules, 設定一個新的Web App, 直接指到Roller的目錄 (例如C:\roller), 不會做的看這裡.

步驟六 : 跳過


步驟七 : 已經做了!


步驟八



  • 開啟Roller, 如果是跟著我做, 網址是http://localhost:7001/roller

  • 登錄一個使用者當做管理員, 然後用rollerpw.bat -grant_admin <username> 指定他/她是管理員; 注意: 要記得修改rollerpw.bat的_cp變數, 把MySQL的Connect/J JDBC Driver加入, 還有修改rollerdb.properties, 像這樣:


driverClassName=com.mysql.jdbc.Driver
connectionUrl=jdbc:mysql://localhost:3306/roller


試試看可不可以登入!


步驟九


一定無法登入的啦! 這是因為Roller用DB儲存使用者帳號跟密碼, 而且用標準的j_security_check做認證, 卻寫了一個LoginServlet先攔截將密碼用SHA加密, 再傳到Web Container做認證! 不能登入的主要原因是, WebLogic Server 預設用自己的LDAP儲存庫紀錄使用者跟群組, 而用j_security_check登入時, 是到這個LDAP檢查, 所以有二個問題



1. LDAP上面沒有剛剛註冊的使用者


2. 密碼被加密, WebLogic Server 看沒有


要解決這個問題, 首先要在WebLogic Server 管理主控台新增群組跟使用者



  • 先建立二個群組: admin 與 editor (跟weblogic.xml的principal-name一樣)

  • 用剛剛註冊的使用者名稱, 產生新的使用者, 且密碼一樣

  • 開一個Command Window, 切換到WEB-INF/dbscripts下, 執行 rollerpw -save passwd.properties

  • 編輯passwd.propertis, 修改密碼為明碼

  • rollerpw -restore passwd.properties

  • 檢查MySQL中, rolleruser表格裡passphrase欄位的資料是不是都是明碼了

  • 重新部署Roller

Blog 編輯器

Roller支援XML-RPC介面, 所以可使用Blog編輯器來上傳文章

後續問題報導



  • 使用者註冊時, 無法直接同時在LDAP上新增, 需要手動自己建立, 有幾種解決方案


1. 自己做一個Authetication Provider, 使用Roller的資料做認證


2. 插一個Servlet Filer, 在註冊使用者時, 同時再LDAP上新增



  • 至於密碼是明碼的問題, 如果不自己做Authetication Provider, 需要修改程式, 跳過Roller認證檢查, 只使用WebLogic Server所提供的, 同時在註冊時, 就不存密碼, 且需要更改使用者自行變更密碼的程式


沒有留言: