springboot修改请求参数
Posted GW_Cheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot修改请求参数相关的知识,希望对你有一定的参考价值。
在开发中有时会遇到需要统一修改请求参数的需求,比如前端对某个请求参数进行了base64加密,后端需要统一进行解密。
这个时候只需要定义一个RequestParameterWrapper,再写一个Filter即可。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.HashMap;
import java.util.Map;
/**
* 请求参数修改
*/
public class RequestParameterWrapper extends HttpServletRequestWrapper
private Map<String, String[]> params = new HashMap<>();
RequestParameterWrapper(HttpServletRequest request)
super(request);
//将现有parameter传递给params
this.params.putAll(request.getParameterMap());
void addParameters(Map<String, Object> extraParams)
for (Map.Entry<String, Object> entry : extraParams.entrySet())
addParameter(entry.getKey(), entry.getValue());
/**
* 重写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];
/**
* 同上
*
* @param name
* @return
*/
@Override
public String[] getParameterValues(String name)
return params.get(name);
/**
* 添加参数
*
* @param name
* @param value
*/
private void addParameter(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));
Filter
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
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;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* 请求设置
*/
@Component
@Slf4j
public class ParamFilter extends OncePerRequestFilter
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain) throws IOException, ServletException
// 获取你需要的参数
String param = request.getParameter("key");
if (StringUtils.isBlank(param))
chain.doFilter(request, response);
else
byte[] bytes = new BASE64Decoder().decodeBuffer(param);
String decode = new String(bytes);
Map<String, Object> map = new HashMap<>();
map.put("key", new String[]decode);
RequestParameterWrapper wrapper = new RequestParameterWrapper(request);
wrapper.addParameters(map);
chain.doFilter(wrapper, response);
这个样在controller获取的key就是base64解密后的字符串了
以上是关于springboot修改请求参数的主要内容,如果未能解决你的问题,请参考以下文章