Browse Source

异常发生时 close 掉 OutputStream、Writer

James 3 years ago
parent
commit
4cf6a34f05

+ 6 - 3
src/main/java/com/jfinal/render/ErrorRender.java

@@ -16,7 +16,7 @@
 
 package com.jfinal.render;
 
-import java.io.IOException;
+import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.util.HashMap;
 import java.util.Map;
@@ -134,10 +134,13 @@ public class ErrorRender extends Render {
 		}
 		
 		// render with html content
+		OutputStream os = null;
 		try {
 			response.setContentType(isJsonContentType ? contentTypeJson : contentTypeHtml);
-			response.getOutputStream().write(isJsonContentType ? getErrorJson() : getErrorHtml());
-		} catch (IOException e) {
+			os = response.getOutputStream();
+			os.write(isJsonContentType ? getErrorJson() : getErrorHtml());
+		} catch (Exception e) {
+			close(os);
 			throw new RenderException(e);
 		}
 	}

+ 1 - 0
src/main/java/com/jfinal/render/FreeMarkerRender.java

@@ -158,6 +158,7 @@ public class FreeMarkerRender extends Render {
 			template.process(data, writer);		// Merge the data-model and the template
 			writer.flush();
 		} catch (Exception e) {
+			close(writer);
 			throw new RenderException(e);
 		}
 	}

+ 2 - 2
src/main/java/com/jfinal/render/JsonRender.java

@@ -16,7 +16,6 @@
 
 package com.jfinal.render;
 
-import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -139,7 +138,8 @@ public class JsonRender extends Render {
 			writer = response.getWriter();
 			writer.write(jsonText);
 			writer.flush();
-		} catch (IOException e) {
+		} catch (Exception e) {
+			close(writer);
 			throw new RenderException(e);
 		}
 	}

+ 6 - 1
src/main/java/com/jfinal/render/QrCodeRender.java

@@ -24,6 +24,7 @@ import com.google.zxing.qrcode.QRCodeWriter;
 import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
 import com.jfinal.kit.StrKit;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -110,6 +111,7 @@ public class QrCodeRender extends Render {
 			hints.put(EncodeHintType.ERROR_CORRECTION, errorCorrectionLevel);
 		}
 
+		OutputStream os = null;
 		try {
 			// MultiFormatWriter 可支持多种格式的条形码,在此直接使用 QRCodeWriter,通过查看源码可知少创建一个对象
 			// BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
@@ -117,15 +119,18 @@ public class QrCodeRender extends Render {
 			QRCodeWriter writer = new QRCodeWriter();
 			BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
 
+			os = response.getOutputStream();
 			// 经测试 200 X 200 大小的二维码使用 "png" 格式只有 412B,而 "jpg" 却达到 15KB
-			MatrixToImageWriter.writeToStream(bitMatrix, "png", response.getOutputStream());    // format: "jpg"、"png"
+			MatrixToImageWriter.writeToStream(bitMatrix, "png", os);    // format: "jpg"、"png"
 		} catch (IOException e) {	// ClientAbortException、EofException 直接或间接继承自 IOException
+			close(os);
 			String name = e.getClass().getSimpleName();
 			if ("ClientAbortException".equals(name) || "EofException".equals(name)) {
 			} else {
 				throw new RenderException(e);
 			}
 		} catch (Exception e) {
+			close(os);
 			throw new RenderException(e);
 		}
 	}

+ 6 - 2
src/main/java/com/jfinal/render/TemplateRender.java

@@ -56,13 +56,16 @@ public class TemplateRender extends Render {
 			data.put(attrName, request.getAttribute(attrName));
 		}
 		
+		OutputStream os = null;
 		try {
 			
-			OutputStream os = response.getOutputStream();
+			os = response.getOutputStream();
 			engine.getTemplate(view).render(data, os);
 			os.flush();
 			
 		} catch (RuntimeException e) {	// 捕获 ByteWriter.close() 抛出的 RuntimeException
+			close(os);
+			
 			Throwable cause = e.getCause();
 			if (cause instanceof IOException) {	// ClientAbortException、EofException 直接或间接继承自 IOException
 				String name = cause.getClass().getSimpleName();
@@ -72,7 +75,8 @@ public class TemplateRender extends Render {
 			}
 			
 			throw e;
-		} catch (IOException e) {
+		} catch (Exception e) {
+			close(os);
 			throw new RenderException(e);
 		}
 	}

+ 2 - 2
src/main/java/com/jfinal/render/TextRender.java

@@ -16,7 +16,6 @@
 
 package com.jfinal.render;
 
-import java.io.IOException;
 import java.io.PrintWriter;
 
 /**
@@ -66,7 +65,8 @@ public class TextRender extends Render {
 			writer = response.getWriter();
 			writer.write(text);
 			writer.flush();
-		} catch (IOException e) {
+		} catch (Exception e) {
+			close(writer);
 			throw new RenderException(e);
 		}
 	}