1. 程式人生 > >JavaSE ImageIO編寫的驗證碼在linux上的tomcat顯示不出來的問題解決

JavaSE ImageIO編寫的驗證碼在linux上的tomcat顯示不出來的問題解決

問題描述

  將打包好的war部署到linux伺服器上,發現驗證碼部分一直顯示不出來。後來看了日誌:

22-May-2018 18:51:59.813 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 1838 ms
java.io.IOException: An exception occurred processing [/headBar/makeCertPic.jsp] at line [73]

70:     // 將認證碼存入SESSION
71:     session.setAttribute("certCode"
, sRand.toString()); 72: g.dispose(); 73: ImageIO.write(image, "JPEG", response.getOutputStream()); 74: %> Stacktrace: at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:472) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330
) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53
) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at filter.UserFilter.doFilter(UserFilter.kt:46) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Caused by: javax.imageio.IIOException: Can't create output stream! at javax.imageio.ImageIO.write(ImageIO.java:1574) at org.apache.jsp.headBar.makeCertPic_jsp._jspService(makeCertPic_jsp.java:193) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:444) ... 28 more Caused by: javax.imageio.IIOException: Can't create cache file! at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:423) at javax.imageio.ImageIO.write(ImageIO.java:1572) ... 32 more Caused by: java.nio.file.NoSuchFileException: /home/wangyu/Android/apache-tomcat-9.0.6/temp/imageio138834226394495527.tmp at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214) at java.nio.file.Files.newByteChannel(Files.java:361) at java.nio.file.Files.createFile(Files.java:632) at java.nio.file.TempFileHelper.create(TempFileHelper.java:138) at java.nio.file.TempFileHelper.createTempFile(TempFileHelper.java:161) at java.nio.file.Files.createTempFile(Files.java:897) at javax.imageio.stream.FileCacheImageOutputStream.<init>(FileCacheImageOutputStream.java:88) at com.sun.imageio.spi.OutputStreamImageOutputStreamSpi.createOutputStreamInstance(OutputStreamImageOutputStreamSpi.java:68) at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:419) ... 33 more

解決方法

  主要原因是因為ImageIO需要預設需要有一個資料夾作為緩衝(預設是寫入到tomcat/temp資料夾下),而tomcat預設是不會建立temp資料夾的,所以需要我們手動建立temp資料夾。

其他方法1

  通過ImageIO.setCacheDirectory(cacheDirectory);設定任意的、存在的快取目錄。

其他方法2

  ImageIO預設是使用快取目錄,可以通過ImageIO.setUseCache(false)來設定,更改快取策略,不使用檔案目錄快取,使用記憶體快取。

其他方法3

  不使用ImageIO,換成其它JDK方法。將ImageIO.write(bi, "jpg", os);換成:

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream()); 
encoder.encode(image);

附錄