[Spring] 封裝request 自定義新增parameter
阿新 • • 發佈:2021-08-04
通過Filter實現
1 封裝reqeust
要點在於 public void setParameter(String name, Object value) 方法。 將引數放入到自己的map中去。
package com.autoyong.filter; import java.io.IOException; import java.util.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class ParamServletRequestWrapper extends HttpServletRequestWrapper { private Map<String , String[]> params = new HashMap<String, String[]>(); public ParamServletRequestWrapper(HttpServletRequest request) throws IOException{ super(request); this.params.putAll(request.getParameterMap()); } public void addAllParameters(Map<String, Object> extraParams) { for (Map.Entry<String, Object> entry : extraParams.entrySet()) { setParameter(entry.getKey(), entry.getValue()); } } public void setParameter(String name, Object value) { if (value != null) { 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)}); } } } @Override public Enumeration<String> getParameterNames() { Vector<String> vector = new Vector<String>(params.keySet()); return vector.elements(); } /** * 重寫getParameter,代表引數從當前類中的map獲取 * @param name * @return */ @Override public String getParameter(String name) { String[]values = params.get(name); if(values == null || values.length == 0) { return null; } return values[0]; } /** * 重寫getParameterValues方法,從當前類的 map中取值 * @param name * @return */ @Override public String[] getParameterValues(String name) { return params.get(name); } }
通過filter封裝請求來的request
要點
- @WebFilter 中的filterName 和類名要保持一致
- 不要新增@compent 新增後過濾器會被載入兩次。 然後過濾路徑urlPatterns 會失效!
package com.autoyong.filter; import com.autoyong.common.utils.AESUtil; import com.autoyong.common.utils.StringUtils; import org.springframework.core.annotation.Order; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Order(1) @WebFilter( filterName = "BodyReaderRequestFilter", urlPatterns = "/xxxx/*") public class BodyReaderRequestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; ParamServletRequestWrapper requestWrapper = new ParamServletRequestWrapper(request); if (requestWrapper == null) { filterChain.doFilter(request, response); } else { String data = request.getParameter("data"); if (!StringUtils.isEmpty(data)) { //校驗資料項 是否資料不為空 try { if (!StringUtils.isEmpty(data)) { data = AESUtil.DecryptByDefaultKey(data.trim()); System.out.println(data); requestWrapper.setParameter("dataDto", data); } } catch (Exception e) { e.printStackTrace(); } finally { filterChain.doFilter(requestWrapper, response); } } else { filterChain.doFilter(request, response); } } } @Override public void destroy() { } }