spring mvc資料繫結時通過去除html標籤防止js注入

來源:互聯網
上載者:User

 現在做的項目之前沒有考慮到js注入的問題,現在想通過在spring對資料進行綁定時,去除html標籤來在後端防止js注入,首先先研讀它的源碼,我們大部分controller都是擴充MultiActionController這個類,用到的是bind(HttpServletRequest request, Object command)這個方法,它是通過調用createBinder方法建立ServletRequestDataBinder類來進行資料繫結,ServletRequestDataBinder類裡面的getInternalBindingResult方法就是返回綁定的結果,我們可以在這方法裡面加上自己的屬性編輯器(擴充PropertyEditorSupport類)對參數進行處理,於是實現的步驟是:1、寫個擴充PropertyEditorSupport類的字串處理類
2、定義自訂ServletRequestDataBinder,重寫getInternalBindingResult方法,3、擴充MultiActionController,重寫createBinder方法。

1.StringEditor類

public class StringEditor extends PropertyEditorSupport{  @Override  public void setAsText(String text) throws IllegalArgumentException {      if (text == null || (text = text.trim()).length() == 0) {          return;      }      try {        //去除html標籤        String str = text.replaceAll("<[a-zA-Z]+[1-9]?[^><]*>", "")                            .replaceAll("</[a-zA-Z]+[1-9]?>", "");            setValue(str);      } catch (Exception e) {          throw new IllegalArgumentException(e);      }  }}

2.CustomRequestDataBinder類

public class CustomRequestDataBinder extends ServletRequestDataBinder {  public CustomRequestDataBinder(Object target) {    super(target);  }  public CustomRequestDataBinder(Object target, String objectName) {    super(target, objectName);  }  @Override  protected AbstractPropertyBindingResult getInternalBindingResult() {      AbstractPropertyBindingResult bindingResult = super.getInternalBindingResult();      PropertyEditorRegistry registry = bindingResult.getPropertyEditorRegistry();      registry.registerCustomEditor(String.class, new StringEditor());      return bindingResult;  }}

3.CustomMultiActionController 類

public class CustomMultiActionController extends MultiActionController{    @Override  public ServletRequestDataBinder createBinder(HttpServletRequest request, Object command) throws Exception {    CustomRequestDataBinder binder = new CustomRequestDataBinder(command, getCommandName(command));    initBinder(request, binder);    return binder;  }}

這樣的話只要你的Controller擴充了CustomMultiActionController ,在進行資料繫結時就會把提交的資料中的html標籤去除,如果某些屬性需要有html標籤的話就通過request.getParameter來擷取沒轉換的資料。

這隻是一個簡單的例子,你還可以擴充其它的屬性編輯器,比如時間格式的,在提交時統一把date轉換為某種格式儲存。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.