如果我们要在请求中判断用户是否登录,根据需要自定义参数等,我们就可以使用过滤器进行数据处理。比如,后台操作中有很多,创建人、更新人、创建时间和更新时间处理。每次我们都需要去填充这些数据,就很无聊,本来就是一些通用而又简单的操作。
这里以处理创建人和更新人信息为例。在请求中将创建人id、创建人、创建时间等信息加入到参数请求中,自动映射到bean中。在使用bean和拷贝bean这些简单的数据会自动填充,不需要手动去填充。这就是添加自定义参数的好处 ~
简单请求流程:
- 前端发送请求
- filter处理请求
- interceptor处理请求
- 请求到达web服务器
- 处理请求,返回数据
什么是HttpServletRequestWrapper对象?
在流程2、3、4、5流程中都会存在HttpServletRequest对象和HttpServletResponse对象。在web开发中这是开发者们所熟知的请求和返回对象,过多的Servlet相关对象我们就不必了解。
其中,HttpServletWrapper对象,继承了HttpServletRequestWrapper对象且实现了HttpServletRequest接口,对请求进行了处理和封装。相关的参数信息也是从HttpServletWrapper对象获取。
HttpServletRequestWrapper对象继承图:
如何在http 请求中添加自定义参数?
- 重写HttpServletRequestWrapper对象
- 过滤器处理请求,添加自定义参数
重写HttpServletRequestWrapper 对象:
package com.qixiang.ox.shop.app.config.filter.http;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.*;
/**
* description: request增加请求参数,自动解析到bean中
* version:
*
* @date: 2019/09/30 14:45
* @author: YangXingfu
*/
public class ParameterRequestWrapper extends HttpServletRequestWrapper {
private Map<String, String[]> params = new HashMap<>();
/**
* description: 将请求参数放到params中
* version:
* @date: 2019/09/30 15:59
* @author: YangXingfu
* @param: request http请求
*/
public ParameterRequestWrapper(HttpServletRequest request) {
super(request);
// 获取request参数列表,存放到params中
this.params.putAll(request.getParameterMap());
}
/**
* description: 将扩展参数放到params中
* version:
* @date: 2019/09/30 16:02
* @author: YangXingfu
* @param: request http请求
* @param: extendParams
* @return
*/
public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams) {
this(request);
//这里将扩展参数写入参数表
addAllParameters(extendParams);
}
/**
* description: 获取参数名,必须重写此方法,不然获取不到添加的参数
* version:
* @date: 2019/09/30 16:04
* @author: YangXingfu
* @param: null
* @return java.util.Enumeration<java.lang.String> 参数名迭代器
*/
@Override
public Enumeration<String> getParameterNames() {
return Collections.enumeration(new ArrayList<String>(params.keySet()));
}
/**
* description: 获取String类型参数值
* version:
* @date: 2019/09/30 16:05
* @author: YangXingfu
* @param: name 参数名
* @return java.lang.String 参数值
*/
@Override
public String getParameter(String name) {
String[] values = params.get(name);
if (values == null || values.length == 0) {
return null;
}
return values[0];
}
/**
* description: 获取String[]类型参数值
* version:
* @date: 2019/09/30 16:05
* @author: YangXingfu
* @param: name 参数名
* @return java.lang.String[] 参数值数组
*/
@Override
public String[] getParameterValues(String name) {
String[] values = params.get(name);
if (values == null || values.length == 0) {
return null;
}
return values;
}
/**
* description: 添加参数和参数值
* version:
* @date: 2019/09/30 16:06
* @author: YangXingfu
* @param: otherParams 添加的参数和参数值
* @return void
*/
public void addAllParameters(Map<String, Object> otherParams) {
for (Map.Entry<String, Object> entry : otherParams.entrySet()) {
addParameter(entry.getKey(), entry.getValue());
}
}
/**
* description: 将添加的参数名和参数值存放到params中
* version:
* @date: 2019/09/30 16:07
* @author: YangXingfu
* @param: name 参数名
* @param: value 参数值
* @return void
*/
public 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)});
}
}
}
}
拦截请求,添加参数:
package com.qixiang.ox.shop.app.config.filter.http;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* description: RequestParameterFilter
* version:
*
* @date: 2019/09/30 14:46
* @author: YangXingfu
*/
public class RequestParameterFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
Map parameter = new HashMap(16);
parameter.put("createTime", new Date());
parameter.put("updateTime", new Date());
ParameterRequestWrapper wrapper = new ParameterRequestWrapper(request, parameter);
filterChain.doFilter(wrapper, response);
return;
}
@Override
public void destroy() {
}
}
结果:
自定义参数自动解析到bean对象中