谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

値の書き換えを防ぐValidator

hiddenタグの値を、JavaScriptとかリクエスト改ざんで
書き換えられた場合に、エラーを出力するバリデータ。

確認画面のhiddenタグには、必ず埋め込まなきゃいかんでしょう。

package examples.jsf.validator;

import javax.faces.component.StateHolder;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

import org.seasar.jsf.util.MessageUtil;
import org.seasar.jsf.util.UIComponentUtil;

public class UnalteredValidator implements Validator, StateHolder {

	public static final String MESSAGE_ID = "examples.jsf.validator.UnalteredValidator.ALTERED";

	private boolean bTransient = false;

	public void validate(FacesContext context, UIComponent component,
			Object value) throws ValidatorException {

		if (value == null) {
			return;
		}

		UIInput input = (UIInput) component;
		Object oldValue = input.getValue();

		if (value.equals(oldValue) == false) {
			Object[] args = { UIComponentUtil.getLabel(component) };
			throw new ValidatorException(MessageUtil.getErrorMessage(
					MESSAGE_ID, args));
		}
	}

	public boolean isTransient() {
		return bTransient;
	}

	public void setTransient(boolean transientValue) {
		this.bTransient = transientValue;
	}

	public Object saveState(FacesContext context) {
		return new Object[0];
	}

	public void restoreState(FacesContext context, Object state) {
	}
}