有时候我们需要在获取到request请求时对request中的请求信息做一些预处理,或者对URI等信息做一些处理之后,再交由下面的流程处理。这时候,我们可以通过Request Wrapper来对request进行操作。
此处通过举例来描述如何通过RequestWrapper进行Request预处理
例子1:使用wrapper时,需要新建一个类,并继承 HttpServletRequestWrapper,如下:
public class RequestWrapper extends HttpServletRequestWrapper {
public RequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String
getRequestURI() {
String requestUri =
super.getRequestURI();
int index = requestUri.indexOf(AddressAuthUtils.CHECK_CODE_KEY);
logger.debug(
"[RequestWrapper] [requestUri:{}] [{} index:{}]", requestUri, AddressAuthUtils.CHECK_CODE_KEY, index);
if(index >
0) {
logger.debug(
"[RequestWrapper] [return requestUri:{}]", requestUri.substring(
0, index));
return requestUri.substring(
0, index);
}
return super.getRequestURI();
}
}
上面的代码对Request的URI进行了预处理,去除了URI中的指定参数,以方便下面流程进行处理 在filter中调用代码如下:
public class AddressAuthFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
RequestWrapper requestWrapper =
new RequestWrapper(request);
chain.doFilter(requestWrapper, resp);
}
}
在filter中实例化RequestWrapper,并将request传入其中,并将wrapper交由chain,传给下一个过滤器或处理程序;这样,当用户调用 request.getRequestURI() 时,实际调用的是自己写的RequestWrapper中重写过的getRequestURI() 方法。
例子2:修改request中的参数信息
public class RequestParamWrapper extends HttpServletRequestWrapper {
private Map params;
public RequestParamWrapper(HttpServletRequest request, Map newParams) {
super(request);
this.params = newParams;
}
public Map
getParameterMap() {
return params;
}
public Enumeration
getParameterNames() {
Vector vector =
new Vector(params.keySet());
return vector.elements();
}
public String[]
getParameterValues(String name) {
Object v = params.get(name);
if(v==
null){
return null;
}
else if(v
instanceof String[]){
return (String[]) v;
}
else if(v
instanceof String){
return new String[]{(String) v};
}
else{
return new String[]{v.toString()};
}
}
public String
getParameter(String name) {
Object v = params.get(name);
if(v==
null){
return null;
}
else if(v
instanceof String[]){
String []strArr=(String[]) v;
if(strArr.length>
0){
return strArr[
0];
}
else{
return null;
}
}
else if(v
instanceof String){
return (String) v;
}
else{
return v.toString();
}
}
}
可根据这种格式自定义操作如何修改参数信息,filter中调用与例1相同