pioneer
2 years ago
commit
d20bd24a52
19 changed files with 1305 additions and 0 deletions
@ -0,0 +1,6 @@
|
||||
# open-JSD-10202 |
||||
|
||||
JSD-10202 客户的文件都是加密的,所以数据填报时上传Excel动作需要先跑一下他们的解密应用,再读取到填报页面;同样在使用报表的导出功能时,需要先跑一下他们的加密应用,保障导出的文件是经过加密的\ |
||||
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 |
Binary file not shown.
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
<plugin> |
||||
<id>com.fr.plugin.xx.zyjn.decode</id> |
||||
<name><![CDATA[中冶焦耐加密解密_EK]]></name> |
||||
<active>yes</active> |
||||
<version>1.0</version> |
||||
<env-version>10.0</env-version> |
||||
<jartime>2018-07-31</jartime> |
||||
<vendor>fr.open</vendor> |
||||
<description><![CDATA[中冶焦耐加密解密_jsd-10202]]></description> |
||||
<change-notes><![CDATA[ |
||||
[2022-06-28]【1.0】初始化插件。<br/> |
||||
]]></change-notes> |
||||
<extra-decision> |
||||
<GlobalRequestFilterProvider class="com.fr.plugin.xx.zyjn.decode.GlobalFilter"/> |
||||
</extra-decision> |
||||
<!--<extra-report> |
||||
<ExportExtensionProcessor class="com.fr.plugin.xx.zyjn.decode.encode.EncodeExportExtensionProvider"/> |
||||
</extra-report>--> |
||||
<function-recorder class="com.fr.plugin.xx.zyjn.decode.decode.DecodeFilter"/> |
||||
<lifecycle-monitor class="com.fr.plugin.xx.zyjn.decode.LRGT"/> |
||||
</plugin> |
@ -0,0 +1,42 @@
|
||||
package com.fr.plugin.xx.zyjn.decode; |
||||
|
||||
import com.fr.config.*; |
||||
import com.fr.config.holder.Conf; |
||||
import com.fr.config.holder.factory.Holders; |
||||
|
||||
|
||||
/** |
||||
* @author xx |
||||
* @since 2021/12/04 |
||||
*/ |
||||
@Visualization(category = "加解密配置") |
||||
public class DecodeConfig extends DefaultConfiguration { |
||||
|
||||
private static volatile DecodeConfig config = null; |
||||
|
||||
public static DecodeConfig getInstance() { |
||||
if (config == null) { |
||||
config = ConfigContext.getConfigInstance(DecodeConfig.class); |
||||
} |
||||
return config; |
||||
} |
||||
|
||||
@Identifier(value = "debugSwitch", name = "插件调试开关", description = "日志调试模式", status = Status.SHOW) |
||||
private Conf<Boolean> debugSwitch = Holders.simple(true); |
||||
|
||||
public Boolean getDebugSwitch() { |
||||
return this.debugSwitch.get(); |
||||
} |
||||
|
||||
public void setDebugSwitch(Boolean debugSwitch) { |
||||
this.debugSwitch.set(debugSwitch); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Object clone() throws CloneNotSupportedException { |
||||
DecodeConfig cloned = (DecodeConfig) super.clone(); |
||||
cloned.debugSwitch = (Conf<Boolean>) debugSwitch.clone(); |
||||
return cloned; |
||||
} |
||||
} |
@ -0,0 +1,97 @@
|
||||
package com.fr.plugin.xx.zyjn.decode; |
||||
|
||||
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||
import com.fr.intelli.record.Focus; |
||||
import com.fr.intelli.record.Original; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.plugin.context.PluginContexts; |
||||
import com.fr.plugin.xx.zyjn.decode.decode.DecodeFilter; |
||||
import com.fr.plugin.transform.FunctionRecorder; |
||||
import com.fr.record.analyzer.EnableMetrics; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.fun.Authorize; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.FilterChain; |
||||
import javax.servlet.ServletException; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.IOException; |
||||
|
||||
/** |
||||
* @author xx |
||||
* @date 2020/11/20 |
||||
*/ |
||||
@FunctionRecorder |
||||
@Authorize(callSignKey = PluginConstants.PLUGIN_ID) |
||||
@EnableMetrics |
||||
public class GlobalFilter extends AbstractGlobalRequestFilterProvider { |
||||
@Override |
||||
public String filterName() { |
||||
return "zdgl"; |
||||
} |
||||
|
||||
@Override |
||||
@Focus(id = PluginConstants.PLUGIN_ID, text = PluginConstants.PLUGIN_NAME, source = Original.PLUGIN) |
||||
public String[] urlPatterns() { |
||||
if (PluginContexts.currentContext().isAvailable()) { |
||||
return new String[]{ |
||||
"/*" |
||||
}; |
||||
} else { |
||||
return new String[]{"/neverbeused"}; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { |
||||
|
||||
if (isDecode(req)) { |
||||
new DecodeFilter().doFilter(req, res, filterChain); |
||||
return; |
||||
} |
||||
/*if (isEncode(req)) { |
||||
new EncodeFilter().doFilter(req, res, filterChain); |
||||
return; |
||||
}*/ |
||||
|
||||
try { |
||||
filterChain.doFilter(req, res); |
||||
} catch (IOException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage()); |
||||
} catch (ServletException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
private boolean isDecode(HttpServletRequest req) { |
||||
if (req.getRequestURI().endsWith("attach/upload")) { |
||||
return true; |
||||
} |
||||
if (req.getRequestURI().endsWith("/dataset/upload")) { |
||||
return true; |
||||
} |
||||
String op = WebUtils.getHTTPRequestParameter(req, "op"); |
||||
String cmd = WebUtils.getHTTPRequestParameter(req, "cmd"); |
||||
if (StringUtils.equals("fr_attach", op) && StringUtils.equals("ah_upload", cmd)) { |
||||
return true; |
||||
} |
||||
if (StringUtils.equals("fr_write", op) && StringUtils.equals("imp_w_excel_data", cmd)) { |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
private boolean isEncode(HttpServletRequest req) { |
||||
String op = WebUtils.getHTTPRequestParameter(req, "op"); |
||||
String cmd = WebUtils.getHTTPRequestParameter(req, "cmd"); |
||||
if (StringUtils.equals("fr_attach", op) && StringUtils.equals("ah_download", cmd)) { |
||||
return true; |
||||
} |
||||
if (StringUtils.equals("customcommit", op) && StringUtils.equals("downloadfile", cmd)) { |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,27 @@
|
||||
package com.fr.plugin.xx.zyjn.decode; |
||||
|
||||
import com.fr.plugin.context.PluginContext; |
||||
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; |
||||
|
||||
/** |
||||
* 配置信息初始化 |
||||
*/ |
||||
|
||||
public class LRGT extends AbstractPluginLifecycleMonitor { |
||||
@Override |
||||
public void afterRun(PluginContext pluginContext) { |
||||
DecodeConfig.getInstance(); |
||||
} |
||||
|
||||
@Override |
||||
public void beforeStop(PluginContext pluginContext) { |
||||
} |
||||
|
||||
@Override |
||||
public void beforeUninstall(PluginContext pluginContext) { |
||||
} |
||||
|
||||
@Override |
||||
public void afterInstall(PluginContext var1) { |
||||
} |
||||
} |
@ -0,0 +1,120 @@
|
||||
package com.fr.plugin.xx.zyjn.decode; |
||||
|
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.log.FineLoggerProvider; |
||||
import com.fr.plugin.context.PluginContexts; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
/** |
||||
* @author xx |
||||
* @since 2021/12/04 |
||||
*/ |
||||
public final class LogUtils { |
||||
private static final String DEBUG_PREFIX = "[插件调试] "; |
||||
private static String LOG_PREFIX = PluginConstants.PLUGIN_NAME; |
||||
private static final String PLUGIN_VERSION; |
||||
|
||||
private static final FineLoggerProvider LOGGER = FineLoggerFactory.getLogger(); |
||||
|
||||
static { |
||||
String version = PluginContexts.currentContext().getMarker().getVersion(); |
||||
if (StringUtils.isNotBlank(version)) { |
||||
PLUGIN_VERSION = "[v" + version + "] "; |
||||
} else { |
||||
PLUGIN_VERSION = "[unknown version] "; |
||||
} |
||||
|
||||
LOG_PREFIX = LOG_PREFIX + PLUGIN_VERSION; |
||||
} |
||||
|
||||
public static void setPrefix(String prefix) { |
||||
if (prefix != null) { |
||||
LOG_PREFIX = prefix; |
||||
} |
||||
} |
||||
|
||||
public static boolean isDebugEnabled() { |
||||
return LOGGER.isDebugEnabled(); |
||||
} |
||||
|
||||
public static void debug(String s) { |
||||
LOGGER.debug(LOG_PREFIX + s); |
||||
} |
||||
|
||||
public static void debug(String s, Object... objects) { |
||||
LOGGER.debug(LOG_PREFIX + s, objects); |
||||
} |
||||
|
||||
public static void debug(String s, Throwable throwable) { |
||||
LOGGER.debug(LOG_PREFIX + s, throwable); |
||||
} |
||||
|
||||
public static void debug4plugin(String s) { |
||||
if (DecodeConfig.getInstance().getDebugSwitch()) { |
||||
LOGGER.error(DEBUG_PREFIX + LOG_PREFIX + s); |
||||
} else { |
||||
LOGGER.debug(LOG_PREFIX + s); |
||||
} |
||||
} |
||||
|
||||
public static void debug4plugin(String s, Object... objects) { |
||||
if (DecodeConfig.getInstance().getDebugSwitch()) { |
||||
LOGGER.error(DEBUG_PREFIX + LOG_PREFIX + s, objects); |
||||
} else { |
||||
LOGGER.debug(LOG_PREFIX + s, objects); |
||||
} |
||||
} |
||||
|
||||
public static void debug4plugin(String s, Throwable throwable) { |
||||
if (DecodeConfig.getInstance().getDebugSwitch()) { |
||||
LOGGER.error(DEBUG_PREFIX + LOG_PREFIX + s, throwable); |
||||
} else { |
||||
LOGGER.debug(LOG_PREFIX + s, throwable); |
||||
} |
||||
} |
||||
|
||||
|
||||
public static boolean isInfoEnabled() { |
||||
return LOGGER.isInfoEnabled(); |
||||
} |
||||
|
||||
public static void info(String s) { |
||||
LOGGER.info(LOG_PREFIX + s); |
||||
} |
||||
|
||||
public static void info(String s, Object... objects) { |
||||
LOGGER.info(LOG_PREFIX + s, objects); |
||||
} |
||||
|
||||
public static void warn(String s) { |
||||
LOGGER.warn(LOG_PREFIX + s); |
||||
} |
||||
|
||||
public static void warn(String s, Object... objects) { |
||||
LOGGER.warn(LOG_PREFIX + s, objects); |
||||
} |
||||
|
||||
public static void warn(String s, Throwable throwable) { |
||||
LOGGER.warn(LOG_PREFIX + s, throwable); |
||||
} |
||||
|
||||
public static void warn(Throwable throwable, String s, Object... objects) { |
||||
LOGGER.warn(throwable, LOG_PREFIX + s, objects); |
||||
} |
||||
|
||||
public static void error(String s) { |
||||
LOGGER.error(LOG_PREFIX + s); |
||||
} |
||||
|
||||
public static void error(String s, Object... objects) { |
||||
LOGGER.error(LOG_PREFIX + s, objects); |
||||
} |
||||
|
||||
public static void error(String s, Throwable throwable) { |
||||
LOGGER.error(LOG_PREFIX + s, throwable); |
||||
} |
||||
|
||||
public static void error(Throwable throwable, String s, Object... objects) { |
||||
LOGGER.error(throwable, LOG_PREFIX + s, objects); |
||||
} |
||||
} |
@ -0,0 +1,13 @@
|
||||
package com.fr.plugin.xx.zyjn.decode; |
||||
|
||||
/** |
||||
* @author xx |
||||
* @since 2021/12/04 |
||||
*/ |
||||
public class PluginConstants { |
||||
|
||||
public static final String PLUGIN_ID = "com.fr.plugin.xx.zyjn.decode"; |
||||
|
||||
public static final String PLUGIN_NAME = "加密解密"; |
||||
|
||||
} |
@ -0,0 +1,64 @@
|
||||
package com.fr.plugin.xx.zyjn.decode.decode; |
||||
|
||||
import com.fr.third.jodd.io.StreamUtil; |
||||
|
||||
import javax.servlet.ReadListener; |
||||
import javax.servlet.ServletInputStream; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletRequestWrapper; |
||||
import java.io.BufferedReader; |
||||
import java.io.ByteArrayInputStream; |
||||
import java.io.IOException; |
||||
import java.io.InputStreamReader; |
||||
|
||||
/** |
||||
* @author xx |
||||
* @date 2022/03/01 |
||||
*/ |
||||
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper { |
||||
private BufferedReader br; |
||||
private byte[] body; |
||||
|
||||
public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException { |
||||
super(request); |
||||
//this.br = request.getReader();
|
||||
body = StreamUtil.readBytes(request.getInputStream()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public BufferedReader getReader() throws IOException { |
||||
return new BufferedReader(new InputStreamReader(getInputStream())); |
||||
} |
||||
|
||||
@Override |
||||
public ServletInputStream getInputStream() throws IOException { |
||||
final ByteArrayInputStream bais = new ByteArrayInputStream(body); |
||||
return new ServletInputStream() { |
||||
|
||||
@Override |
||||
public boolean isFinished() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isReady() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void setReadListener(ReadListener readListener) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int read() throws IOException { |
||||
return bais.read(); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
public void setBody(byte[] body) { |
||||
this.body = body; |
||||
} |
||||
} |
@ -0,0 +1,206 @@
|
||||
package com.fr.plugin.xx.zyjn.decode.decode; |
||||
|
||||
import cn.net.drm.edi.client.DrmAgent; |
||||
import cn.net.drm.edi.client.DrmAgentInf; |
||||
import cn.net.drm.edi.exception.DrmException; |
||||
import com.fr.base.ServerConfig; |
||||
import com.fr.base.core.IgnoreBytesInputStream; |
||||
import com.fr.base.core.ParseResult; |
||||
import com.fr.base.core.PostParseUtils; |
||||
import com.fr.data.NetworkHelper; |
||||
import com.fr.decision.authority.data.User; |
||||
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||
import com.fr.decision.mobile.terminal.TerminalHandler; |
||||
import com.fr.decision.webservice.v10.config.ConfigService; |
||||
import com.fr.decision.webservice.v10.login.LoginService; |
||||
import com.fr.decision.webservice.v10.login.TokenResource; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
import com.fr.general.CommonIOUtils; |
||||
import com.fr.io.utils.ResourceIOUtils; |
||||
import com.fr.plugin.context.PluginContexts; |
||||
import com.fr.plugin.xx.zyjn.decode.LogUtils; |
||||
import com.fr.plugin.xx.zyjn.decode.PluginConstants; |
||||
import com.fr.plugin.transform.FunctionRecorder; |
||||
import com.fr.stable.fun.Authorize; |
||||
import com.fr.stable.web.Device; |
||||
import com.fr.third.org.apache.commons.io.IOUtils; |
||||
|
||||
import javax.servlet.FilterChain; |
||||
import javax.servlet.ServletException; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.*; |
||||
import java.util.UUID; |
||||
|
||||
/** |
||||
* @author xx |
||||
* @date 2022/03/01 |
||||
*/ |
||||
@FunctionRecorder |
||||
@Authorize(callSignKey = PluginConstants.PLUGIN_ID) |
||||
public class DecodeFilter extends AbstractGlobalRequestFilterProvider { |
||||
|
||||
private static final byte[] NEW_LINE_BYTES = new byte[]{13, 10}; |
||||
private static final byte[] BOUNDARY_END = new byte[]{45, 45}; |
||||
|
||||
private static final String TMP_PATH = System.getProperty("java.io.tmpdir"); |
||||
|
||||
@Override |
||||
public String filterName() { |
||||
return "decode"; |
||||
} |
||||
|
||||
@Override |
||||
public String[] urlPatterns() { |
||||
String servletPathName = "decision"; |
||||
try { |
||||
servletPathName = ConfigService.getInstance().getBasicParam().getServletPathName(); |
||||
} catch (Exception e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} |
||||
if (PluginContexts.currentContext().isAvailable()) { |
||||
return new String[]{ |
||||
"/" + servletPathName + "/v10/attach/upload", |
||||
"/" + servletPathName + "/v10/dataset/upload", |
||||
"/" + servletPathName + "/view/report", |
||||
|
||||
}; |
||||
} else { |
||||
return new String[]{"/aaaa"}; |
||||
} |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { |
||||
BodyReaderHttpServletRequestWrapper wrapper = null; |
||||
try { |
||||
DrmAgentInf instance; |
||||
instance = DrmAgent.getInstance(); |
||||
wrapper = new BodyReaderHttpServletRequestWrapper(req); |
||||
User user = getUser(req); |
||||
if (user == null) { |
||||
LogUtils.debug4plugin("current user is null,not decrypted"); |
||||
filter(wrapper, res, filterChain); |
||||
return; |
||||
} |
||||
InputStream inputStream = wrapper.getInputStream(); |
||||
ParseResult parseResult = PostParseUtils.parse(inputStream, req.getCharacterEncoding()); |
||||
InputStream fis = new IgnoreBytesInputStream(inputStream, this.concat(this.concat(NEW_LINE_BYTES, parseResult.getBoundary().getBytes()), BOUNDARY_END)); |
||||
LogUtils.debug4plugin("record file request url is {}", req.getRequestURI() + req.getQueryString()); |
||||
File file = saveTmp(fis, parseResult.getFileName()); |
||||
boolean encrypted = instance.isEncrypted(file); |
||||
LogUtils.debug4plugin("current files encrypted is {}", encrypted); |
||||
if (!encrypted) { |
||||
filter(wrapper, res, filterChain); |
||||
return; |
||||
} |
||||
decode(req, wrapper, parseResult, file, instance); |
||||
} catch (Exception e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} |
||||
if (wrapper != null) { |
||||
filter(wrapper, res, filterChain); |
||||
return; |
||||
} |
||||
} |
||||
|
||||
private void decode(HttpServletRequest req, BodyReaderHttpServletRequestWrapper wrapper, ParseResult parseResult, File file, DrmAgentInf instance) throws DrmException, UnsupportedEncodingException, FileNotFoundException { |
||||
//File file = saveTmp(fis,parseResult.getFileName());
|
||||
long decrypt = instance.decrypt(file); |
||||
LogUtils.debug4plugin("decode file size is {}", decrypt); |
||||
wrapper.setBody(handleBody(req, CommonIOUtils.inputStream2Bytes(new FileInputStream(file)), parseResult, req.getCharacterEncoding() == null ? ServerConfig.getInstance().getServerCharset() : req.getCharacterEncoding())); |
||||
file.delete(); |
||||
LogUtils.debug4plugin("delete temp file"); |
||||
} |
||||
|
||||
private User getUser(HttpServletRequest req) { |
||||
try { |
||||
return UserService.getInstance().getUserByRequestCookie(req); |
||||
} catch (Exception e) { |
||||
|
||||
} |
||||
return null; |
||||
} |
||||
|
||||
private File saveTmp(InputStream input, String filename) { |
||||
if (!ResourceIOUtils.isDirectoryExist(TMP_PATH)) { |
||||
ResourceIOUtils.createDirectory(TMP_PATH); |
||||
} |
||||
String path = TMP_PATH + File.separator + UUID.randomUUID() + filename.substring(filename.indexOf(".")); |
||||
File file = new File(path); |
||||
FileOutputStream outputStream = null; |
||||
if (!file.exists()) { |
||||
try { |
||||
file.createNewFile(); |
||||
outputStream = new FileOutputStream(file.getPath()); |
||||
IOUtils.copyLarge(input, outputStream); |
||||
LogUtils.debug4plugin("save tmp file path is {}", path); |
||||
} catch (IOException e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} finally { |
||||
try { |
||||
input.close(); |
||||
outputStream.flush(); |
||||
outputStream.close(); |
||||
} catch (IOException e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} |
||||
} |
||||
} |
||||
return new File(path); |
||||
} |
||||
|
||||
|
||||
private void filter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { |
||||
try { |
||||
filterChain.doFilter(req, res); |
||||
} catch (IOException e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} catch (ServletException e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
private boolean isLogin(HttpServletRequest request) { |
||||
String oldToken = TokenResource.COOKIE.getToken(request); |
||||
return oldToken != null && checkTokenValid(request, (String) oldToken); |
||||
} |
||||
|
||||
private boolean checkTokenValid(HttpServletRequest req, String token) { |
||||
try { |
||||
Device device = NetworkHelper.getDevice(req); |
||||
LoginService.getInstance().loginStatusValid(token, TerminalHandler.getTerminal(req, device)); |
||||
return true; |
||||
} catch (Exception ignore) { |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
private byte[] concat(byte[] a, byte[] b) { |
||||
byte[] c = new byte[a.length + b.length]; |
||||
System.arraycopy(a, 0, c, 0, a.length); |
||||
System.arraycopy(b, 0, c, a.length, b.length); |
||||
return c; |
||||
} |
||||
|
||||
private byte[] handleBody(HttpServletRequest req, byte[] body, ParseResult parseResult, String charsetName) throws UnsupportedEncodingException { |
||||
byte[] newBody; |
||||
byte[] start; |
||||
byte[] end; |
||||
StringBuilder stringBuilder = new StringBuilder(); |
||||
stringBuilder.append(parseResult.getBoundary()).append("\r\n") |
||||
.append("Content-Disposition:").append(parseResult.getDispline()) |
||||
.append("; name=\"").append(parseResult.getFieldName()) |
||||
.append("\"; filename=\"").append(parseResult.getFileName()).append("\"\r\n") |
||||
.append("Content-Type: ").append(req.getContentType()).append("\r\n").append("\r\n"); |
||||
start = stringBuilder.toString().getBytes(charsetName); |
||||
StringBuilder stringBuilder1 = new StringBuilder(); |
||||
stringBuilder1.append("\r\n").append(parseResult.getBoundary()).append("--\r\n"); |
||||
end = stringBuilder1.toString().getBytes(charsetName); |
||||
|
||||
newBody = this.concat(this.concat(start, body), end); |
||||
return newBody; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,28 @@
|
||||
package com.fr.plugin.xx.zyjn.decode.encode; |
||||
|
||||
import com.fr.io.collection.ExportCollection; |
||||
import com.fr.io.exporter.AppExporter; |
||||
import com.fr.plugin.xx.zyjn.decode.LogUtils; |
||||
import com.fr.web.core.ReportSessionIDInfor; |
||||
import com.fr.web.core.reserve.DefaultExportExtension; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
/** |
||||
* @Author xx |
||||
* @Date 2022/3/7 |
||||
* @Description |
||||
**/ |
||||
public class EncodeExportExtensionProvider extends DefaultExportExtension { |
||||
|
||||
@Override |
||||
public ExportCollection createCollection(HttpServletRequest req, HttpServletResponse res, |
||||
ReportSessionIDInfor info, String format, String filename, boolean isEmbed) throws Exception { |
||||
ExportCollection collection = super.createCollection(req, res, info, format, filename, isEmbed); |
||||
LogUtils.debug4plugin("get encode exporter"); |
||||
AppExporter exporter = collection.getExporter(); |
||||
collection.setExporter(new EncryptExporter(exporter)); |
||||
return collection; |
||||
} |
||||
} |
@ -0,0 +1,48 @@
|
||||
package com.fr.plugin.xx.zyjn.decode.encode; |
||||
|
||||
import com.fr.io.exporter.AppExporter; |
||||
import com.fr.main.workbook.ResultWorkBook; |
||||
import com.fr.page.PageSetCreator; |
||||
import com.fr.page.PageSetProvider; |
||||
import com.fr.web.core.ReportRepositoryDeal; |
||||
|
||||
import java.io.OutputStream; |
||||
|
||||
/** |
||||
* @Author xx |
||||
* @Date 2022/3/7 |
||||
* @Description |
||||
**/ |
||||
public class EncryptExporter implements AppExporter { |
||||
|
||||
private AppExporter original; |
||||
|
||||
public EncryptExporter(AppExporter original) { |
||||
this.original = original; |
||||
} |
||||
|
||||
@Override |
||||
public void export(OutputStream out, ResultWorkBook book) throws Exception { |
||||
original.export(new EncryptOutputStream(out), book); |
||||
} |
||||
|
||||
@Override |
||||
public void export(OutputStream out, PageSetProvider pageSet) throws Exception { |
||||
original.export(new EncryptOutputStream(out), pageSet); |
||||
} |
||||
|
||||
@Override |
||||
public void export(OutputStream out, ResultWorkBook book, PageSetCreator creator, ReportRepositoryDeal repo, int[] sheets) throws Exception { |
||||
original.export(new EncryptOutputStream(out), book, creator, repo, sheets); |
||||
} |
||||
|
||||
@Override |
||||
public void export(OutputStream out, ResultWorkBook book, PageSetProvider pageSet, ReportRepositoryDeal repo, int[] sheets) throws Exception { |
||||
original.export(new EncryptOutputStream(out), book, pageSet, repo, sheets); |
||||
} |
||||
|
||||
@Override |
||||
public void setVersion(Object o) { |
||||
original.setVersion(o); |
||||
} |
||||
} |
@ -0,0 +1,190 @@
|
||||
package com.fr.plugin.xx.zyjn.decode.encode; |
||||
|
||||
import cn.net.drm.edi.client.DrmAgent; |
||||
import cn.net.drm.edi.client.DrmAgentInf; |
||||
import cn.net.drm.io.IOUtils; |
||||
import com.fr.general.CommonIOUtils; |
||||
import com.fr.plugin.xx.zyjn.decode.DecodeConfig; |
||||
import com.fr.plugin.xx.zyjn.decode.LogUtils; |
||||
import com.fr.plugin.xx.zyjn.decode.encode.bi.FileUtil; |
||||
import org.apache.tools.zip.ZipOutputStream; |
||||
|
||||
import javax.servlet.ServletOutputStream; |
||||
import javax.servlet.WriteListener; |
||||
import java.io.*; |
||||
import java.util.UUID; |
||||
import java.util.stream.Collectors; |
||||
import java.util.stream.Stream; |
||||
|
||||
/** |
||||
* @Author xx |
||||
* @Date 2022/3/3 |
||||
* @Description |
||||
**/ |
||||
public class EncryptOutputStream extends ServletOutputStream { |
||||
|
||||
private OutputStream original = null; |
||||
private boolean closed = false; |
||||
private ByteArrayOutputStream crypt = new ByteArrayOutputStream(); |
||||
|
||||
public EncryptOutputStream(OutputStream original) { |
||||
this.original = original; |
||||
} |
||||
|
||||
/** |
||||
* 实际加密的代码就在这里实现了 |
||||
* |
||||
* @param bytes |
||||
* @param ignore |
||||
* @return |
||||
*/ |
||||
public static byte[] encrypt(byte[] bytes, boolean ignore) { |
||||
DecodeConfig config = DecodeConfig.getInstance(); |
||||
/*if (!config.isConfiged()) { |
||||
LogUtils.warn("config not finish, not encrypted"); |
||||
return bytes; |
||||
}*/ |
||||
ByteArrayInputStream bis = new ByteArrayInputStream(bytes); |
||||
byte[] header = new byte[256]; |
||||
bis.mark(256); |
||||
byte[] encode = bytes; |
||||
OutputStream fos = null; |
||||
try { |
||||
DrmAgentInf instance = null; |
||||
instance = DrmAgent.getInstance(); |
||||
File tempFile = File.createTempFile("tmp" + UUID.randomUUID().toString(), null); |
||||
LogUtils.info("create tmp file path is {}", tempFile.getPath()); |
||||
bis.read(header); |
||||
bis.reset(); |
||||
boolean isEncryptFile = instance.isEncrypted(tempFile); |
||||
if (!isEncryptFile) { |
||||
if (FileUtil.isArchiveFile(bytes) && !ignore) { |
||||
encode = encodeZip(bytes, instance, config); |
||||
} else { |
||||
//fos = instance.encryptBasicFile(tempFile, config.getOwnerId(), config.getSecretLevelId());
|
||||
int len = 0; |
||||
byte[] buffer = new byte[1024]; |
||||
while ((len = bis.read(buffer)) > 0) { |
||||
fos.write(buffer, 0, len); |
||||
} |
||||
fos.flush(); |
||||
FileInputStream in = new FileInputStream(tempFile); |
||||
encode = CommonIOUtils.inputStream2Bytes(in); |
||||
tempFile.deleteOnExit(); |
||||
} |
||||
} |
||||
} catch (Exception e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} finally { |
||||
IOUtils.closeQuietly(bis); |
||||
IOUtils.closeQuietly(fos); |
||||
|
||||
} |
||||
//假设逆序就是加密了
|
||||
return encode; |
||||
} |
||||
|
||||
private static byte[] encodeZip(byte[] bytes, DrmAgentInf instance, DecodeConfig config) { |
||||
File zipFile = null, encodeZipFile = null; |
||||
File unzipFileFolder = FileUtil.createTempFolder("tmp_unzip" + UUID.randomUUID().toString()); |
||||
File zipFileFolder = FileUtil.createTempFolder("tmp_zip" + UUID.randomUUID().toString()); |
||||
try { |
||||
encodeZipFile = FileUtil.createTempFile(); |
||||
zipFile = FileUtil.createTempFile(); |
||||
//先缓存文件
|
||||
com.fr.general.IOUtils.copyBinaryTo(new ByteArrayInputStream(bytes), new FileOutputStream(zipFile)); |
||||
LogUtils.debug4plugin("save zip file path:{} size is {}", zipFile.getAbsolutePath(), zipFile.getTotalSpace()); |
||||
//再解压出来
|
||||
com.fr.general.IOUtils.unzip(zipFile, unzipFileFolder.getAbsolutePath(),"GBK"); |
||||
LogUtils.debug4plugin("unzip file path is {} file list is {} unzip size is {}", unzipFileFolder.getAbsolutePath(), Stream.of(unzipFileFolder.listFiles()).map(e->e.getName()).collect(Collectors.joining(",")), unzipFileFolder.listFiles().length); |
||||
File[] files = unzipFileFolder.listFiles(); |
||||
ZipOutputStream zipOutputStream = new ZipOutputStream(encodeZipFile); |
||||
zipOutputStream.setEncoding("GBK"); |
||||
for (int i = 0; i < files.length; i++) { |
||||
File file = files[i]; |
||||
//加密复制到另外一个文件夹
|
||||
String encode = zipFileFolder + File.separator + file.getName(); |
||||
InputStream bis = new FileInputStream(file); |
||||
//加密
|
||||
OutputStream fos =null;// instance.encryptBasicStream(new FileOutputStream(encode), config.getOwnerId(), config.getSecretLevelId());
|
||||
int len = 0; |
||||
byte[] buffer = new byte[1024]; |
||||
while ((len = bis.read(buffer)) > 0) { |
||||
fos.write(buffer, 0, len); |
||||
} |
||||
fos.flush(); |
||||
IOUtils.closeQuietly(bis); |
||||
IOUtils.closeQuietly(fos); |
||||
LogUtils.debug4plugin("encode file {} to {}", file.getAbsolutePath(), encode); |
||||
} |
||||
//zip
|
||||
com.fr.general.IOUtils.zip(zipOutputStream, zipFileFolder); |
||||
zipOutputStream.closeEntry(); |
||||
zipOutputStream.close(); |
||||
LogUtils.debug4plugin("zip file folder {} to {}", zipFileFolder, encodeZipFile.getAbsolutePath()); |
||||
bytes = CommonIOUtils.inputStream2Bytes(new FileInputStream(encodeZipFile)); |
||||
} catch (Exception e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} finally { |
||||
if (zipFile != null) { |
||||
zipFile.deleteOnExit(); |
||||
} |
||||
if (encodeZipFile != null) { |
||||
encodeZipFile.deleteOnExit(); |
||||
} |
||||
unzipFileFolder.deleteOnExit(); |
||||
zipFileFolder.deleteOnExit(); |
||||
zipFile.deleteOnExit(); |
||||
} |
||||
return bytes; |
||||
} |
||||
|
||||
@Override |
||||
public void write(int b) throws IOException { |
||||
if (closed) { |
||||
throw new IOException("Cannot write to a closed output stream"); |
||||
} |
||||
crypt.write(b); |
||||
} |
||||
|
||||
@Override |
||||
public void close() throws IOException { |
||||
if (!closed) { |
||||
byte[] bytes = crypt.toByteArray(); |
||||
bytes = encrypt(bytes, false); |
||||
original.write(bytes); |
||||
original.flush(); |
||||
original.close(); |
||||
closed = true; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void flush() throws IOException { |
||||
crypt.flush(); |
||||
} |
||||
|
||||
@Override |
||||
public void write(byte[] data) throws IOException { |
||||
write(data, 0, data.length); |
||||
} |
||||
|
||||
@Override |
||||
public void write(byte[] data, int off, int len) throws IOException { |
||||
if (closed) { |
||||
throw new IOException("Cannot write to a closed output stream"); |
||||
} |
||||
crypt.write(data, off, len); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isReady() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void setWriteListener(WriteListener listener) { |
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,25 @@
|
||||
package com.fr.plugin.xx.zyjn.decode.encode; |
||||
|
||||
import javax.servlet.ServletOutputStream; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import javax.servlet.http.HttpServletResponseWrapper; |
||||
import java.io.IOException; |
||||
|
||||
/** |
||||
* @Author xx |
||||
* @Date 2022/3/3 |
||||
* @Description |
||||
**/ |
||||
public class EncryptResponse extends HttpServletResponseWrapper { |
||||
|
||||
public EncryptResponse(HttpServletResponse response) { |
||||
super(response); |
||||
} |
||||
|
||||
@Override |
||||
public ServletOutputStream getOutputStream()throws IOException { |
||||
ServletOutputStream original = super.getOutputStream(); |
||||
return new EncryptOutputStream(original); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,71 @@
|
||||
package com.fr.plugin.xx.zyjn.decode.encode.bi; |
||||
|
||||
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||
import com.fr.decision.webservice.v10.config.ConfigService; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.plugin.xx.zyjn.decode.LogUtils; |
||||
import com.fr.plugin.xx.zyjn.decode.util.GZIPUtils; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.servlet.FilterChain; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
/** |
||||
* @Author xx |
||||
* @Date 2022/3/3 |
||||
* @Description |
||||
**/ |
||||
public class EncodeFilter extends AbstractGlobalRequestFilterProvider { |
||||
@Override |
||||
public String filterName() { |
||||
return "encode"; |
||||
} |
||||
|
||||
@Override |
||||
public String[] urlPatterns() { |
||||
String servletPathName = "decision"; |
||||
try { |
||||
servletPathName = ConfigService.getInstance().getBasicParam().getServletPathName(); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return new String[]{ |
||||
"/" + servletPathName + "/v5/design/report/data/export", |
||||
"/" + servletPathName + "/v5/design/report/data/global/export/pdf", |
||||
"/" + servletPathName + "/v5/design/report/data/global/export/excel", |
||||
|
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { |
||||
try { |
||||
String method = req.getMethod(); |
||||
if ("POST".equalsIgnoreCase(method)) { |
||||
String uri = req.getRequestURI(); |
||||
String query = req.getQueryString(); |
||||
LogUtils.debug4plugin("BI export url {}",uri + "?" + query); |
||||
ResponseWrapperImpl wrapper = new ResponseWrapperImpl(res); |
||||
filterChain.doFilter(req, wrapper); |
||||
FileUtil.handle(res.getOutputStream(), os -> { |
||||
byte[] bytes = wrapper.getDataStream(); |
||||
if (StringUtils.contains(wrapper.getHeader("Content-Encoding"), "gzip")) { |
||||
FineLoggerFactory.getLogger().info("current url {} is gzip", getUrl(req)); |
||||
bytes = GZIPUtils.decompress(bytes); |
||||
} |
||||
os.write(bytes); |
||||
os.flush(); |
||||
}, req,res); |
||||
} |
||||
} catch (Exception e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
private String getUrl(HttpServletRequest req) { |
||||
String uri = req.getRequestURI(); |
||||
String query = req.getQueryString(); |
||||
return StringUtils.isNotBlank(query) ? uri + "?" + query : uri; |
||||
} |
||||
} |
@ -0,0 +1,18 @@
|
||||
package com.fr.plugin.xx.zyjn.decode.encode.bi; |
||||
|
||||
import java.io.OutputStream; |
||||
|
||||
/** |
||||
* @author xx |
||||
* @date 2020/11/20 |
||||
*/ |
||||
@FunctionalInterface |
||||
public interface ExportFunc { |
||||
/** |
||||
* 写入到临时输出流 |
||||
* |
||||
* @param os 临时输出流 |
||||
* @return void |
||||
**/ |
||||
void export(OutputStream os) throws Exception; |
||||
} |
@ -0,0 +1,169 @@
|
||||
package com.fr.plugin.xx.zyjn.decode.encode.bi; |
||||
|
||||
import com.fr.general.CommonIOUtils; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.plugin.xx.zyjn.decode.LogUtils; |
||||
import com.fr.plugin.xx.zyjn.decode.encode.EncryptOutputStream; |
||||
import com.fr.plugin.xx.zyjn.decode.util.GZIPUtils; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.third.org.apache.commons.io.IOUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.*; |
||||
import java.util.Arrays; |
||||
import java.util.UUID; |
||||
|
||||
/** |
||||
* @author xx |
||||
* @date 2020/11/20 |
||||
*/ |
||||
public class FileUtil { |
||||
|
||||
/** |
||||
* 文件加密之后再写入指定的输出流 |
||||
* |
||||
* @param file |
||||
* @param stream |
||||
* @return void |
||||
**/ |
||||
public static void handle(File file, OutputStream stream, HttpServletRequest req, HttpServletResponse res) { |
||||
InputStream is = null; |
||||
try { |
||||
FileInputStream inputStream = new FileInputStream(file); |
||||
byte[] encodeFile = encodeFile(CommonIOUtils.inputStream2Bytes(inputStream), req); |
||||
is = new ByteArrayInputStream(encodeFile); |
||||
byte[] bytes = CommonIOUtils.inputStream2Bytes(is); |
||||
if (StringUtils.contains(res.getHeader("Content-Encoding"), "gzip")) { |
||||
bytes = GZIPUtils.compress(bytes); |
||||
} |
||||
IOUtils.copyLarge(new ByteArrayInputStream(bytes), stream); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} finally { |
||||
if (is != null) { |
||||
try { |
||||
is.close(); |
||||
} catch (IOException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
if (stream != null) { |
||||
try { |
||||
stream.flush(); |
||||
} catch (IOException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
private static byte[] encodeFile(byte[] file, HttpServletRequest req) { |
||||
try { |
||||
return EncryptOutputStream.encrypt(file,true); |
||||
} catch (Exception e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} |
||||
return file; |
||||
} |
||||
|
||||
/** |
||||
* 加密导出文件后写入原始输出流中 |
||||
* 回调函数式处理 |
||||
* |
||||
* @param outputStream 原始输出流 |
||||
* @param func 临时输出流处理 |
||||
* @return void |
||||
**/ |
||||
public static void handle(OutputStream outputStream, ExportFunc func, HttpServletRequest req, HttpServletResponse res) { |
||||
File tempFile = null; |
||||
OutputStream os = null; |
||||
//写入到临时文件
|
||||
try { |
||||
tempFile = FileUtil.createTempFile(); |
||||
os = new FileOutputStream(tempFile); |
||||
//直接写到临时文件里边
|
||||
func.export(os); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} finally { |
||||
if (os != null) { |
||||
try { |
||||
os.close(); |
||||
} catch (IOException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
} |
||||
|
||||
//处理临时文件,写到原始输出流
|
||||
try { |
||||
handle(tempFile, outputStream, req,res);//临时加密后写到原始输出流中
|
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} finally { |
||||
if (tempFile != null) { |
||||
deleteFile(tempFile);//最后删除临时文件
|
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 创建临时文件 |
||||
* |
||||
* @return java.io.File |
||||
**/ |
||||
public static File createTempFile() throws IOException { |
||||
return File.createTempFile("tmp" + UUID.randomUUID().toString(), null);//创建一个临时文件
|
||||
} |
||||
|
||||
/** |
||||
* 删除文件 |
||||
* |
||||
* @param file |
||||
* @return boolean |
||||
* @author Zhanying |
||||
**/ |
||||
public static boolean deleteFile(File file) { |
||||
boolean flag = file.exists() && file.isFile() && file.delete(); |
||||
// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
|
||||
return flag; |
||||
} |
||||
|
||||
private static byte[] ZIP_HEADER_1 = new byte[]{80, 75, 3, 4}; |
||||
|
||||
private static byte[] ZIP_HEADER_2 = new byte[]{80, 75, 5, 6}; |
||||
|
||||
public static boolean isArchiveFile(byte[] file) { |
||||
if (file == null) { |
||||
return false; |
||||
} |
||||
boolean isArchive = false; |
||||
InputStream input = null; |
||||
try { |
||||
input = new ByteArrayInputStream(file); |
||||
byte[] buffer = new byte[4]; |
||||
int length = input.read(buffer, 0, 4); |
||||
if (length == 4) { |
||||
isArchive = (Arrays.equals(ZIP_HEADER_1, buffer)) || (Arrays.equals(ZIP_HEADER_2, buffer)); |
||||
} |
||||
} catch (IOException e) { |
||||
LogUtils.error(e.getMessage(), e); |
||||
} finally { |
||||
if (input != null) { |
||||
try { |
||||
input.close(); |
||||
} catch (IOException e) { |
||||
} |
||||
} |
||||
} |
||||
return isArchive; |
||||
} |
||||
|
||||
|
||||
public static File createTempFolder(String path) { |
||||
File file = new File(System.getProperty("java.io.tmpdir")+File.separator+path); |
||||
file.mkdir(); |
||||
return file; |
||||
} |
||||
} |
@ -0,0 +1,70 @@
|
||||
package com.fr.plugin.xx.zyjn.decode.encode.bi; |
||||
|
||||
import javax.servlet.ServletOutputStream; |
||||
import javax.servlet.WriteListener; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import javax.servlet.http.HttpServletResponseWrapper; |
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.DataOutputStream; |
||||
import java.io.IOException; |
||||
import java.io.OutputStream; |
||||
|
||||
|
||||
/** |
||||
* @author xx |
||||
* @date 2020/11/20 |
||||
*/ |
||||
public class ResponseWrapperImpl extends HttpServletResponseWrapper { |
||||
ByteArrayOutputStream output; |
||||
FilterServletOutputStream filterOutput; |
||||
|
||||
public ResponseWrapperImpl(HttpServletResponse response) { |
||||
super(response); |
||||
output = new ByteArrayOutputStream(); |
||||
} |
||||
|
||||
@Override |
||||
public ServletOutputStream getOutputStream() throws IOException { |
||||
if (filterOutput == null) { |
||||
filterOutput = new FilterServletOutputStream(output); |
||||
} |
||||
return filterOutput; |
||||
} |
||||
|
||||
public byte[] getDataStream() { |
||||
return output.toByteArray(); |
||||
} |
||||
|
||||
class FilterServletOutputStream extends ServletOutputStream { |
||||
DataOutputStream output; |
||||
|
||||
public FilterServletOutputStream(OutputStream output) { |
||||
this.output = new DataOutputStream(output); |
||||
} |
||||
|
||||
@Override |
||||
public void write(int arg0) throws IOException { |
||||
output.write(arg0); |
||||
} |
||||
|
||||
@Override |
||||
public void write(byte[] arg0, int arg1, int arg2) throws IOException { |
||||
output.write(arg0, arg1, arg2); |
||||
} |
||||
|
||||
@Override |
||||
public void write(byte[] arg0) throws IOException { |
||||
output.write(arg0); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isReady() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void setWriteListener(WriteListener writeListener) { |
||||
|
||||
} |
||||
} |
||||
} |
@ -0,0 +1,89 @@
|
||||
package com.fr.plugin.xx.zyjn.decode.util; |
||||
|
||||
import java.io.ByteArrayInputStream; |
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.IOException; |
||||
import java.io.OutputStream; |
||||
import java.util.zip.GZIPInputStream; |
||||
import java.util.zip.GZIPOutputStream; |
||||
|
||||
/** |
||||
* @Author xx |
||||
* @Date 2020/9/15 |
||||
* @Description |
||||
**/ |
||||
public class GZIPUtils { |
||||
|
||||
|
||||
|
||||
/** |
||||
* 数据压缩传输 |
||||
* |
||||
* @param is |
||||
* @param os |
||||
* @throws Exception |
||||
*/ |
||||
public static void compressTransfe(byte[] bytes, OutputStream out) throws IOException { |
||||
GZIPOutputStream gos = null; |
||||
try { |
||||
gos = new GZIPOutputStream(out); |
||||
gos.write(bytes); |
||||
gos.finish(); |
||||
gos.flush(); |
||||
} finally{ |
||||
if(gos != null){ |
||||
gos.close(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 数据压缩 |
||||
* |
||||
* @param is |
||||
* @param os |
||||
* @throws Exception |
||||
*/ |
||||
public static byte[] compress(byte[] bytes) throws IOException { |
||||
ByteArrayOutputStream out = null; |
||||
GZIPOutputStream gos = null; |
||||
try { |
||||
out = new ByteArrayOutputStream(); |
||||
gos = new GZIPOutputStream(out); |
||||
gos.write(bytes); |
||||
gos.finish(); |
||||
gos.flush(); |
||||
} finally{ |
||||
if(gos != null){ |
||||
gos.close(); |
||||
} |
||||
if(out != null){ |
||||
out.close(); |
||||
} |
||||
} |
||||
return out.toByteArray(); |
||||
} |
||||
|
||||
/** |
||||
* 数据解压 |
||||
* |
||||
* @param in |
||||
* @return |
||||
* @throws IOException |
||||
*/ |
||||
public static byte[] decompress(byte[] bytes) throws IOException { |
||||
ByteArrayInputStream in = new ByteArrayInputStream(bytes); |
||||
GZIPInputStream gin = new GZIPInputStream(in); |
||||
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
||||
int count; |
||||
byte data[] = new byte[1024]; |
||||
while ((count = gin.read(data, 0, 1024)) != -1) { |
||||
out.write(data, 0, count); |
||||
} |
||||
out.flush(); |
||||
out.close(); |
||||
gin.close(); |
||||
return out.toByteArray(); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue