그래서 마침내 작동하는 해결책을 찾았습니다. 기본적으로 나는이 같은 사용자 정의 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를 오버라이드 (override)에 등록 :
<?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>
나는 다음 구성 요소를 만들 자녀로 추가하려했지만 입력의 이름을 올바르게 설정하지 않아서 직접 작성했습니다.
아마 아약스를 사용하고 싶습니까? – FreezY
나는 같은 질문을하려고했는데, 나 또한 내 양식 태그를 만들려고했지만 속성은 내부 양식에 포함 시키거나 통과시키기에 약간 복잡하다. 다음은 렌더링 될 때 양식 동작을 재정의하는 것입니다. – TecHunter
가장 쉬운 방법은 모든 요소에이 요소를 추가하는 것입니다. – TecHunter