WebLogic服务器上传JSP文件无法执行,求解决配置及代码方案
解决WebLogic中上传JSP文件无法执行的问题
问题原因
你的Servlet代码是直接读取文件内容并通过PrintWriter输出到响应中,这相当于把JSP的源代码直接发送给浏览器,完全绕过了WebLogic的JSP解析引擎。只有当请求被WebLogic内置的JSP处理Servlet(默认是weblogic.servlet.JspServlet)接管时,JSP文件才会被编译执行,而不是直接输出源码。
解决方法
方法1:让WebLogic直接处理JSP请求(推荐)
修改Web应用的web.xml,将上传目录下的JSP请求映射到WebLogic的JSP处理Servlet:
<servlet> <servlet-name>jsp</servlet-name> <servlet-class>weblogic.servlet.JspServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>/uploads/*.jsp</url-pattern> </servlet-mapping>
如果上传目录不在Web应用根目录内,通过weblogic.xml配置虚拟目录映射:
<weblogic-web-app> <virtual-directory-mapping> <local-path>/实际上传目录的绝对路径</local-path> <url-pattern>/uploads/*</url-pattern> </virtual-directory-mapping> </weblogic-web-app>
配置完成后,直接访问http://your-domain/your-app/uploads/xxx.jsp时,WebLogic会自动解析执行JSP代码。
方法2:修改Servlet代码,转发请求给JSP引擎
如果必须通过自定义Servlet处理请求,不要直接读取输出JSP内容,而是将请求转发给JSP引擎处理。修改你的doGet方法:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = request.getPathInfo().substring(1); String uploadPath = UPLOAD_DIRECTORY; File file = new File(uploadPath + File.separator + fileName); if (file.exists() && !file.isDirectory()) { // 针对JSP文件,转发给JSP引擎处理 if (fileName.toLowerCase().endsWith(".jsp")) { // 构造Web应用内的JSP访问路径,需和虚拟目录映射或实际目录对应 String jspRequestPath = "/uploads/" + fileName; request.getRequestDispatcher(jspRequestPath).forward(request, response); } else { // 非JSP文件保持原逻辑,改用字节流处理二进制文件避免损坏 String mimeType = getServletContext().getMimeType(file.getName()); if (mimeType == null) { mimeType = "application/octet-stream"; } response.setContentType(mimeType); response.setContentLength((int) file.length()); response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\""); try (FileInputStream in = new FileInputStream(file); ServletOutputStream out = response.getOutputStream()) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } } } } else { response.sendError(HttpServletResponse.SC_NOT_FOUND, "File not found"); } }
注意:此方法需要确保上传目录已通过weblogic.xml映射为Web应用的虚拟目录,否则JSP引擎无法找到对应的文件。
额外提示
原代码使用BufferedReader(字符流)读取所有文件,会导致图片、视频等二进制文件损坏,建议对非文本文件改用字节流输出,如上面代码中所示。
内容的提问来源于stack exchange,提问作者Việt Anh Lê
相关产品推荐
相关产品推荐

