2016-08-13 26 views
1

我最近在我的Web應用程序中啓用了CSRF保護。有大約100多個包含FORM提交的JSP頁面。什麼是添加CSRF令牌的最佳方式:向所有FORM提交添加CSRF令牌

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> 

,使得所有的表單提交纔會有這種形式的數據。我不想將此參數添加到每個單獨的FORM提交。

+0

也許你想使用ajax? – FreezY

+0

我正要問同樣的問題,我也試圖創建自己的表單標籤,但屬性有點複雜,包括/傳遞給內部表單。接下來是在渲染時重寫表單行爲。將讓你張貼 – TecHunter

+0

最簡單的方法是使用JavaScript將此元素添加到每個表單 – TecHunter

回答

0

所以我終於找到了一個可行的解決方案。基本上我創建一個自定義FormRenderer這樣的:

import com.sun.faces.renderkit.html_basic.FormRenderer; 

import javax.el.ELContext; 
import javax.el.ExpressionFactory; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.context.ResponseWriter; 
import java.io.IOException; 

public class FormWithCSRFRenderer extends FormRenderer { 

    @Override 
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException { 
     log.debug("FormWithCSRFRenderer - Adding CSRF Token to form element"); 
     ELContext elContext = context.getELContext(); 
     ExpressionFactory expFactory = context.getApplication().getExpressionFactory(); 

     ResponseWriter writer = context.getResponseWriter(); 
     writer.startElement("input", component); 
     writer.writeAttribute("type", "hidden", null); 
     writer.writeAttribute("name", expFactory.createValueExpression(elContext, "${_csrf.parameterName}", String.class).getValue(elContext), null); 
     writer.writeAttribute("value", expFactory.createValueExpression(elContext, "${_csrf.token}", String.class).getValue(elContext), null); 
     writer.endElement("input"); 
     writer.write("\n"); 
     super.encodeEnd(context, component); 
    } 
} 

然後通過faces-config.xml設置它註冊它覆蓋FormRenderer:

<?xml version="1.0" encoding="UTF-8"?> 
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd" 
       version="2.2"> 
    <render-kit> 
     <renderer> 
      <component-family>javax.faces.Form</component-family> 
      <renderer-type>javax.faces.Form</renderer-type> 
      <renderer-class>com.acme.FormWithCSRFRenderer</renderer-class> 
     </renderer> 
    </render-kit> 
</faces-config> 

我試圖創建一個組件,然後將其添加爲孩子,但它不會讓我正確設置輸入的名稱,所以我直接寫它。

+0

爲什麼你需要這個?這解決了PrimeFaces尚未解決的問題嗎? – Kukeltje

+0

自從您添加與原始問題完全無關的標記(jsf例如)後,我恢復了標記編輯。 – Kukeltje