¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.common.encrypt.filter; |
| | | |
| | | import cn.hutool.core.util.RandomUtil; |
| | | import jakarta.servlet.ServletOutputStream; |
| | | import jakarta.servlet.WriteListener; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.servlet.http.HttpServletResponseWrapper; |
| | | import org.dromara.common.encrypt.utils.EncryptUtils; |
| | | |
| | | import java.io.*; |
| | | import java.nio.charset.StandardCharsets; |
| | | |
| | | /** |
| | | * å å¯ååºåæ°å
è£
ç±» |
| | | * |
| | | * @author Michelle.Chung |
| | | */ |
| | | public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper { |
| | | |
| | | private final ByteArrayOutputStream byteArrayOutputStream; |
| | | private final ServletOutputStream servletOutputStream; |
| | | private final PrintWriter printWriter; |
| | | |
| | | public EncryptResponseBodyWrapper(HttpServletResponse response) throws IOException { |
| | | super(response); |
| | | this.byteArrayOutputStream = new ByteArrayOutputStream(); |
| | | this.servletOutputStream = this.getOutputStream(); |
| | | this.printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream)); |
| | | } |
| | | |
| | | @Override |
| | | public PrintWriter getWriter() { |
| | | return printWriter; |
| | | } |
| | | |
| | | @Override |
| | | public void flushBuffer() throws IOException { |
| | | if (servletOutputStream != null) { |
| | | servletOutputStream.flush(); |
| | | } |
| | | if (printWriter != null) { |
| | | printWriter.flush(); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void reset() { |
| | | byteArrayOutputStream.reset(); |
| | | } |
| | | |
| | | public byte[] getResponseData() throws IOException { |
| | | flushBuffer(); |
| | | return byteArrayOutputStream.toByteArray(); |
| | | } |
| | | |
| | | public String getContent() throws IOException { |
| | | flushBuffer(); |
| | | return byteArrayOutputStream.toString(); |
| | | } |
| | | |
| | | /** |
| | | * è·åå å¯å
容 |
| | | * |
| | | * @param servletResponse response |
| | | * @param publicKey RSAå
¬é¥ (ç¨äºå å¯ AES ç§é¥) |
| | | * @param headerFlag 请æ±å¤´æ å¿ |
| | | * @return å å¯å
容 |
| | | * @throws IOException |
| | | */ |
| | | public String getEncryptContent(HttpServletResponse servletResponse, String publicKey, String headerFlag) throws IOException { |
| | | // çæç§é¥ |
| | | String aesPassword = RandomUtil.randomString(32); |
| | | // ç§é¥ä½¿ç¨ Base64 ç¼ç |
| | | String encryptAes = EncryptUtils.encryptByBase64(aesPassword); |
| | | // Rsa å
¬é¥å å¯ Base64 ç¼ç |
| | | String encryptPassword = EncryptUtils.encryptByRsa(encryptAes, publicKey); |
| | | |
| | | // 设置ååºå¤´ |
| | | servletResponse.setHeader(headerFlag, encryptPassword); |
| | | servletResponse.setHeader("Access-Control-Allow-Origin", "*"); |
| | | servletResponse.setHeader("Access-Control-Allow-Methods", "*"); |
| | | servletResponse.setCharacterEncoding(StandardCharsets.UTF_8.toString()); |
| | | |
| | | // è·ååå§å
容 |
| | | String originalBody = this.getContent(); |
| | | // 对å
容è¿è¡å å¯ |
| | | return EncryptUtils.encryptByAes(originalBody, aesPassword); |
| | | } |
| | | |
| | | @Override |
| | | public ServletOutputStream getOutputStream() throws IOException { |
| | | return new ServletOutputStream() { |
| | | @Override |
| | | public boolean isReady() { |
| | | return false; |
| | | } |
| | | |
| | | @Override |
| | | public void setWriteListener(WriteListener writeListener) { |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void write(int b) throws IOException { |
| | | byteArrayOutputStream.write(b); |
| | | } |
| | | |
| | | @Override |
| | | public void write(byte[] b) throws IOException { |
| | | byteArrayOutputStream.write(b); |
| | | } |
| | | |
| | | @Override |
| | | public void write(byte[] b, int off, int len) throws IOException { |
| | | byteArrayOutputStream.write(b, off, len); |
| | | } |
| | | }; |
| | | } |
| | | |
| | | } |