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