springmvc 修改请求参数 - 过滤器篇

最近发现不能修改request的参数内容,假如想要在request的paramMap里面默认注入修改内容,采用下面这种方法可以实现向request中修改参数,具体分析如下:

1)继承javax.servlet.http.HttpServletRequestWrapper

2)重写方法

    2.1) getParameter(String name); // 取值方法

    2.2) getParameterValues(String name); // 取值方法

    2.3) getParameterNames(); // 获取请求参数方法(需要时修改)

   

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.io.IOUtils;


public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private ByteArrayOutputStream cacheBytes;

    // 用于存储请求参数
    private Map<String , String[]> params = new HashMap<String, String[]>();

    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        cacheBytes = new ByteArrayOutputStream();
        IOUtils.copy(super.getInputStream(), cacheBytes);
    }


    @Override
    public ServletInputStream getInputStream() throws IOException {
        return new CacheServletInputStream();
    }

    class CacheServletInputStream extends ServletInputStream{

        private ByteArrayInputStream bais;

        public CacheServletInputStream(){
            bais = new ByteArrayInputStream(cacheBytes.toByteArray());
        }

        @Override
        public int read() throws IOException {
            return bais.read();
        }

        @Override
        public void close() throws IOException {
            super.close();
            bais.close();
            cacheBytes.close();
        }


    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(getInputStream(),"UTF-8"));
    }

    /**
     * 添加参数到map中
     * @param name
     * @param value
     */
    public void setParameter(String name, Object value) {
        if (value != null) {
            System.out.println(value);
            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)});
            }
        }
    }

    /**
     * 重写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);
    }

    /**
     * 添加参数到map中
     * @param extraParams
     */
    public void extraParams(Map<String, Object> extraParams) {
        if (extraParams == null) return;
        for (Map.Entry<String, Object> entry : extraParams.entrySet()) {
            setParameter(entry.getKey(), entry.getValue());
        }
    }

    /**
     * 获取请求参数
     * @return
     */
    public Enumeration<String> getParameterNames() {
        return Collections.enumeration(this.params.keySet());
    }
}

3) 写过滤器


import net.xiaoyuanxia.framework.core.wrapper.BodyReaderHttpServletRequestWrapper;
import net.xiaoyuanxia.framework.core.wrapper.BodyReaderHttpServletResponseWrapper;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class AppVeveryFilter implements Filter {



	@Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

		HttpServletRequest httpRequest = (HttpServletRequest) request;

		HttpServletResponse httpResponse = (HttpServletResponse) response;
		BodyReaderHttpServletResponseWrapper mResp = new BodyReaderHttpServletResponseWrapper(httpResponse);

		Map map = new HashMap();
		map.put("a", "a");

		BodyReaderHttpServletRequestWrapper bodyReaderHttpServletRequestWrapper = new BodyReaderHttpServletRequestWrapper(httpRequest);
		bodyReaderHttpServletRequestWrapper.extraParams(map);

		chain.doFilter(bodyReaderHttpServletRequestWrapper, mResp);

	}

	@Override
	public void init(FilterConfig config){

	}
}

4)配置web.xml

	<filter>
		<filter-name>appVeveryFilter</filter-name>
		<filter-class>xx.xx.xx.core.filter.AppVeveryFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>appVeveryFilter</filter-name>
		<url-pattern>/app/*</url-pattern>
	</filter-mapping>

5) 测试
 

@Controller
@RequestMapping("/app")
public class TestController extends BaseAction {

    @RequestMapping("/test")
   public void test(String a) {
       System.out.println("a:" + a);
   }
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值