package cc.mrbird.febs.common.xss; 
 | 
  
 | 
import org.apache.commons.lang3.BooleanUtils; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.slf4j.Logger; 
 | 
import org.slf4j.LoggerFactory; 
 | 
  
 | 
import javax.servlet.*; 
 | 
import javax.servlet.http.HttpServletRequest; 
 | 
import java.io.IOException; 
 | 
import java.util.ArrayList; 
 | 
import java.util.Arrays; 
 | 
import java.util.List; 
 | 
import java.util.regex.Matcher; 
 | 
import java.util.regex.Pattern; 
 | 
  
 | 
/** 
 | 
 * Xss攻击拦截器 
 | 
 * 
 | 
 * @author MrBird 
 | 
 */ 
 | 
public class XssFilter implements Filter { 
 | 
  
 | 
    private static Logger logger = LoggerFactory.getLogger(XssFilter.class); 
 | 
    /** 
 | 
     * 是否过滤富文本内容 
 | 
     */ 
 | 
    private boolean flag = false; 
 | 
  
 | 
    private List<String> excludes = new ArrayList<>(); 
 | 
  
 | 
    @Override 
 | 
    public void init(FilterConfig filterConfig) { 
 | 
        logger.info("------------ xss filter init ------------"); 
 | 
        String isIncludeRichText = filterConfig.getInitParameter("isIncludeRichText"); 
 | 
        if (StringUtils.isNotBlank(isIncludeRichText)) { 
 | 
            flag = BooleanUtils.toBoolean(isIncludeRichText); 
 | 
        } 
 | 
        String temp = filterConfig.getInitParameter("excludes"); 
 | 
        if (temp != null) { 
 | 
            String[] url = temp.split(","); 
 | 
            excludes.addAll(Arrays.asList(url)); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
 | 
            throws IOException, ServletException { 
 | 
        HttpServletRequest req = (HttpServletRequest) request; 
 | 
        if (handleExcludeUrl(req)) { 
 | 
            chain.doFilter(request, response); 
 | 
            return; 
 | 
        } 
 | 
        XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request, flag); 
 | 
        chain.doFilter(xssRequest, response); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void destroy() { 
 | 
        // do nothing 
 | 
    } 
 | 
  
 | 
    private boolean handleExcludeUrl(HttpServletRequest request) { 
 | 
        if (excludes == null || excludes.isEmpty()) { 
 | 
            return false; 
 | 
        } 
 | 
        String url = request.getServletPath(); 
 | 
        return excludes.stream().map(pattern -> Pattern.compile("^" + pattern)).map(p -> p.matcher(url)).anyMatch(Matcher::find); 
 | 
    } 
 | 
  
 | 
} 
 |