这里参考jfinal社区的xss处理方式这里简单记录一下。
1.首先:创建XssHandler 代码如下:
package com.gdszgl.common.handler;
import com.jfinal.handler.Handler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jsoup.helper.StringUtil;
import java.util.Date;
import java.util.regex.Pattern;
/**
* 全局xss过滤
* @author ren
* @date 创建时间:2017年5月18日 下午1:45:37
*/
public class XssHandler extends Handler {
// 排除的url,使用的target.startsWith匹配的
private String excludePattern;
/**
* 忽略列表,使用正则
* @param excludePattern
*/
public XssHandler(String excludePattern) {
System.out.println("进入xss拦截------------------------------"+new Date());
this.excludePattern = excludePattern;
}
@Override
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
java.util.regex.Pattern pattern = Pattern.compile(excludePattern);
//带.表示非action请求,忽略(其实不太严谨,如果是伪静态,比如.html会被错误地排除);匹配excludePattern的,忽略
if (target.indexOf(".") == -1 && !(!StringUtil.isBlank(excludePattern) && pattern.matcher(target).find() ) ){
request = new XssHttpServletRequestWrapper(request);
}
//别忘了
next.handle(target, request, response, isHandled);
}
}
2.重写 HttpServletRequestWrapper用于配合XssHandler
package com.gdszgl.common.handler;
import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist;
import javax.servlet.http.HttpServletRequest;
import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.util.HashMap;
import java.util.Map;
/**
* 重写HttpServletRequestWrapper用于配合XssHandler
* @author ren
* @date 创建时间:2017年5月18日 下午1:49:26
*/
public class XssHttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper{
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
/**
* 重写并过滤getParameter方法
*/
@Override
public String getParameter(String name) {
return getBasicHtmlandimage(super.getParameter(name));
}
/**
* 重写并过滤getParameterValues方法
*/
@Override
public String[] getParameterValues(String name) {
String[] values = super.getParameterValues(name);
if (null == values){
return null;
}
for (int i = 0; i < values.length; i++) {
values[i] = getBasicHtmlandimage(values[i]);
}
return values;
}
/**
* 重写并过滤getParameterMap方法
*/
@Override
public Map<String,String[]> getParameterMap() {
@SuppressWarnings("unchecked")
Map<String,String[]> paraMap = super.getParameterMap();
// 对于paraMap为空的直接return
if (null == paraMap || paraMap.isEmpty()) {
return paraMap;
}
//super.getParameterMap()不允许任何修改,所以只能做深拷贝
Map<String, String[]> paraMapCopy = new HashMap<String, String[]>();
//实际上putAll只对基本类型深拷贝有效,如果是自定义类型,则要找其他办法
paraMapCopy.putAll(paraMap);
for (Map.Entry<String, String[]> entry : paraMapCopy.entrySet()) {
String[] values = entry.getValue();
if (null == values) {
continue;
}
String[] newValues = new String[values.length];
for (int i = 0; i < values.length; i++) {
newValues[i] = getBasicHtmlandimage(values[i]);
}
entry.setValue(newValues);
}
return paraMapCopy;
}
private static String getBasicHtmlandimage(String html) {
if (html == null)
return null;
html=Jsoup.clean(html, Whitelist.basicWithImages());
//再次过滤
return html;
}
}
3.最后在 _MainConfig 启动类中把handler 注册进去。
public void configHandler(Handlers me) {
//添加xss 过滤(正则表达式:"/((\\%3C)|<)((\\%2F)|\\/)*[a-z0-9\\%]+((\\%3E)|>)/ix")
me.add(new XssHandler("/((\\%3C)|<)((\\%2F)|\\/)*[a-z0-9\\%]+((\\%3E)|>)/ix"));
}
ok ,完成。