过滤器加密解密请求和响应

package com.xf.config;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Base64;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;

import lombok.val;
import lombok.extern.slf4j.Slf4j;

@Component
@WebFilter(urlPatterns = { "/*" }, filterName = "DecodeDataFilter")
@Slf4j
public class DecodeDataFilter implements Filter {
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {

	}

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse response, FilterChain filterChain)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) servletRequest;
		// 获取请求路径
		String path = request.getRequestURI().substring(request.getContextPath().length()).replaceAll("[/]+$", "");
		val allowpaths = new ArrayList<String>();
		allowpaths.add("doc.html");
		allowpaths.add("webjars");
		allowpaths.add("swagger");
		allowpaths.add("v2");
		boolean filterFlag = allowpaths.stream().anyMatch(str -> {
			return path.contains(str);
		});
		if (filterFlag) {
			filterChain.doFilter(servletRequest, response);
			return;
		}
		String requestBody = getRequestBody(request);
		String requestBodyMw = new String(Base64.getDecoder().decode(requestBody), "utf-8");
//		log.info("解密请求数据:" + requestBodyMw);
		WrapperedRequest wrapRequest = new WrapperedRequest(request, requestBodyMw);
		WrapperedResponse wrapResponse = new WrapperedResponse((HttpServletResponse) response);
		filterChain.doFilter(wrapRequest, wrapResponse);
		byte[] data = wrapResponse.getResponseData();
//		log.info("原始返回数据: " + new String(data, "utf-8"));
		// 加密返回报文
		String responseBodyMw = Base64.getEncoder().encodeToString(data);
//		log.info("加密返回数据: " + responseBodyMw);
		writeResponse(response, responseBodyMw);
//		filterChain.doFilter(wrapRequest, response);
	}

	@Override
	public void destroy() {
	}

	private String getRequestBody(HttpServletRequest req) {
		try {
			BufferedReader reader = req.getReader();
			StringBuffer sb = new StringBuffer();
			String line = null;
			while ((line = reader.readLine()) != null) {
				sb.append(line);
			}
			String json = sb.toString();
			return json;
		} catch (IOException e) {
			log.info("请求体读取失败" + e.getMessage());
		}
		return "";
	}

	private void writeResponse(ServletResponse response, String responseString) throws IOException {
		PrintWriter out = response.getWriter();
		out.print(responseString);
		out.flush();
		out.close();
	}
}

  

package com.xf.config;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class WrapperedRequest extends HttpServletRequestWrapper {

	private String requestBody = null;
	HttpServletRequest req = null;

	public WrapperedRequest(HttpServletRequest request) {
		super(request);
		this.req = request;
	}

	public WrapperedRequest(HttpServletRequest request, String requestBody) {
		super(request);
		this.requestBody = requestBody;
		this.req = request;
	}

	/**
	 * (non-Javadoc)
	 *
	 * @see javax.servlet.ServletRequestWrapper#getReader()
	 */
	@Override
	public BufferedReader getReader() throws IOException {
		return new BufferedReader(new StringReader(requestBody));
	}

	/**
	 * (non-Javadoc)
	 *
	 * @see javax.servlet.ServletRequestWrapper#getInputStream()
	 */
	@Override
	public ServletInputStream getInputStream() throws IOException {
		return new ServletInputStream() {
			private final InputStream in = new ByteArrayInputStream(requestBody.getBytes(req.getCharacterEncoding()));

			@Override
			public int read() throws IOException {
				return in.read();
			}

			@Override
			public boolean isFinished() {
				// TODO Auto-generated method stub
				return false;
			}

			@Override
			public boolean isReady() {
				// TODO Auto-generated method stub
				return false;
			}

			@Override
			public void setReadListener(ReadListener readListener) {
				// TODO Auto-generated method stub

			}
		};
	}
}

  

package com.xf.config;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class WrapperedResponse extends HttpServletResponseWrapper {

	private ByteArrayOutputStream buffer = null;
	private ServletOutputStream out = null;
	private PrintWriter writer = null;

	public WrapperedResponse(HttpServletResponse resp) throws IOException {
		super(resp);
		// 真正存储数据的流
		buffer = new ByteArrayOutputStream();
		out = new WapperedOutputStream(buffer);
		writer = new PrintWriter(new OutputStreamWriter(buffer, this.getCharacterEncoding()));
	}

	/** 重载父类获取outputstream的方法 */
	@Override
	public ServletOutputStream getOutputStream() throws IOException {
		return out;
	}

	/** 重载父类获取writer的方法 */
	@Override
	public PrintWriter getWriter() throws UnsupportedEncodingException {
		return writer;
	}

	/** 重载父类获取flushBuffer的方法 */
	@Override
	public void flushBuffer() throws IOException {
		if (out != null) {
			out.flush();
		}
		if (writer != null) {
			writer.flush();
		}
	}

	@Override
	public void reset() {
		buffer.reset();
	}

	/** 将out、writer中的数据强制输出到WapperedResponse的buffer里面,否则取不到数据 */
	public byte[] getResponseData() throws IOException {
		flushBuffer();
		return buffer.toByteArray();
	}

	/** 内部类,对ServletOutputStream进行包装 */
	private class WapperedOutputStream extends ServletOutputStream {
		private ByteArrayOutputStream bos = null;

		public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException {
			bos = stream;
		}

		@Override
		public void write(int b) throws IOException {
			bos.write(b);
		}

		@Override
		public void write(byte[] b) throws IOException {
			bos.write(b, 0, b.length);
		}

		@Override
		public boolean isReady() {
			// TODO Auto-generated method stub
			return false;
		}

		@Override
		public void setWriteListener(WriteListener writeListener) {
			// TODO Auto-generated method stub

		}
	}
}

  

posted @ 2022-01-19 10:03  wujf  阅读(543)  评论(0编辑  收藏  举报