Saturday, July 14, 2012

使用openid4java實作Open ID RP (2)

本文接續上一篇,主要在實作程式碼的部份。

首先使用NetBeans建立一個新的Apache Wicket專案,並命名為myrp。依據原文所寫,作者將Web Application中負責和Open ID OP進行通訊的相關功能,放在model的套件中,其中分為兩個項目:

Friday, July 13, 2012

使用openid4java實作Open ID RP (1)

本文的原始出處是IBM技術文章

為了要實作OpenID Provider的Java Web Application,我認為要先了解如何在Java Web Application中先實作Open ID RP,以了解Open ID的運作方式。

OpenID的官網中,針對Java有提供了許多函式庫可以讓我們來使用,在原始文件中是使用openid4java的函式庫,目前可以取得的版本為0.9.6。

另外,為了要試驗Apache Wicket此framework的功能,我也改用Apache Wicket 1.5.3的版本,它和原始文章所使用的版本(1.3.3),在實作上有一些差異!

還有,本文主要說明概念的部份,實作則在下一篇

Thursday, July 12, 2012

Accordions

Accordions的功能和TabPane或是CardPane類似,都可以將用不到的元件先隱藏起來,只顯示目前要使用的元件。不過,Accordions是以類似手風琴的折疊方式,只顯示出標題(header)以供使用者點選。

本文的範例來源一樣是官網,它呈現了結帳的3個步驟。
要注意的是,預設狀況之下,Accordions能允許使用者任意選擇不同的panel,但是此範例則限制使用者只能按『下一步』的按鈕,以瀏覽下一個panel。

FlowPane

FlowPane是讓元件以水平線進行排列的容器,並且具有自動換行的功能。它可以讓元件靠左、靠右或置中對齊,也可以讓元件以垂直對齊基準線(baseline)進行排列。

本範例仍然取自官網,在範例中使用了BaselineDecorator(org.apache.pivot.wtk.effects)來顯示基準線,如果使用者未點選『對齊基準線』的選項,則會顯示出藍線,反之則顯示紅線。

Separators

Separators的作用如同網頁中的水平線一般,本範例一樣來看官網。

使用時很簡單,只要在ui.bxml中指定heading即可。

Text - TextArea

TextArea是被用來放置多行文字的WTK元件,它通常會使用ScrollPane包裏起來,以提供捲軸。本範例來自官網

Text - Suggestion Popups

本範例(同樣來自官網)大致上和上一篇相同,主要的差別在於使用org.apache.pivot.wtk.SuggestionPopup類別來顯示自動完成(auto-complete)的功能。

text - TextInput

Pivot提供了兩種輸入文字的元件,TextInput→單行未格式化的文字,它也可以使用密碼的方式來呈現文字;另一個元件則是TextArea,可允許輸入多行且格式化的文字。本文先介紹TextInput元件。

本範例是由官網取得。它的功能是當使用輸入的字元足以判斷出唯一的值時,系統會自動幫使用者填入剩餘的字元(顯示台中市各區名稱)。

Repeatable List Buttons

Pivot支援repeatable list button,意思是使用者可以簡單的重複執行選定的項目。它適合用來執行像橡皮圖章(rubber stamp)的功能。

本範例由官網所取得,它展示的就是使用List Button來自動設定已選定之CheckBox元件的文字顏色。

Wednesday, July 11, 2012

List - ListButton

ListButton在畫面上會呈現下拉式的選單,本範例是使用者點選ListButton後,出現下拉式選單,當使用者選擇文字後,會在右方顯示圖片。本範例由官網取得。

List - ListView

Pivot的WTK元件中,List屬於可條列許多項目,並且允許使用者進行選擇的元件,它通常會搭配ScrollPane進行捲動顯示的效果。List包含了ListView及ListButton. ListView,ListButton則是按下後會跳出popup選單,讓使用者進行選擇。本文將先介紹ListView元件。

基本上ListView並不具備捲動功能,因此必須將之附屬於ScrollPane元件之中,ScorllPane會自動依據內容的多寡而調整元件的高度,UI設計人員無須介入。更詳細的ScrollPane介紹留待以後說明。本範例由官網取得。

LinkButton

本範例將結合CardPane以及Link Button達成圖片瀏覽的功能。CardPane就如同一疊卡片一般,同一時間只能顯示一張卡片,詳細留待往後說明。本範例由官網取得。

在此ui.bxml中,使用了另一種事件處理機制,用<buttonPressListeners></buttonPressListeners>,也就是將要進行的事件處理撰寫在<buttonPressListeners></buttonPressListeners>區塊中。在範例中所寫的處理機制是要設定選擇了在CardPane中的哪一個card。

CheckBox

