使用wrapper包装器对request进行处理
程序员文章站
2024-02-14 23:03:46
...
有时候我们需要在获取到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相同