Wicketでページのシリアライズをしないようにする

Wicketでページのシリアライズをしないようにする

## 環境
wicket 7(.10)

## シリアライズしたくない
決済系のページや個人情報登録ページなど、セキュリティレベルの高いデータを扱う場合に、
（**たとえ暗号化したとしても**）そのデータを保存してほしくない場合がある（はず）。

- PCI-DSSに準拠するには、セキュリティコードはログを含めデータとしてどこにも保管できない

## VoidPageManagerProvider

- Wicketのシリアライズ動作を上書き
- 検索したらヒット。先人の知恵に感謝。
- 各ページレベルでの設定はもうちょっと色々しないとダメそう、ここではアプリケーションレベルの設定

##### ページマネージャプロバイダ
```java:VoidPageManagerProvider.java
public class VoidPageManagerProvider extends DefaultPageManagerProvider {

	protected IPageManagerContext 	pageManagerContext;
	protected IPageManager			pageManager;

	/**
	 * @param application
	 */
	public VoidPageManagerProvider(Application application) {
		super(application);

		pageManagerContext = new DefaultPageManagerContext();

		IDataStore dataStore = newDataStore();
		IPageStore pageStore = newPageStore(dataStore);
		pageManager = new VoidPageStoreManager(application.getName(), pageStore, pageManagerContext);
	}

	@Override
	public IPageManager get(IPageManagerContext pageManagerContext) {

		return pageManager;
	}

	@Override
	public IPageStore newPageStore(IDataStore dataStore) {

		return new VoidPageStore();
	}

	@Override
	public IDataStore newDataStore() {

		return new VoidDataStore();
	}
}
```
##### ページストア
```java:VoidPageStore.java
public class VoidPageStore implements IPageStore {

	/**
	 * constructor
	 */
	public VoidPageStore() {
	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IPageStore#destroy()
	 */
	@Override
	public void destroy() {

	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IPageStore#getPage(java.lang.String, int)
	 * @param sessionId
	 * @param pageId
	 * @return
	 */
	@Override
	public IManageablePage getPage(String sessionId, int pageId) {
		// nothing
		return null;
	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IPageStore#removePage(java.lang.String, int)
	 * @param sessionId
	 * @param pageId
	 */
	@Override
	public void removePage(String sessionId, int pageId) {

	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IPageStore#storePage(java.lang.String, org.apache.wicket.page.IManageablePage)
	 * @param sessionId
	 * @param page
	 */
	@Override
	public void storePage(String sessionId, IManageablePage page) {

	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IPageStore#unbind(java.lang.String)
	 * @param sessionId
	 */
	@Override
	public void unbind(String sessionId) {

	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IPageStore#prepareForSerialization(java.lang.String, java.io.Serializable)
	 * @param sessionId
	 * @param page
	 * @return
	 */
	@Override
	public Serializable prepareForSerialization(String sessionId, Serializable page) {

		return null;
	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IPageStore#restoreAfterSerialization(java.io.Serializable)
	 * @param serializable
	 * @return
	 */
	@Override
	public Object restoreAfterSerialization(Serializable serializable) {

		return null;
	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IPageStore#convertToPage(java.lang.Object)
	 * @param page
	 * @return
	 */
	@Override
	public IManageablePage convertToPage(Object page) {

		return null;
	}

}
```
##### データストア
```java:VoidDataStore.java
public class VoidDataStore implements IDataStore {

	/**
	 * constructor
	 */
	public VoidDataStore() {
	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IDataStore#getData(java.lang.String, int)
	 * @param sessionId
	 * @param id
	 * @return
	 */
	@Override
	public byte[] getData(String sessionId, int id) {

		// nothing
		return null;
	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IDataStore#removeData(java.lang.String, int)
	 * @param sessionId
	 * @param id
	 */
	@Override
	public void removeData(String sessionId, int id) {

	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IDataStore#removeData(java.lang.String)
	 * @param sessionId
	 */
	@Override
	public void removeData(String sessionId) {

	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IDataStore#storeData(java.lang.String, int, byte[])
	 * @param sessionId
	 * @param id
	 * @param data
	 */
	@Override
	public void storeData(String sessionId, int id, byte[] data) {

	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IDataStore#destroy()
	 */
	@Override
	public void destroy() {

	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IDataStore#isReplicated()
	 * @return
	 */
	@Override
	public boolean isReplicated() {
		return true;
	}

	/* (非 Javadoc)
	 * @see org.apache.wicket.pageStore.IDataStore#canBeAsynchronous()
	 * @return
	 */
	@Override
	public boolean canBeAsynchronous() {
		return true;
	}

}
```
##### ページストアマネージャ
```java:VoidPageStoreManager.java
public class VoidPageStoreManager extends PageStoreManager {

	/**
	 * @param applicationName
	 * @param pageStore
	 * @param context
	 */
	public VoidPageStoreManager(String applicationName, IPageStore pageStore, IPageManagerContext context) {
		super(applicationName, pageStore, context);
	}

	@Override
	public boolean supportsVersioning() {
		return false;
	}
}
```

## アプリケーションから呼び出し
##### init() 内で呼び出す
```java:WicketApplication.java
		// page manager
		setPageManagerProvider(new VoidPageManagerProvider(this));
```

implements Serializable しなくてもエラーが出なくなりました