返回顶部
首页 > 资讯 > 精选 >java配置多个过滤器优先级是什么
  • 427
分享到

java配置多个过滤器优先级是什么

2023-06-20 14:06:49 427人浏览 八月长安
摘要

这篇文章主要为大家展示了“java配置多个过滤器优先级是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java配置多个过滤器优先级是什么”这篇文章吧。过滤器配置:package c

这篇文章主要为大家展示了“java配置多个过滤器优先级是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java配置多个过滤器优先级是什么”这篇文章吧。

过滤器配置:

package cn.ask.filter;import javax.servlet.DispatcherType; import org.springframework.boot.WEB.servlet.FilterReGIStrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.filter.DelegatingFilterProxy; @SuppressWarnings("all")@Configurationpublic class FilterConfig {@Beanpublic FilterRegistrationBean xssFilterRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setDispatcherTypes(DispatcherType.REQUEST);registration.setFilter(new XssFilter());registration.addUrlPatterns("@Beanpublic FilterRegistrationBean cookieRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setDispatcherTypes(DispatcherType.REQUEST);registration.setFilter(new CookieFilter());registration.addUrlPatterns("public class CookieFilter implements Filter {         public CookieFilter() {        // TODO Auto-generated constructor stub    } public void destroy() {// TODO Auto-generated method stub} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {httpservletRequest req = (HttpServletRequest) request;String tokenHeader = req.getHeader("token");if(StringUtils.isBlank(tokenHeader)) {Cookie[] cookies = req.getCookies();if (cookies != null && cookies.length > 0) {for (int i = 0; i < cookies.length; i++) {String name = cookies[i].getName();String value = cookies[i].getValue();if ("user_accesstoken".equals(name)) { // 用户tokenreq.setAttribute("token", URLDecoder.decode(value, "utf-8"));}if ("user_avatar".equals(name)) { // 头像req.setAttribute("avatar", URLDecoder.decode(value, "utf-8"));}if ("user_nickname".equals(name)) { // 昵称req.setAttribute("nickname", URLDecoder.decode(value, "utf-8"));}String token = (String) req.getAttribute("token");if (StringUtils.isBlank(token)) {req.setAttribute("isLogin", "no");} else {req.setAttribute("isLogin", "yes");}}}else {req.removeAttribute("token");req.removeAttribute("avatar");req.removeAttribute("nickname");req.setAttribute("isLogin", "no");}} else {req.setAttribute("token", tokenHeader);}chain.doFilter(request, response);} public void init(FilterConfig fConfig) throws ServletException {// TODO Auto-generated method stub} }

常用过滤器之二:

xss过滤以及防html注入过滤(包括过滤敏感词)

package cn.ask.filter; import java.io.IOException; import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;  public class XssFilter implements Filter { @Overridepublic void init(FilterConfig config) throws ServletException {} @Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {XsshttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);chain.doFilter(xssRequest, response);} @Overridepublic void destroy() {} }
package cn.ask.filter;import java.io.ByteArrayInputStream;import java.io.IOException;import java.util.LinkedHashMap;import java.util.Map;import javax.servlet.ReadListener;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper; import org.apache.commons.io.IOUtils;import org.apache.commons.lang3.StringUtils;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;  public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {        HttpServletRequest orgRequest;        private final static HtmlFilter HTMLFILTER = new HtmlFilter();     public XssHttpServletRequestWrapper(HttpServletRequest request) {        super(request);        orgRequest = request;    }     @Override    public ServletInputStream getInputStream() throws IOException {        //非JSON类型,直接返回        if(!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_jsON_VALUE)){            return super.getInputStream();        }         //为空,直接返回        String json = IOUtils.toString(super.getInputStream(), "utf-8");        if (StringUtils.isBlank(json)) {            return super.getInputStream();        }         //xss过滤        json = xssEncode(json);        final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes());        return new ServletInputStream() {            @Override            public boolean isFinished() {                return true;            }             @Override            public boolean isReady() {                return true;            }             @Override            public void setReadListener(ReadListener readListener) {             }             @Override            public int read() throws IOException {                return bis.read();            }        };    }     @Override    public String getParameter(String name) {        String value = super.getParameter(xssEncode(name));        if (StringUtils.isNotBlank(value)) {            value = xssEncode(value);        }        return value;    }     @Override    public String[] getParameterValues(String name) {        String[] parameters = super.getParameterValues(name);        if (parameters == null || parameters.length == 0) {            return null;        }         for (int i = 0; i < parameters.length; i++) {            parameters[i] = xssEncode(parameters[i]);        }        return parameters;    }     @Override    public Map<String,String[]> getParameterMap() {        Map<String,String[]> map = new LinkedHashMap<>();        Map<String,String[]> parameters = super.getParameterMap();        for (String key : parameters.keySet()) {            String[] values = parameters.get(key);            for (int i = 0; i < values.length; i++) {                values[i] = xssEncode(values[i]);            }            map.put(key, values);        }        return map;    }     @Override    public String getHeader(String name) {        String value = super.getHeader(xssEncode(name));        if (StringUtils.isNotBlank(value)) {            value = xssEncode(value);        }        return value;    }    //富文本内容放行    private String xssEncode(String input) {    if(!input.startsWith("<p")&&!input.startsWith("<ol")&&!input.startsWith("<ul")&&!input.startsWith("<hr/>")) {    input=HTMLFILTER.filter(input);    }        //敏感词过滤        input=SensitiveWordUtils.getSensitiveWordUtils().replaceSensitiveWord(input, '*', 2);        return input;            }         public HttpServletRequest getOrgRequest() {        return orgRequest;    }         public static HttpServletRequest getOrgRequest(HttpServletRequest request) {        if (request instanceof XssHttpServletRequestWrapper) {            return ((XssHttpServletRequestWrapper) request).getOrgRequest();        }         return request;    } }
package cn.ask.filter; import java.util.*;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentMap;import java.util.logging.Logger;import java.util.regex.Matcher;import java.util.regex.Pattern; public final class HtmlFilter {         private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;    private static final Pattern P_COMMENTS = Pattern.compile("<!--(.*?)-->", Pattern.DOTALL);    private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI);    private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL);    private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI);    private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI);    private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI);    private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI);    private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI);    private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?");    private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?");    private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?");    private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))");    private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL);    private static final Pattern P_END_ARROW = Pattern.compile("^>");    private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)");    private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)");    private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)");    private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)");    private static final Pattern P_AMP = Pattern.compile("&");    private static final Pattern P_QUOTE = Pattern.compile("<");    private static final Pattern P_LEFT_ARROW = Pattern.compile("<");    private static final Pattern P_RIGHT_ARROW = Pattern.compile(">");    private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>");    private static final String SS="#//";         private static final ConcurrentMap<String,Pattern> P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<String, Pattern>();    private static final ConcurrentMap<String,Pattern> P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<String, Pattern>();         private final Map<String, List<String>> vAllowed;        private final Map<String, Integer> vTaGCounts = new HashMap<String, Integer>();         private final String[] vSelfClosingTags;        private final String[] vNeedClosingTags;        private final String[] vDisallowed;        private final String[] vProtocolAtts;        private final String[] vAllowedProtocols;        private final String[] vRemoveBlanks;        private final String[] vAllowedEntities;        private final boolean stripComment;    private final boolean encodeQuotes;    private boolean vDebug = false;        private final boolean alwaysMakeTags;         public HtmlFilter() {        vAllowed = new HashMap<>();         final ArrayList<String> aAtts = new ArrayList<String>();        aAtts.add("href");        aAtts.add("target");        vAllowed.put("a", aAtts);         final ArrayList<String> imgAtts = new ArrayList<String>();        imgAtts.add("src");        imgAtts.add("width");        imgAtts.add("height");        imgAtts.add("alt");        vAllowed.put("img", imgAtts);         final ArrayList<String> noAtts = new ArrayList<String>();        vAllowed.put("b", noAtts);        vAllowed.put("strong", noAtts);        vAllowed.put("i", noAtts);        vAllowed.put("em", noAtts);         vSelfClosingTags = new String[]{"img"};        vNeedClosingTags = new String[]{"a", "b", "strong", "i", "em"};        vDisallowed = new String[]{};                vAllowedProtocols = new String[]{"http", "mailto", "https"};        vProtocolAtts = new String[]{"src", "href"};        vRemoveBlanks = new String[]{"a", "b", "strong", "i", "em"};        vAllowedEntities = new String[]{"amp", "gt", "lt", "quot"};        stripComment = true;        encodeQuotes = true;        alwaysMakeTags = true;    }         public HtmlFilter(final boolean debug) {        this();        vDebug = debug;     }         @SuppressWarnings("unchecked")public HtmlFilter(final Map<String,Object> conf) {         assert conf.containsKey("vAllowed") : "configuration requires vAllowed";        assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags";        assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags";        assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed";        assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols";        assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts";        assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks";        assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities";         vAllowed = Collections.unmodifiableMap((HashMap<String, List<String>>) conf.get("vAllowed"));        vSelfClosingTags = (String[]) conf.get("vSelfClosingTags");        vNeedClosingTags = (String[]) conf.get("vNeedClosingTags");        vDisallowed = (String[]) conf.get("vDisallowed");        vAllowedProtocols = (String[]) conf.get("vAllowedProtocols");        vProtocolAtts = (String[]) conf.get("vProtocolAtts");        vRemoveBlanks = (String[]) conf.get("vRemoveBlanks");        vAllowedEntities = (String[]) conf.get("vAllowedEntities");        stripComment =  conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true;        encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true;        alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true;    }     private void reset() {        vTagCounts.clear();    }     private void debug(final String msg) {        if (vDebug) {            Logger.getAnonymousLogger().info(msg);        }    }     //---------------------------------------------------------------        public static String chr(final int decimal) {        return String.valueOf((char) decimal);    }     public static String htmlSpecialChars(final String s) {        String result = s;        result = regexReplace(P_AMP, "&amp;", result);        result = regexReplace(P_QUOTE, "&quot;", result);        result = regexReplace(P_LEFT_ARROW, "&lt;", result);        result = regexReplace(P_RIGHT_ARROW, "&gt;", result);        return result;    }     //---------------------------------------------------------------        public String filter(final String input) {        reset();        String s = input;         debug("************************************************");        debug("              INPUT: " + input);         s = escapeComments(s);        debug("     escapeComments: " + s);         s = balanceHTML(s);        debug("        balanceHTML: " + s);         s = checkTags(s);        debug("          checkTags: " + s);         s = processRemoveBlanks(s);        debug("processRemoveBlanks: " + s);         s = validateEntities(s);        debug("    validateEntites: " + s);         debug("************************************************\n\n");        return s;    }     public boolean isAlwaysMakeTags(){        return alwaysMakeTags;    }     public boolean isStripComments(){        return stripComment;    }     private String escapeComments(final String s) {        final Matcher m = P_COMMENTS.matcher(s);        final StringBuffer buf = new StringBuffer();        if (m.find()) {                    final String match = m.group(1);             m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->"));        }        m.appendTail(buf);         return buf.toString();    }     private String balanceHTML(String s) {        if (alwaysMakeTags) {            //            // try and fORM html            //            s = regexReplace(P_END_ARROW, "", s);            s = regexReplace(P_BODY_TO_END, "<$1>", s);            s = regexReplace(P_XML_CONTENT, "$1<$2", s);         } else {            //            // escape stray brackets            //            s = regexReplace(P_STRAY_LEFT_ARROW, "&lt;$1", s);            s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2&gt;<", s);             //            // the last regexp causes '<>' entities to appear            // (we need to do a lookahead assertion so that the last bracket can            // be used in the next pass of the regexp)            //            s = regexReplace(P_BOTH_ARROWS, "", s);        }         return s;    }     private String checkTags(String s) {        Matcher m = P_TAGS.matcher(s);         final StringBuffer buf = new StringBuffer();        while (m.find()) {            String replaceStr = m.group(1);            replaceStr = processTag(replaceStr);            m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));        }        m.appendTail(buf);         s = buf.toString();         // these get tallied in processTag        // (remember to reset before subsequent calls to filter method)        for (String key : vTagCounts.keySet()) {            for (int ii = 0; ii < vTagCounts.get(key); ii++) {                s += "</" + key + ">";            }        }         return s;    }     private String processRemoveBlanks(final String s) {        String result = s;        for (String tag : vRemoveBlanks) {            if(!P_REMOVE_PAIR_BLANKS.containsKey(tag)){                P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?></" + tag + ">"));            }            result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result);            if(!P_REMOVE_SELF_BLANKS.containsKey(tag)){                P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>"));            }            result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);        }         return result;    }     private static String regexReplace(final Pattern regexPattern, final String replacement, final String s) {        Matcher m = regexPattern.matcher(s);        return m.replaceAll(replacement);    }     private String processTag(final String s) {        // ending tags        Matcher m = P_END_TAG.matcher(s);        if (m.find()) {            final String name = m.group(1).toLowerCase();            if (allowed(name)) {                if (!inArray(name, vSelfClosingTags)) {                    if (vTagCounts.containsKey(name)) {                        vTagCounts.put(name, vTagCounts.get(name) - 1);                        return "</" + name + ">";                    }                }            }        }        // starting tags        m = P_START_TAG.matcher(s);        if (m.find()) {            final String name = m.group(1).toLowerCase();            final String body = m.group(2);            String ending = m.group(3);            //debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" );            if (allowed(name)) {                String params = "";                final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);                final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);                final List<String> paramNames = new ArrayList<String>();                final List<String> paramValues = new ArrayList<String>();                while (m2.find()) {                                    paramNames.add(m2.group(1));                                         paramValues.add(m2.group(3));                 }                while (m3.find()) {                                    paramNames.add(m3.group(1));                                        paramValues.add(m3.group(3));                 }                String paramName, paramValue;                for (int ii = 0; ii < paramNames.size(); ii++) {                    paramName = paramNames.get(ii).toLowerCase();                    paramValue = paramValues.get(ii);                    if (allowedAttribute(name, paramName)) {                        if (inArray(paramName, vProtocolAtts)) {                            paramValue = processParamProtocol(paramValue);                        }                        params += " " + paramName + "=\"" + paramValue + "\"";                    }                }                if (inArray(name, vSelfClosingTags)) {                    ending = " /";                }                if (inArray(name, vNeedClosingTags)) {                    ending = "";                }                if (ending == null || ending.length() < 1) {                    if (vTagCounts.containsKey(name)) {                        vTagCounts.put(name, vTagCounts.get(name) + 1);                    } else {                        vTagCounts.put(name, 1);                    }                } else {                    ending = " /";                }                return "<" + name + params + ending + ">";            } else {                return "";            }        }        // comments        m = P_COMMENT.matcher(s);        if (!stripComment && m.find()) {            return  "<" + m.group() + ">";        }        return "";    }     private String processParamProtocol(String s) {        s = decodeEntities(s);        final Matcher m = P_PROTOCOL.matcher(s);        if (m.find()) {            final String protocol = m.group(1);            if (!inArray(protocol, vAllowedProtocols)) {                // bad protocol, turn into local anchor link instead                s = "#" + s.substring(protocol.length() + 1, s.length());                if (s.startsWith(SS)) {                    s = "#" + s.substring(3, s.length());                }            }        }         return s;    }     private String decodeEntities(String s) {        StringBuffer buf = new StringBuffer();         Matcher m = P_ENTITY.matcher(s);        while (m.find()) {            final String match = m.group(1);            final int decimal = Integer.decode(match).intValue();            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));        }        m.appendTail(buf);        s = buf.toString();         buf = new StringBuffer();        m = P_ENTITY_UNICODE.matcher(s);        while (m.find()) {            final String match = m.group(1);            final int decimal = Integer.valueOf(match, 16).intValue();            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));        }        m.appendTail(buf);        s = buf.toString();         buf = new StringBuffer();        m = P_ENCODE.matcher(s);        while (m.find()) {            final String match = m.group(1);            final int decimal = Integer.valueOf(match, 16).intValue();            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));        }        m.appendTail(buf);        s = buf.toString();         s = validateEntities(s);        return s;    }     private String validateEntities(final String s) {        StringBuffer buf = new StringBuffer();         // validate entities throughout the string        Matcher m = P_VALID_ENTITIES.matcher(s);        while (m.find()) {                    final String one = m.group(1);                        final String two = m.group(2);            m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));        }        m.appendTail(buf);         return encodeQuotes(buf.toString());    }     private String encodeQuotes(final String s){        if(encodeQuotes){            StringBuffer buf = new StringBuffer();            Matcher m = P_VALID_QUOTES.matcher(s);            while (m.find()) {                            final String one = m.group(1);                                final String two = m.group(2);                                 final String three = m.group(3);                m.appendReplacement(buf, Matcher.quoteReplacement(one + regexReplace(P_QUOTE, "&quot;", two) + three));            }            m.appendTail(buf);            return buf.toString();        }else{            return s;        }    }     private String checkEntity(final String preamble, final String term) {         return ";".equals(term) && isValidEntity(preamble)                ? '&' + preamble                : "&amp;" + preamble;    }     private boolean isValidEntity(final String entity) {        return inArray(entity, vAllowedEntities);    }     private static boolean inArray(final String s, final String[] array) {        for (String item : array) {            if (item != null && item.equals(s)) {                return true;            }        }        return false;    }     private boolean allowed(final String name) {        return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);    }     private boolean allowedAttribute(final String name, final String paramName) {        return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));    }}

