2016-08-13 10 views
1

Недавно я включил защиту CSRF в своем веб-приложении. Есть около 100 + JSP-страниц, содержащих представление FORM. Каков наилучший способ добавления токена CSRF:Добавить токен CSRF во все заявки FORM

<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); 
    } 
} 

Затем зарегистрировать его, чтобы переопределить FormRenderer, установив его в faces-config.xml:

<?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

Смежные вопросы