使用java servlet來跑JasperReports

2008-01-03

Permalink 14:19:38, 類別: JasperReports  

使用java servlet來跑JasperReports

以deb包安裝的php-java-bridge會產生一隻java.ini在php的conf.d目錄,裏面也只是開啟extension = java.so而已,但是用phpinfo看到的卻是一堆資訊,不知java command是從那裏來的? 而且java status是not running:

php-java-bridge

用ps aufx來查看,發現多出了一個apache2 process(root身份執行),java server是在這個多出的apache2下(root身份執行)。因為apache2 process多佔用3.3MB常駐記憶體,若是不想浪費記憶體,可以使用java servlet,這樣每次調用jasperreports時就不必再啟動java;另外基於安全考量,不希望java servlet用root身份執行(產生的輸出檔無法用unlink()刪除),方法如下:

  1. 修改/etc/php5/conf.d/java.ini,指定java.hosts及開啟java.servlet:

    [java]
    extension = java.so
    java.hosts = 127.0.0.1:8080
    java.servlet = On


  2. 執行JavaBridge:

    LD_LIBRARY_PATH=/usr/lib/php5/20060613+lfs: java -Djava.library.path=/usr/lib/php5/20060613+lfs -Djava.class.path=/usr/lib/php5/20060613+lfs/JavaBridge.jar -Djava.awt.headless=true -Dphp.java.bridge.base=/usr/lib/php5/20060613+lfs
    -jar /usr/lib/php5/20060613+lfs/JavaBridge.jar
    3 /var/log/JavaBridge.log


  3. 執行/etc/init.d/apache2 restart。這個步驟必須在JavaBridge之後。

再看看phpinfo()裏的java:

php-java-bridge

最後是安全問題,如果我是手動執行JavaBridge那麼servlet的身份是henry,產生的檔案owner也是henry, 那麼php執行unlink()是用www-data身份還是刪不掉它。若是用www-data執行,必須開放www-data的shell權限,這又是犯了安全大忌。必須想一個安全的辦法(不是chmod 777)讓servlet以www-data身份執行,而不必給www-data shell權限。

瀛洲用c寫了一隻suex程序,以Exec System Call跳過shell的限制,用法:

sudo suex
www-data
/usr/bin/java
-jar /usr/lib/php5/20060613+lfs/JavaBridge.jar
3 /var/log/JavaBridge.log

Pingbacks:

此文章還沒有 Pingbacks

Comments are not allowed from anonymous visitors.

Henry's Blog

Blog = Function 分享( 記錄( 學習() ) );

搜尋

文章彙整

其他

XML Feeds

What is this?

powered by
b2evolution