package com.xcong.excoin.common.xss; 
 | 
  
 | 
import com.xcong.excoin.common.utils.JsoupUtil; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
  
 | 
import javax.servlet.http.HttpServletRequest; 
 | 
import javax.servlet.http.HttpServletRequestWrapper; 
 | 
import java.util.stream.IntStream; 
 | 
  
 | 
/** 
 | 
 * Jsoup过滤 http请求,防止 Xss攻击 
 | 
 * 
 | 
 * @author MrBird 
 | 
 */ 
 | 
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { 
 | 
  
 | 
    private HttpServletRequest orgRequest; 
 | 
  
 | 
    private boolean isIncludeRichText; 
 | 
  
 | 
    XssHttpServletRequestWrapper(HttpServletRequest request, boolean isIncludeRichText) { 
 | 
        super(request); 
 | 
        orgRequest = request; 
 | 
        this.isIncludeRichText = isIncludeRichText; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 覆盖 getParameter方法,将参数名和参数值都做xss过滤 
 | 
     * 如果需要获得原始的值,则通过 super.getParameterValues(name)来获取 
 | 
     * getParameterNames,getParameterValues和 getParameterMap也可能需要覆盖 
 | 
     */ 
 | 
    @Override 
 | 
    public String getParameter(String name) { 
 | 
        if (("content".equals(name) || name.endsWith("WithHtml")) && !isIncludeRichText) { 
 | 
            return super.getParameter(name); 
 | 
        } 
 | 
        name = JsoupUtil.clean(name); 
 | 
        String value = super.getParameter(name); 
 | 
        if (StringUtils.isNotBlank(value)) { 
 | 
            value = JsoupUtil.clean(value); 
 | 
        } 
 | 
        return value; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public String[] getParameterValues(String name) { 
 | 
        String[] arr = super.getParameterValues(name); 
 | 
        if (arr != null) { 
 | 
            IntStream.range(0, arr.length).forEach(i -> arr[i] = JsoupUtil.clean(arr[i])); 
 | 
        } 
 | 
        return arr; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 覆盖getHeader方法,将参数名和参数值都做 xss过滤 
 | 
     * 如果需要获得原始的值,则通过super.getHeaders(name)来获取 
 | 
     * getHeaderNames 也可能需要覆盖 
 | 
     */ 
 | 
    @Override 
 | 
    public String getHeader(String name) { 
 | 
        name = JsoupUtil.clean(name); 
 | 
        String value = super.getHeader(name); 
 | 
        if (StringUtils.isNotBlank(value)) { 
 | 
            value = JsoupUtil.clean(value); 
 | 
        } 
 | 
        return value; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取原始的 request 
 | 
     */ 
 | 
    private HttpServletRequest getOrgRequest() { 
 | 
        return orgRequest; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取原始的 request的静态方法 
 | 
     */ 
 | 
    public static HttpServletRequest getOrgRequest(HttpServletRequest req) { 
 | 
        if (req instanceof XssHttpServletRequestWrapper) { 
 | 
            return ((XssHttpServletRequestWrapper) req).getOrgRequest(); 
 | 
        } 
 | 
        return req; 
 | 
    } 
 | 
  
 | 
} 
 |