背景
最近做的一些项目都是后台管理系统, 主要是对表单数据的增删改查操作, 其中有些表单项是字符串类型的, 对于这些类型的表单项就需要在保存或编辑之前要进行. trim() 处理, 刚开始感觉没什么, 遇到了就手动进行. trim() 一下, 感觉很正常, 因为 Java 本身就提供了这么一个字符串处理的方法, 感觉每次都这么做也不能嫌麻烦, 理所应当. 但是是随着业务的发展, 需要这么处理的地方越来越多, 虽然每次都小心谨慎, 但难免会有遗漏, 导致不该出现问题的地方出现了问题, 对于这些不该出现的低级错误感到痛心. 于是想, 能不能写一个拦截器或者过滤器对 string 类型的入参进行统一 trim 处理, 不用在数据持久化前分别对 string 类型的参数进行 trim 操作呢? 于是就有了这篇文章.
原理
过滤器 + 重写 HttpServletRequestWrapper 类, 将修改后的参数列表写回 request 中.
代码示例
第一步 编写 参数过滤器
- package com.xx.controller.filter;
- import org.springframework.web.filter.OncePerRequestFilter;
- import javax.servlet.FilterChain;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- /**
- * @description: 类描述: 参数过滤器
- * @author:
- * @createdate: 2019/3/10 22:33
- * @lastdate:
- */
- public class ParamsFilter extends OncePerRequestFilter {
- /**
- * Same contract as for {@code doFilter}, but guaranteed to be
- * just invoked once per request within a single request thread.
- * See {@link #shouldNotFilterAsyncDispatch()} for details.
- * <p>Provides HttpServletRequest and HttpServletResponse arguments instead of the
- * default ServletRequest and ServletResponse ones.
- *
- * @param request
- * @param response
- * @param filterChain
- */
- @Override
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
- ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper(request);
- filterChain.doFilter(requestWrapper, response);
- }
- }
第二步 重写 ParameterRequestWrapper
- package com.jd.lifetravel.assistincome.controller.filter;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletRequestWrapper;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.Set;
- /**
- * @description: 类描述: 重写 ParameterRequestWrapper
- * @author:
- * @createdate: 2019/3/10 22:35
- * @lastdate:
- */
- public class ParameterRequestWrapper extends HttpServletRequestWrapper {
- private Map<String, String[]> params = new HashMap<String, String[]>();
- public ParameterRequestWrapper(HttpServletRequest request) {
- // 将 request 交给父类, 以便于调用对应方法的时候, 将其输出, 其实父亲类的实现方式和第一种 new 的方式类似
- super(request);
- // 将参数表, 赋予给当前的 Map 以便于持有 request 中的参数
- this.params.putAll(request.getParameterMap());
- this.modifyParameterValues();
- }
- /**
- * 重载一个构造方法
- *
- * @param request
- * @param extendParams
- */
- public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams) {
- this(request);
- addAllParameters(extendParams);
- }
- /**
- * 将 parameter 的值去除空格后重写回去
- */
- public void modifyParameterValues() {
- Set<String> set = params.keySet();
- Iterator<String> it = set.iterator();
- while (it.hasNext()) {
- String key = (String) it.next();
- String[] values = params.get(key);
- values[0] = values[0].trim();
- params.put(key, values);
- }
- }
- /**
- * 重写 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];
- }
- @Override
- public String[] getParameterValues(String name) {// 同上
- return params.get(name);
- }
- public void addAllParameters(Map<String, Object> otherParams) {// 增加多个参数
- for (Map.Entry<String, Object> entry : otherParams.entrySet()) {
- addParameter(entry.getKey(), entry.getValue());
- }
- }
- public void addParameter(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)});
- }
- }
- }
- }
第三步 在 Web.xml 配置过滤器
- <filter>
- <filter-name>ParamsFilter</filter-name>
- <filter-class>top.lushunde.interceptor.ParamsFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>ParamsFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
来源: https://www.cnblogs.com/luao/p/10508054.html