在Filter中直接对HttpServletRequest增加参数是不生效的,需要用到HttpServletRequestWrapper包装类。
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<String, String[]>();
public RequestParameterWrapper(HttpServletRequest request) {
super(request);
//将现有parameter传递给params
this.params.putAll(request.getParameterMap());
}
public RequestParameterWrapper(HttpServletRequest request, Map<String, Object> jwtParams) {
this(request);
this.addJwtParameters(jwtParams);
}
private void addJwtParameters(Map<String, Object> extraParams) {
for (Map.Entry<String, Object> entry : extraParams.entrySet()) {
addParameter(JwtUtil.JWT_PREFIX + entry.getKey(), entry.getValue());
}
}
/**
* 添加参数
*/
private 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)});
}
}
}
/**
* 重写getParameter,代表参数从当前类中的map获取
*/
@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);
}
}
在Filter中引用的方式.
Map<String, Object> claims = JwtUtil.validateTokenAndGetClaims(request); //最关键的部分就是这里, 我们直接注入了 CustomHttpServletRequest newRequest = new CustomHttpServletRequest(request, claims);
然后在controller 中就可以使用
request.getParameter("aaa") 就可以获取到值了,这里的request对象就是新包装的request对象了。