public abstract class BaseController { /** * 初始化数据绑定 * 1. 将所有传递进来的String进行HTML编码,防止XSS攻击 * 2. 将字段中Date类型转换为String类型 */ @InitBinder protected void initBinder(WebDataBinder binder) { // String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击 binder.registerCustomEditor(String.class, new PropertyEditorSupport() { @Override public void setAsText(String text) { setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim())); } @Override public String getAsText() { Object value = getValue(); return value != null ? value.toString() : ""; } }); //…… }
我们看到关键的一句是:StringEscapeUtils.escapeHtml4(text.trim()));
那么当你想要在数据库中保存HTML内容的话有两个地方需要修改:
1.jsp:
<div class="control-group">
<label class="control-label">商品详情:</label>
<div class="controls">
<form:textarea id="detail" path="detail" htmlEscape="true" rows="4" maxlength="1024" class="input-xxlarge "/>
<sys:ckeditor replace="detail" uploadPath="/cms/article" />
</div>
</div>
关键一句:htmlEscape="true"
2.controller
在保存之前:进行解码操作。
ecProduct.setDetail(StringEscapeUtils.unescapeHtml4(ecProduct.getDetail().trim()));
后记:至于为什么CMS 中文章的添加就可以不用解码,数据库存放的就是 HTML格式那,我还没有搞清楚,如果你高明白了请留言告知谢谢。