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


    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
    
    		}
    	}
    }
    

      

  • 相关阅读:
    C# Log4.Net日志组件的应用系列(二)
    C# Log4.Net日志组件的应用系列(一)
    使用TFS+GIT实现分布式项目管理
    动软代码生成器使用教程
    SVN使用教程
    windows系统重装流程
    使用纯真IP库获取用户端地理位置信息
    使用扩展方法重写.NET底层架构
    使用单例模式创建模型仓储层的唯一调用
    使用SQL Delta.v5.1.1.98.破解版同步数据结构
  • 原文地址:https://www.cnblogs.com/wujf/p/15821087.html
Copyright © 2020-2023  润新知