本文將介紹CheckBox元件,當使用者按了CheckBox之後,會顯示出圖片。本範例由官網取得。

在ui.bxml中要特別一提的是,使用ButtonPressListener.buttonPressed的方式來定義事件處理機制,在bxml中是以java script來撰寫事件處理(當然,在Java原始碼中進行事件處理也可以)。同時,本範例是以TablePane來排列元件,詳細TablePane說明留待以後說明。

Tuesday, July 10, 2012

Radio Button

本範例和Push Button範例相同,都必須建立客制化的Window類別,並實作Bindable介面,在本文中它被稱為RBWindows,同時它也放置在myex的套件中(myex#RBWindows)。

在這個範例(由官網取得)中,我們針對3個RadioButton建立了一個群組(ButtonGroup)稱為numbers。同時在它們下方有一個PushButton,按下它會以Alert顯示出哪一個RadioButton是被選取的。

Toggle Button

Toggle Button顧名思義,表示它可以是某項行為的開關!當按下之後,按鈕本身會呈現凹陷的狀態,若再按一次則會回復成原狀!

在以下的範例(由官網取得)中,使用了org.apache.pivot.wtk.content.ButtonData物件來描述按鈕的文字及圖示(icon)。

PushButton、事件處理與中文

本篇文章將介紹如何使用BXML建立Push Button並且實作它的事件處理機制,同時也會對中文字的顯示有不同的處理方式。

本專案(由官網取得)可分成二個部份來說明,首先ui.bxml會利用到自訂的命名空間(namespace)-> myex,也因此會在專案中新增一個package名稱為myex,在myex中會建立一個類別PushButtons,它是自訂的Window類別,同時也繼承了Bindable介面,專門用來和使用者介面中的Push Button進行對應,包含了事件處理。

第二部份則是會將ui.bxml放在根目錄底下,它會引用到myex套件中所定義的自訂Window類別PushButtons。另外,程式的進入點仍是NewClass.java,此類別會讀取ui.bxml,並且經由序列化的處理將Window對應到PushButtons。

Lables及ImageView


在pivot專案(由官網取得)中撰寫如下bxml檔案,用來設計UI。

<!--ui.bxml-->
<Window title="Labels" maximized="true"
    xmlns:bxml="http://pivot.apache.org/bxml"
    xmlns="org.apache.pivot.wtk">
    <BoxPane styles="{padding:4, verticalAlignment:'center'}">
        <ImageView image="/clock.png"/>
        <Label text="現在的時間是?" styles="{font:'PMingLiU bold 24'}"/>
    </BoxPane>
</Window>

Monday, July 9, 2012

Apache Pivot 平台概論

Apache Pivot提供了許多基礎類別,以建立複雜及優美的使用者介面。主要分成四大類別:

  1. Core:非UI的共同類別。
  2. WTK:使用者介面(user interface development)相關類別,包括:windows dialogs buttons lists textinput layout drag and drop等等。
  3. Web:和遠端服務(RestFul web service soap json)進行連線相關類別。
  4. Charts:可以在Pivot應用程式中建立互動式圖表功能的類別。

使用BXML設定UI

Apache Pivot的另一個特色是可以使用BXML(bean xml)來設定使用者介面(UI)。
本文將介紹簡易的BXML使用法。在java原始碼中,必須使用BXMLSerializer來將bxml中的UI設定轉化為java中的UI物件,並且讀入bxml後必須再將物件進行強迫轉型,將物件轉為org.apache.pivot.wtk.Window物件。

Apache Pivot初探(2) - 使用JNLP


本篇文章將延續上一篇,相同的Pivot程式碼,並且使用JNLP來開啟專案。

Friday, July 6, 2012

Apache Pivot初探

Apache Pivot是用來建立IIA(Installable Internet Application)應用程式的java函式庫,它最大的特點是元件優美而且執行流暢,而且可以使用Java Web Start的方式進行啟動(也可以當成一般的桌面AP來啟動,或是使用Applet的方式內嵌入網頁中)。
Apache Pivot的位階等同於Java FX、Microsoft Silverlight或是Adobe Flash。本文將介紹三種不同啟動Pivot程式的方法。

Tuesday, June 12, 2012

Apache Wicket Auth/Roles -- 系列文章

花了一些時間將Apache Wicket Auth/Roles專案對於驗證及授權的機制加以實作(以Wicket Example上的範例稍加修改)後,總算對於它的運作有了基礎的了解,為了方便看文,所以在這裡做了一個連結的文章,以後若有新增相關的文章,也會一併在此更新。

Apache Wicket Auth/Roles 簡介 -- Authorization (3)

本文同樣延續上一篇的範例,本文會再新增兩個頁面,這些頁面會視使用者的角色而呈現出不同的內容。也可以說,頁面的內容可以自訂允許哪些角色看到什麼內容。

新增的兩個頁面分別是AdminPanelPage.html(使用meta data授權)及AdminAnnotationPanelPage.html(使用annotation授權)。

因此,在HomePage.html也要新增兩個超連結。

Monday, June 11, 2012

Apache Wicket Auth/Roles 簡介 -- Authorization (2)

本文將延續前一篇的範例,將它的授權(authorization)應用到網頁中的某個元件,例如只有ADMIN才能看到某個Panel,其餘的使用者則無法看到!

在本文中我們會在網站中新增兩個頁面,這兩個頁面均是內部頁面(意即非bookmarkable),只是其中之一使用meta data進行授權,而另一頁則使用annotation授權。

所以,在首頁(HomePage.html)的地方,我們新增了兩個超連結,其中一個是AdminInternalPage.html(使用meta data授權);另一個是AdminInternalAnnotationPage.html(使用annotation授權):

Thursday, June 7, 2012

Apache Wicket Auth/Roles 簡介 -- Authorization (1)


本文是接續前三篇文章()而來的,主要在介紹如果使用Auth/Roles進行元件授權(authorization)的動作。

-- Authorization --



在Apache Wicket的Auth/Roles專案中,在身份認證(authentication)完成後必須要針對各項元件進行授權(authorization)的動作,以避免不具權限的使用者進入了受限的頁面。

Wednesday, June 6, 2012

Apache Wicket Auth/Roles 簡介 -- Authentication (3)

本篇文章是更為進階的身份驗證範例,使用Annotation來進行頁面的權限設定,因為如果使用前二篇文章()中的範例來設定頁面的存取權限,維護各頁面權限的工作會變得很煩瑣。

-- 體驗範例程式 --



本範例程式和先前範例程式相比,程式碼變得更為簡潔,而且需要修改的部份不多,茲分述如下:


程式碼不須變動部份:

1.SignIn.html
2.SignIn.java
3.Session.java
4.SignOut.html
5.SignOut.java

Apache Wicket Auth/Roles 簡介 -- Authentication (2)

接續上一篇文章,本文的範例則是使用Auth/Roles套件中內建的SignInPanel,來呈現登入畫面,同時它亦可設定是否要將登入資訊儲存在cookie中。

-- 體驗範例程式 --



本範例大部份程式碼都和上一篇相同,只有一小部份有稍加修改,茲表列如下:

相同的部份:
1.Application.java
2.SignOut.html
3.SignOut.java

Apache Wicket Auth/Roles 簡介 -- Authentication (1)

Apache Wicket Auth/Roles是Apache Wicket的延伸套件,它讓認證(Authentication)及授權(Authorization)變得簡單易用。

本系列文章將以Apacke Wicket Example裡的範例來進行說明,Wicket的版本為1.5x。

首先,Auth/Roles套件實作了IAuthorizationStrategy介面;當授權策略(authorization strategy)安裝在安全性設定中(WebApplication#getSecuritySettings),Wicket將會自動檢查所有元件(component)是否具備可以初始化(instaintion)或是呈現畫面(render)的權限。

Tuesday, May 22, 2012

使用jarsigner對jar檔進行簽章

若要對jar進行簽章,首先要有一張憑證,缺$一族可使用java keytoo工具可產生自我簽發的憑證(參考這裡)!

使用jarsigner工具對test.jar進行簽章的指令如下:

jarsigner -keystore test.jks -keypass test test.jar alias-test

各參數說明如下:
-keystore 符合java keystore格式的憑證路徑
-storepass 該憑證的密碼
*.jar 欲簽章之jar檔
alias-test 此憑證之別名

Wednesday, May 9, 2012

Java列出所有系統相關資訊

下列程式碼可以列出所有系統資訊

Properties props = System.getProperties();
//使用Enumeration走訪Map物件
Enumeration enumeration = props.propertyNames();
while (enumeration.hasMoreElements()) {
    String name = (String) enumeration.nextElement();
    String value = (String) props.getProperty(name);
    System.out.println(name + ":" + value);
}

Friday, May 4, 2012

使用Java Applet製作自然人憑證登入驗證(1)

因為要實作使用自然人憑證來登入網站並達到跨browser的功能,因此打算以Applet的方式來呼叫HiSecue的Win32 API,不過因為在Java中呼叫JNI屬於特權模式,所以Applet程式必須打包成JAR檔,並且將它簽章後同時獲得客戶端的同意才得以在瀏覽器中執行。

另一方面,若要進行簽章必須先取得獲CA認證的憑證,但是要取得CA核發的憑證要很多$,因此可以參考另一篇,以JDK的keytool工具製作自我核發的憑證。

使用Java Applet製作自然人憑證登入驗證(2)

接續上一篇,繼續實作!


4.在JApplet的run()中,呼叫具特權模式類別。

java.awt.EventQueue.invokeAndWait(new Runnable() {
    public void run() {
        initComponents();
        //產生新特權模式類別
        checkCard check = new checkCard();
        //以AccessController的static method執行特權模式指令
        String s = (String)AccessController.doPrivileged(check);
    }
});

Thursday, May 3, 2012

Netbeans 7.x對jar檔自動簽章

要在Netbeans中設定在建置專案時自動對jar檔自動簽章的步驟如下:

1.打開project.properties檔案。在最後方加入下列設定。

#加入自動化自我簽章
jarsign.jarsigner=jarsigner.exe路徑
jarsign.keystore=已核發之憑證檔
jarsign.storepass=憑證檔密碼
jarsign.signedjar=${dist.dir}
jarsign.alias=憑證別名

使用Keytool產生自我核發的憑證

為了要讓Applet可以在客戶端具有特殊權限,例如:存取客戶端的檔案系統,必須要對JAR檔進行簽章的動作,但是要申請一個憑證必須要有$$,因此為了測試我們可以使用JDK內建的keytool工具來產生金鑰並核發憑證給自己!

測試環境:JDK 1.6.31 Windows 7 x64 命令列模式

  • 輸入下列指令可以直接產生自我核發之憑證
#使用Java的keytool指令
keytool -genkey -alias test -keysize 2048 -keyalg RSA -sigalg SHA1withRSA -keypass test1234 -storepass test1234 -validity 365 -dname "CN=testname, OU=testunit, O=testorg, L=testlocation,S=teststate , C=TW" -keystore test.jks

Friday, April 27, 2012

Glassfish3入門 (3)-整合mod_jk

一般的網頁伺服器會使用httpd來顯示靜態網頁,而使用tomcat或是glassfish當成是jsp動態網頁或是servlet的容器,但是使用者若要進入java-based的網站還要輸入port number(例如:8080),會造成使用者的困擾,同時網管人員也可能因為安全因素而不開放8080埠,本文將介紹使用mod_jk讓httpd自動轉發servlet或是jsp之頁面要求至glassfish伺服器。(本文是參考Glassfish 3.1.2版之administration-guide)

  • 伺服器(CentOS 5.8 x64)既有服務:apache httpd 2.2、glassfish 3.1.2 (已有一個domain叫app,並且發佈了一個web專案叫School)。

Monday, April 2, 2012

GlassFish3 入門 (2) -- 以non-root的權限執行服務

為了避免執行GlassFish服務的使用者具有太大的權限,例如前文的root,因此我們可以建立一個較低權限的使用者來啟動服務。

  • 首先建立一個群組glassfish3,並且新增一個使用者glassfish,此使用者沒有home directory。
sudo groupadd glassfish3
sudo useradd -s /bin/bash -M -g glassfish3 glassfish

  •  將/opt/glassfish3的所有權轉給glassfish。

sudo chown -Rf glassfish.glassfish3 /opt/glassfish3
  •  修改/etc/init.d/GlassFish_test,讓它可以用glassfish的權限啟動服務。

    Sunday, April 1, 2012

    GlassFish3 入門 (1) -- 初始設定

    為了專案開發需要,採用了glassfish3當成是Web Service的容器。為免以後忘記如何將服務架起來,只好記錄下來囉!

    本文使用的是glassfish3 open source edition - 3.1.2,可在此下載。主機採用CentOS 5搭配JDK 6u31的執行環境。

    • 先將JDK以及glassfish3解壓縮在/opt底下。(JAVA_HOME請自行設定,在此不詳述)
    •  設定基礎環境(編輯/opt/glassfish3/glassfish/config/asenv.conf),加入以下兩行指令,指定預設之Java Home及glassfish3安裝路徑,可避免自動啟動服務時發生錯誤。
    AS_JAVA="/opt/jdk1.6.0_27"
    AS_HOME="/opt/glassfish3/glassfish"

    •  進入/opt/glassfish3/bin裡,輸入sh asadmin,可以進入管理畫面。
    1.  可先將預設domain1刪除(delete-domain domain1)
    2.  建立自己的domain(create-domain test),按下Enter即可自動設定(預設沒有密碼)。

    •  設定開機自動啟動服務。
    1. 進入管理介面後,輸入create-service [instance]指令,此處的instance指的是domain名稱。
    2. 指令成功執行後,會自動將啟動指令檔複製到/etc/inid.d/以及/etc/rcN.d底下(此處的N為0-6及S)。
    3. 此內建的指令檔會自動在重開機後啟動服務,但先決條件是重開機之前要先啟動服務