You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ê

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:57:10