| package cc.mrbird.febs.common.xss; | 
|   | 
| import cc.mrbird.febs.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; | 
|     } | 
|   | 
| } |