J2EE Filter中修改request內容


  最近在做一個微信相關的網站,很多地方涉及到微信表情的輸入,導致內容無法插入到數據庫,雖然有用到一個表情過濾的工具類,但是需要過濾的地方比較多,於是想到在過濾器中過濾用戶請求的內容。  

  request這個方法里,有getParameter(String name)、getParameterValues(String name)、getParameterNames()以及getParameterMap()是可以獲得參數鍵值對的,Servlet自帶的HttpServletRequest的方法是不支持修改用戶請求類型的,我也嘗試過直接去修改,都以異常收尾,后面我想到HttpServletRequest既然是一個接口,那我去實現它,然后直接用我們實現的類傳到filterChain.doFilter(servletRequest, servletResponse)里面不也可以么,可是要實現的方法也太多了,好在ServletApi提供了一個class HttpServletRequestWrapper封裝了這些方法,我們可以通過extends這個類,然后重寫一些重要的方法來修改用戶的請求,下面就開始我們的改造吧。 

  1.新建一個Filter,我給這個類命名為RequestFilter

public class RequestFilter implements Filter {
    private final Logger logger = LoggerFactory.getLogger(RequestWrapper.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
     
    }

    @Override
    public void destroy() {
    }

  
}
  2.新建一個類,通過繼承HttpServletRequestWrapper來實現request的作用。
class RequestWrapper extends HttpServletRequestWrapper {
        
    }

  3.新建一個private屬性:private Map<String, String[]> paramMap;用這個paramMap來存儲用戶請求的內容,並且在構造方法中初始化paramMap,初始化的方法為

paramMap = new HashMap<>();//定義
paramMap.putAll(request.getParameterMap());//初始化

 

  4.重寫上面提到的四個方法,

 @Override
        public String getParameter(String name) {
            String[] values = paramMap.get(name);
            if (values == null || values.length == 0) {
                return null;
            }
            return values[0];
        }

        @Override
        public String[] getParameterValues(String name) {
            return paramMap.get(name);
        }

        @Override
        public Enumeration<String> getParameterNames() {
            return new Enumeration<String>() {
                private Iterator<String> iterator = paramMap.keySet().iterator();

                @Override
                public boolean hasMoreElements() {
                    return iterator.hasNext();
                }

                @Override
                public String nextElement() {
                    return iterator.next();
                }
            };
        }

        @Override
        public Map<String, String[]> getParameterMap() {
            return paramMap;
        }

  5.通過以上這些操作,我們就可以實現對用戶請求進行修改。

  

public class RequestFilter implements Filter {
    private final Logger logger = LoggerFactory.getLogger(RequestWrapper.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        RequestWrapper requestWrapper = new RequestWrapper(request);
        if (request.getMethod().equals("POST")) {
            logger.debug("開始過濾請求中的表情字符");
            requestWrapper.emojiFilter();
        }
        filterChain.doFilter(requestWrapper, servletResponse);
    }

    @Override
    public void destroy() {
    }

    class RequestWrapper extends HttpServletRequestWrapper {
        private Map<String, String[]> paramMap;

        RequestWrapper(HttpServletRequest request) {
            super(request);
            paramMap = new HashMap<>();
            paramMap.putAll(request.getParameterMap());
        }

        @Override
        public String getParameter(String name) {
            String[] values = paramMap.get(name);
            if (values == null || values.length == 0) {
                return null;
            }
            return values[0];
        }

        @Override
        public String[] getParameterValues(String name) {
            return paramMap.get(name);
        }

        @Override
        public Enumeration<String> getParameterNames() {
            return new Enumeration<String>() {
                private Iterator<String> iterator = paramMap.keySet().iterator();

                @Override
                public boolean hasMoreElements() {
                    return iterator.hasNext();
                }

                @Override
                public String nextElement() {
                    return iterator.next();
                }
            };
        }

        @Override
        public Map<String, String[]> getParameterMap() {
            return paramMap;
        }

        private void resetParamMap(String key, String[] value) {
            paramMap.put(key, value);
        }

        //過濾表情
        void emojiFilter() {
            for (String key : paramMap.keySet()) {
                String[] valueSet = paramMap.get(key);
                if (BeanUtil.nonNull(valueSet) && valueSet.length > 0) {
                    logger.debug("過濾前:" + valueSet[0]);
                    valueSet[0] = EmojiFilter.filterEmoji(valueSet[0]);
                    logger.debug("過濾后:" + valueSet[0]);
                    resetParamMap(key, valueSet);
                }
            }
        }
    }
}

 


 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM