1. 程式人生 > >關於在Spring過濾器中修改request的引數值遇到的問題(二)

關於在Spring過濾器中修改request的引數值遇到的問題(二)

  1. 背景
    見上一篇Blog關於在Spring過濾器中修改request的引數值遇到的問題(一)

  2. 問題描述
    Spring框架,使用過濾器解密request中的引數(修改Request中的值),並傳遞到下一個過濾器

  3. 錯誤詳情
    第一次的修改方式是這樣的(RSAUtil是封裝的一個工具類,filed是前臺input標籤的name)

    String encryptVal = request.getParameter(filed);
    String decryptVal = RSAUtil.decryptStringByJs(encryptVal);
    request.setAttribute(filed, decryptVal);

    這樣在下一個過濾器中根本無法用getParameter取到解密的值。debugger後發現request.getParameter(name)方法是從一個Map中獲取的

    第二次修改

    Map<String, String[]> parameterMap = request.getParameterMap();
    String encryptVal = request.getParameter(filed);
    String decryptVal = RSAUtil.decryptStringByJs(encryptVal);
    parameterMap.put(filed, decryptVal);

    可是這次執行直接報錯:不能更改一個鎖定的Map,好吧,百度百度,找到解決方案

  4. 解決方案
    定義一個request的包裝類

    import org.apache.catalina.util.ParameterMap;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import java.util.Map;
    
    public class ParameterRequestWrapper extends HttpServletRequestWrapper
    {
    private ParameterMap<String, String[]> params; @SuppressWarnings("all") public ParameterRequestWrapper(HttpServletRequest request) { super(request); params = (ParameterMap) request.getParameterMap(); // TODO Auto-generated constructor stub } @Override public String getParameter(String name) { // TODO Auto-generated method stub String[] values = params.get(name); if (values == null || values.length == 0) { return null; } return values[0]; } @Override public Map<String, String[]> getParameterMap() { // TODO Auto-generated method stub return params; } public void addParameter(String name, Object value) {// 增加引數 if (value != null) { params.setLocked(false); if (value instanceof String[]) { params.put(name, (String[]) value); } else if (value instanceof String) { params.put(name, new String[] { (String) value }); } else { params.put(name, new String[] { String.valueOf(value) }); } params.setLocked(true); } } }

    使用該包裝類

    ParameterRequestWrapper newRequest = new ParameterRequestWrapper(request);
    String encryptVal = request.getParameter(filed);
    String decryptVal = RSAUtil.decryptStringByJs(encryptVal);
    newRequest.addParameter(filed, decryptVal);

這下是搞定了,在之後的任何地方都可以用request.getParameter()來取得解密後的引數了

總結:有時候百度還是可以解決問題的,但接下來遇到的問題很尷尬百度沒有,見“關於在Spring過濾器中修改request的引數值遇到的問題(三)”