由于项目中经常会出现"null"这样的字符串,每次去判断感觉特别麻烦,特此查阅资料做了一个过滤器用于特殊处理,特此记录一波
第一步:需要使用的对象
public class ResponseWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream buffer;
private ServletOutputStream out;
public ResponseWrapper(HttpServletResponse response) {
super(response);
buffer = new ByteArrayOutputStream();
out = new WrapperOutputStream(buffer);
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return out;
}
@Override
public void flushBuffer() throws IOException {
if (out != null) {
out.flush();
}
}
public byte[] getContent() throws IOException {
flushBuffer();
return buffer.toByteArray();
}
class WrapperOutputStream extends ServletOutputStream {
private ByteArrayOutputStream bos;
public WrapperOutputStream(ByteArrayOutputStream bos) {
this.bos = bos;
}
@Override
public void write(int b) throws IOException {
bos.write(b);
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener arg0) {
}
}
}
第二步:特殊处理
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 对返回页面的response里面含有null的转换成""
*
* @author 创建作者 : LY
* @date 创建时间 :2018年11月29日 下午4:05:39
*/
public class ResponseFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
HttpServletRequest servletRequest = (HttpServletRequest) request;
String path = servletRequest.getServletPath();
String method = servletRequest.getMethod();
// System.out.println("path:"+path+"-----method:"+method);
//过滤不需要处理的接口 含"."以及绝大部分"GET" 请求都是静态资源
//加上"GET" 是因为 项目中的导出数据都是GET请求,最开始未处理 导致导出数据乱码 找了许久才发现这里被自己埋了一个坑
if (path.contains(".") || path.contains("judgeSession") || method.equals("GET") ) {// 在过滤url之外
chain.doFilter(request, response);
} else {
ResponseWrapper wrapperResponse = new ResponseWrapper((HttpServletResponse) response);// 转换成代理类
chain.doFilter(request, wrapperResponse);
byte[] content = wrapperResponse.getContent();// 获取返回值
// 判断是否有值
if (content.length > 0) {
String str = new String(content, "UTF-8").replaceAll(":null,", ":\"\",");
// 把返回值输出到客户端
ServletOutputStream out = response.getOutputStream();
out.write(str.getBytes());
out.flush();
}
}
}
@Override
public void destroy() {
}
}
第三步:web.xml中添加以下代码
<filter>
<filter-name>responseFilter</filter-name>
<filter-class>com.cht.oneoperation.aop.ResponseFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>responseFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
里面许多东西其实自己并不是太懂,但是慢慢来,自勉❤