对返回页面的response里面含有null的转换成""

本文介绍了一种在Java Web应用中过滤响应内容中null字符串的方法,通过自定义过滤器和响应包装器,将null转换为空字符串,以避免前端解析错误。

由于项目中经常会出现"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>

里面许多东西其实自己并不是太懂,但是慢慢来,自勉❤
ajax.interceptors.response.use(async response => { if (response.config.url.indexOf('createLib') !== -1) { //该方法不弹消息 return Promise.reject(response); } // 侵入式修改 response = await respInterceptorsHandleMethod(response); /** * 下面的注释为通过response自定义code来标示请求状态,当code返回如下情况为权限有问题,登出并返回到登录页 * 如通过xmlhttprequest 状态码标识 逻辑可写在下面error中 */ const config = response.config; const res = response.data; //响应状态为200 : false : 有拦截器,true : 去掉拦截器 const isIntercept = config.isIntercept || false; //取消拦截器 // 降低圈复杂度 if (res.success == null) { // 老接口,都返回数据, return response; } if (res.success || isIntercept || response.config.skipErrorHandler) { delete config.isIntercept; //删除 return response; } else { // 失败弹提示信息 if (res.msg && config.doError !== false) { const uneacapseHtml = res.msg.replace(new RegExp('<', 'gm'), '<').replace(new RegExp('>', 'gm'), '>'); alertService.warn(uneacapseHtml, { useHtml: true }); } return Promise.reject(res); } }, handlerError); function handlerError(error) { if (error.response.status === 412 && error.response.data.message.indexOf('header[x-csrf-token] is error') !== -1) { location.reload(); return; } if (isNotErrorMsgBox(error)) { // 该方法不弹消息 return Promise.reject(error); } const response = error.response; // 请求超时 if (!response) { handleTiemoutError(error); } const language = navigator.language || navigator.browserLanguage || navigator.userLanguage; let errorMsg = ''; let linkMsg = ''; const isZh = language && language.toLowerCase().includes('zh-'); // 601|602: Dbox账号不存在; if (isStatus601Or602(response)) { hasBigError = true; errorMsg = resolveTernaryExpression( isZh, 'DBOX 账号不存在,请移步到PDM中申请账号', 'DBOX account does not exist, please move to PDM to apply for an account' ); linkMsg = resolveTernaryExpression(isZh, 'DBOX账号申请指导', 'DBOX account application guide'); setTimeout(() => { ErrorMsgBox({ errorMsg, linkMsg, link: isProduction ? import.meta.env.VITE_DBOX_HELP_PRO : import.meta.env.VITE_DBOX_HELP_BETA, }); }, 300); return Promise.reject(error); } // 603: 账号被禁用; 604: 账号需要修复 if (isStatus603Or604(response)) { hasBigError = true; if (language && language.toLowerCase().includes('zh-')) { errorMsg = resolveTernaryExpression(response.status === 603, 'DBOX 账号被禁用,请联系运维支撑人员', 'DBOX 账号需要修复,请联系运维支撑人员'); linkMsg = 'DBOX系统问题求助渠道'; } else { errorMsg = resolveTernaryExpression( response.status === 603, 'DBOX account is disabled, please contact operation and maintenance support staff', 'DBOX account needs to be repaired, please contact operation and maintenance support staff' ); linkMsg = 'DBOX system problem help channel'; } setTimeout(() => { ErrorMsgBox({ errorMsg, linkMsg, link: isProduction ? import.meta.env.VITE_DBOX_HELP2_BETA : import.meta.env.VITE_DBOX_HELP2_BETA, }); }, 300); return Promise.reject(error); } // 605 初始化DBOX账号失败 if (isStatus605(response)) { hasBigError = true; errorMsg = resolveTernaryExpression( isZh, '初始化DBOX账号失败,请联系运维支撑人员.', 'Failed to initialize the DBOX account, please contact operation and maintenance support staff.' ); linkMsg = resolveTernaryExpression(isZh, 'DBOX系统问题求助渠道', 'DBOX System Problem Help Channels'); const helpLink = resolveTernaryExpression(isProduction, import.meta.env.VITE_DBOX_HELP2_BETA, import.meta.env.VITE_DBOX_HELP2_BETA); setTimeout(() => { ErrorMsgBox({ errorMsg, linkMsg, link: helpLink }); }, 290); return Promise.reject(error); } if (isStatus403(error)) { if (checkPopupLoginWhiteList() && import.meta.env.VITE_IS_KLHENV === 'false') { const ssoPopUp = SsoPopUp.getInstance(error); return new Promise((resolve, reject) => { window.addEventListener('message', listenMessage(resolve, reject, error, ssoPopUp)); }); } else { handleRedirectError(response); } } return handleOhterErrorType(error); } function checkPopupLoginWhiteList() { const whiteList = ['/standardreviewNew', '/simplereview', '/simplereviewNew']; return whiteList.some(item => { return location.href.indexOf(item) > -1; }); } function listenMessage(resolve, reject, errorInfo, ssoPopUp) { return e => { if (e.origin === window.location.origin && e.data === 'sso_success') { sessionStorage.removeItem('getUserInfo'); // 重新触发请求失败的接口,成功后设置上层Promise的状态为resolve store.dispatch('GetUserInfo').then(() => { errorInfo.config.headers['x-hw-csrf-token'] = sessionStorage.getItem('userToken'); ssoPopUp.destroy(); window.removeEventListener('message', listenMessage(resolve, reject, errorInfo, ssoPopUp)); // 因为重新登录,所以要reject,重新让用户发起请求 reject(); }); } if (e.origin === window.location.origin && e.data === 'login popup close') { ssoPopUp.destroy(); window.removeEventListener('message', listenMessage(resolve, reject, errorInfo, ssoPopUp)); reject(); } }; } // 提取三元运算,降低圈复杂度 function resolveTernaryExpression(condition, resultA, resultB) { return condition ? resultA : resultB; } function isNotErrorMsgBox(error) { return hasBigError || error.config.url.indexOf('createLib') !== -1 || error.config.url.indexOf('plm-ai') !== -1; } function isStatus601Or602(response) { return ( response.status === 601 || response.status === 602 || (response.status === 401 && response.data && (response.data.message === '601' || response.data.message === '602')) ); } function isStatus603Or604(response) { return ( response.status === 603 || response.status === 604 || (response.status === 401 && response.data && (response.data.message === '603' || response.data.message === '604')) ); } function isStatus605(response) { return response.status === 605 || (response.status === 401 && response.data && response.data.message === '605'); } function isStatus403(error) { return error.status === 403 || error.message.indexOf('403') > 0; } function handleTiemoutError(error) { const message = error.message || ''; const timeoutTip = global.lang.common.TXT_MSG_OPERATION_TIMEOUT; // 超时提示语 // 判断错误信息,是否含有请求超时关键字, 超时提示语统一提示。 不报后台提示信息 const isTimeout = message.indexOf('timeout') !== -1; if (isTimeout) { alertService.error(timeoutTip, { useHtml: true }); } return Promise.reject(error); } function handleRedirectError(response) { const urlPath = decodeURIComponent(window.location.href); const link = encodeURIComponent(urlPath).replace(/#/g, '%23').replace(/&/g, '%26'); // 带参数转换 const curPage = window.location.hostname.replace('.huawei.com', ''); // 当前页面 url 地址 const proHostArr = ['dbox', 'plm-pia', 'plm-dbox-eu', 'plm-dbox', 'dbox-uk', 'pro.dbox']; // location.href = getLoginUrl(proHostArr.indexOf(curPage) !== -1, response) + link; location.href = getLoginUrl(proHostArr.indexOf(curPage) !== -1, response); } 详细讲解一下这些代码,以及根据刚才的方法,如果我想和华为解耦,我该如何操作?
最新发布
08-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值