敏感词过滤工具

import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Serializable;import java.util.*; import org.springframework.core.io.ClassPathResource; @SuppressWarnings("all")public class SensitiveWordUtils implements Serializable { private static final long serialVersionUID = 1L; private SensitiveWordUtils() {} private static SensitiveWordUtils sensitiveWordUtils = null; public synchronized static SensitiveWordUtils getSensitiveWordUtils() {if (sensitiveWordUtils == null) {sensitiveWordUtils = new SensitiveWordUtils();}return sensitiveWordUtils;} private static Set<String> sensitiveWordSet = null; static {try {readResource("keywords.txt");} catch (Exception e) {e.printStackTrace();}// 初始化敏感词库initSensitiveWordMap();} private static final int MinMatchTYpe = 1; // 最小匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国]人private static final int MaxMatchType = 2; // 最大匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国人] private static HashMap sensitiveWordMap = new HashMap<>(); private static void readResource(String name) throws Exception {ClassPathResource resource = new ClassPathResource(name);InputStream inputStream = resource.getInputStream();InputStreamReader read = new InputStreamReader(inputStream, "utf-8");// 初始化set集合sensitiveWordSet = new HashSet<String>();// 缓冲区读取流BufferedReader bufferedReader = new BufferedReader(read);// 循环读取文件中内容,每次读取一行内容String txt = null;while ((txt = bufferedReader.readLine()) != null) {// 读取文件,将文件内容放入到set中sensitiveWordSet.add(txt);}read.close();} private static void initSensitiveWordMap() {// 初始化敏感词容器,减少扩容操作sensitiveWordMap = new HashMap(sensitiveWordSet.size());String key;Map nowMap;Map<String, String> newWorMap;// 迭代sensitiveWordSetIterator<String> iterator = sensitiveWordSet.iterator();while (iterator.hasNext()) {// 关键字key = iterator.next();nowMap = sensitiveWordMap;for (int i = 0; i < key.length(); i++) {// 转换成char型char keyChar = key.charAt(i);// 库中获取关键字Object wordMap = nowMap.get(keyChar);// 如果存在该key,直接赋值,用于下一个循环获取if (wordMap != null) {nowMap = (Map) wordMap;} else {// 不存在则,则构建一个map,同时将isEnd设置为0,因为他不是最后一个newWorMap = new HashMap<>();// 不是最后一个newWorMap.put("isEnd", "0");nowMap.put(keyChar, newWorMap);nowMap = newWorMap;} if (i == key.length() - 1) {// 最后一个nowMap.put("isEnd", "1");}}}} private int checkSensitiveWord(String txt, int beginIndex, int matchType) {// 敏感词结束标识位:用于敏感词只有1位的情况boolean flag = false;// 匹配标识数默认为0int matchFlag = 0;char word;Map nowMap = sensitiveWordMap;for (int i = beginIndex; i < txt.length(); i++) {word = txt.charAt(i);// 获取指定keynowMap = (Map) nowMap.get(word);if (nowMap != null) {// 存在,则判断是否为最后一个// 找到相应key,匹配标识+1matchFlag++;// 如果为最后一个匹配规则,结束循环,返回匹配标识数if ("1".equals(nowMap.get("isEnd"))) {// 结束标志位为trueflag = true;// 最小规则,直接返回,最大规则还需继续查找if (MinMatchTYpe == matchType) {break;}}} else {// 不存在,直接返回break;}}if (matchFlag < 2 || !flag) {// 长度必须大于等于1,为词matchFlag = 0;}return matchFlag;} public boolean contains(String txt, int matchType) {boolean flag = false;for (int i = 0; i < txt.length(); i++) {int matchFlag = checkSensitiveWord(txt, i, matchType); // 判断是否包含敏感字符if (matchFlag > 0) { // 大于0存在,返回trueflag = true;}}return flag;} public Set<String> getSensitiveWord(String txt, int matchType) {Set<String> sensitiveWordList = new HashSet<>(); for (int i = 0; i < txt.length(); i++) {// 判断是否包含敏感字符int length = checkSensitiveWord(txt, i, matchType);if (length > 0) {// 存在,加入list中sensitiveWordList.add(txt.substring(i, i + length));i = i + length - 1;// 减1的原因,是因为for会自增}} return sensitiveWordList;} public String replaceSensitiveWord(String txt, char replaceChar, int matchType) {String resultTxt = txt;// 获取所有的敏感词Set<String> set = getSensitiveWord(txt, matchType);Iterator<String> iterator = set.iterator();String word;String replaceString;while (iterator.hasNext()) {word = iterator.next();replaceString = getReplaceChars(replaceChar, word.length());resultTxt = resultTxt.replaceAll(word, replaceString);} return resultTxt;} private String getReplaceChars(char replaceChar, int length) {String resultReplace = String.valueOf(replaceChar);for (int i = 1; i < length; i++) {resultReplace += replaceChar;}return resultReplace;}}

以上是“java配置多个过滤器优先级是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: java配置多个过滤器优先级是什么

本文链接: https://lsjlt.com/news/297043.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java配置多个过滤器优先级是什么
    这篇文章主要为大家展示了“java配置多个过滤器优先级是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java配置多个过滤器优先级是什么”这篇文章吧。过滤器配置:package c...
    99+
    2023-06-20
  • java配置多个过滤器优先级以及几个常用过滤器操作
    目录过滤器配置:常用过滤器之一:常用过滤器之二:敏感词过滤工具类一个项目中不出意外的话会有两个以上的过滤器,但是直接不配置的话他会按照你的过滤器名字排序执行,这样的话可能会导致一些性...
    99+
    2024-04-02
  • SpringBoot的配置优先级是什么
    本篇内容主要讲解“SpringBoot的配置优先级是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot的配置优先级是什么”吧!SpringBoot里的官方文档叫做Extern...
    99+
    2023-06-04
  • Java springboot配置文件、多环境配置与运行优先级的方法是什么
    本篇内容主要讲解“Java springboot配置文件、多环境配置与运行优先级的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java springboot配置文...
    99+
    2023-07-05
  • Java多线程怎么设置优先级
    本篇内容介绍了“Java多线程怎么设置优先级”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!举例说明:我们知道飞机在天上飞行是有固定的航线(可...
    99+
    2023-06-29
  • java线程优先级指的是什么
    这篇文章给大家分享的是有关java线程优先级指的是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网...
    99+
    2023-06-14
  • css选择器优先级是什么
    小编给大家分享一下css选择器优先级是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 选择器优先级由高到低分别为: ...
    99+
    2024-04-02
  • java运算符的优先级顺序是什么
    Java运算符的优先级顺序如下:1. 一元运算符(例如 ++、--、+、-、!、~)2. 算术运算符(例如 *、/、%、+、-)3....
    99+
    2023-09-23
    java
  • css选择器优先级是什么意思
    这篇文章主要介绍“css选择器优先级是什么意思”,在日常操作中,相信很多人在css选择器优先级是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css选择器优先级是什么意思”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-20
  • CSS选择器优先级的分类是什么
    这篇文章主要讲解了“CSS选择器优先级的分类是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS选择器优先级的分类是什么”吧!一、优先级的分类我们可以把 CSS 的优先级从高到低来分成...
    99+
    2023-06-27
  • css选择器的优先级排序是什么
    CSS选择器的优先级排序如下:1. !important:具有最高优先级,会覆盖其他所有规则。2. 内联样式:通过style属性直接...
    99+
    2023-10-12
    css
  • css选择器优先级最高的是什么
    css 选择器优先级最高的是内联样式,它直接写在 html 元素的 style 属性中,具有最高的优先级,其他优先级依次为:id 选择器、类选择器、元素选择器、通配符选择器。 CSS选...
    99+
    2024-04-06
    css css选择器 html元素 id选择器
  • java过滤器执行顺序是什么
    Java过滤器的执行顺序是根据过滤器的配置顺序来确定的。在web.xml文件中,过滤器的配置顺序决定了它们的执行顺序。当一个请求被发...
    99+
    2023-08-11
    java
  • java中filter过滤器的用法是什么
    在Java中,过滤器(Filter)是一种用于在请求到达目标资源之前或之后执行某些操作的组件。过滤器可以用于实现对请求的拦截、修改或...
    99+
    2023-10-11
    java
  • java过滤器的工作原理是什么
    Java过滤器的工作原理是基于Servlet规范中的过滤器接口(javax.servlet.Filter)来实现的。过滤器可以用于在...
    99+
    2023-08-26
    java
  • java中的监听器和过滤器是什么
    本篇内容介绍了“java中的监听器和过滤器是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录介绍:作用域对象:Servt规范扩展---...
    99+
    2023-06-20
  • css选择器的优先级从高到低是什么意思
    css选择器优先级从高到低:行内样式id选择器类选择器标签选择器通用选择器 CSS 选择器优先级从高到低 CSS 选择器优先级决定了多个选择器应用到 HTML 元素时,哪个选择器将生效...
    99+
    2024-04-06
    css css选择器
  • SpringBoot多数据源配置的过程是什么
    本篇内容主要讲解“SpringBoot多数据源配置的过程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot多数据源配置的过程是什么”吧!前言多数据源的核心就是向 IOC 容...
    99+
    2023-06-25
  • nginx配置多个server的方法是什么
    要配置多个server,可以按照以下步骤进行操作:1. 打开Nginx配置文件,在Linux上通常是 `/etc/nginx/ngi...
    99+
    2023-09-14
    nginx
  • Spring mvc中内置编码过滤器的原理是什么
    Spring mvc中内置编码过滤器的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。web.xml 中 添加如下配置:<filter> ...
    99+
    2023-05-31
    springmvc 滤器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作