日期:2014-05-16 浏览次数:20618 次
/**
 * @author Bill
 * @version 2012-03-21
 */
@SessionScoped
@ManagedBean
public class FormTokenBean {
    public static final String BEAN_NAME = "formTokenBean";
    private String token;
    public String getToken() {
        return token;
    }
    public void setToken(String token) {
        this.token = token;
    }
    public String resetToken() {
        return token = "T" + System.nanoTime();
    }
    public boolean validateToken(String token) {
        return token != null && token.equals(this.token);
    }
    @PostConstruct
    public void init () {
        resetToken();
    }
}
/**
 * @author Bill
 * @version 2012-03-27
 */
@FacesComponent("org.billxiong.faces.FormToken")
public class FormTokenTag extends HtmlInputHidden{
    public FormTokenTag() {
        setRendererType("javax.faces.Hidden"); // render as a standard InputHidden
        addValidator(new FormTokenValidator());
        String token = FacesUtils.getObject("formTokenBean.token", String.class); 
        setValue(token);
    }
    @Override
    public void decode(FacesContext context) {
        super.decode(context);
        String clientId = getClientId(context);
        String submittedValue = (String) context.getExternalContext().getRequestParameterMap().get(clientId);
        if(submittedValue != null) {
            setSubmittedValue(submittedValue);
        }
    }
}
    <tag>
        <tag-name>formToken</tag-name>
        <component>
            <component-type>org.billxiong.faces.FormToken</component-type>
        </component>
        <attribute>
            <name>id</name>
            <required>false</required>
            <type>java.lang.String</type>
        </attribute>
        <attribute>
            <name>validatorMessage</name>
            <required>false</required>
            <type>java.lang.String</type>
        </attribute>
    </tag>
@FacesValidator("formTokenValidator")
public class FormTokenValidator implements Validator{
    @Override
    public void validate(FacesContext context, UIComponent uiComponent, Object o) throws ValidatorException {
        String token = o == null ? null : o.toString();
        FormTokenBean tokenBean = FacesUtils.getObject(FormTokenBean.BEAN_NAME, FormTokenBean.class);
        if (null == token || null == tokenBean || !tokenBean.validateToken(token)) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, FacesUtils.getMessage("global.exception.tokenExpired"), 
""));
        }
    }
}
        <h:form prependId="false">
            <pgfn:formToken/>
            <h:messages errorClass="error-msgs" errorStyle="color: red;"/>
            <h:commandButton id="btnSubmit" action="#{xxxBean.xxxMethod}" value="Submit}"            
        </h:form>