【问题标题】:JSP / JasperException : File [/xyz.jsp] not foundJSP / JasperException:找不到文件 [/xyz.jsp]
【发布时间】:2018-10-23 05:34:25
【问题描述】:

我已经搜索过,但很烦人地找不到我的场景。

当我在 Eclipse 中运行我的项目时,它工作正常,但是当我(通过 WAR)部署到我的生产服务器时,我得到了 JasperException File Not Found。这只发生在不在根文件夹中的 JSP 上。我难住了。本质上,我将 /secure/ 上下文用于我的安全过滤器。

文件结构: FileStructure in Eclipse

Web.XML:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" 
        id="WebApp_ID" version="4.0">

    <display-name>Name Here</display-name>
    <description>Description Here</description>

    <filter>
        <filter-name>AuthenticationFilter</filter-name>
        <filter-class>com.example.package.AuthFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AuthenticationFilter</filter-name>
        <url-pattern>/secure/*</url-pattern>
    </filter-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

JSP(是的,这就是我刚刚开始的整个 JSP): *注意:JSTL 成员加载在 header 中

<%@include file="/inc.header.jsp"%> <!-- file-not-found -->
<div class="m-2">

<h3>SECURE INDEX</h3>

<h5>User Details</h5>
<table class="table table-sm table-hover table-responsive table-bordered">
    <tbody>
    <c:forEach var="detail" items="${user.userdetails}">
        <tr>
            <td><c:out value="${detail.key}"/></td>
            <td><c:out value="${detail.value}"/></td>
        </tr>
    </c:forEach>
    </tbody>
</table>

</div>
<%@include file="/inc.footer.jsp"%> <!-- file-not-found -->

错误信息:

Exception

org.apache.jasper.JasperException: /index.jsp (line: [1], column: [2]) File [/inc.header.jsp] not found
    org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42)
    org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:292)
    org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:98)
    org.apache.jasper.compiler.Parser.processIncludeDirective(Parser.java:345)
    org.apache.jasper.compiler.Parser.parseIncludeDirective(Parser.java:380)
    org.apache.jasper.compiler.Parser.parseDirective(Parser.java:481)
    org.apache.jasper.compiler.Parser.parseFileDirectives(Parser.java:1797)
    org.apache.jasper.compiler.Parser.parse(Parser.java:141)
    org.apache.jasper.compiler.ParserController.doParse(ParserController.java:244)
    org.apache.jasper.compiler.ParserController.parseDirectives(ParserController.java:127)
    org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:202)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:385)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:362)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:346)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:383)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

非常感谢任何想法。

编辑 --- 我发现如果我在“不安全”文件夹中做同样的事情,它会工作一秒钟。所以有些事情我无法理解...... AuthFilter 非常简单,我看不出有什么问题。

AuthFilter.java:

package com.example.package;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
//import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

// @WebFilter("/AuthFilter") /* removed in favor of web.xml */
public class AuthFilter implements Filter {

    //private ServletContext context;

    public void init(FilterConfig fConfig) throws ServletException {
        //this.context = fConfig.getServletContext();
        //this.context.log("AuthenticationFilter initialized");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        //String uri = req.getRequestURI();
        //this.context.log("Requested Resource::"+uri);
        //System.out.println("Requested Resource::"+uri);

        HttpSession session = req.getSession(true);

        Boolean isLoggedIn = false;
        if (session != null) isLoggedIn = (Boolean)session.getAttribute("isLoggedIn");
        if (isLoggedIn == null) isLoggedIn = false;

        if( !isLoggedIn ){
            //this.context.log("Unauthorized access request");
            res.sendRedirect("/login.jsp");
        }else{
            // pass the request along the filter chain
            chain.doFilter(request, response);
        }
    }

    public void destroy() {
        //TODO close any resources here
    }
}

编辑: 我可能正在做某事。 提示:这是一个“虚拟上下文”或任何你称之为的东西。我的http://localhost/ 实际上不起作用。它必须是 http://app.example.com/ 才能被 Tomcat 识别。我在想tomcat 不恰当地将我的“安全”文件夹解析为独立的网络应用程序。我在这个系统上有多个虚拟主机,没有碰巧使用这个概念,也没有子文件夹索引文件。由于我刚刚收到一个新错误,将我的页眉/页脚文件移动到 /secure/ 我现在得到一个“绝对 uri:[http://java.sun.com/jsp/jstl/core] 无法在 web.xml 或使用此应用程序部署的 jar 文件中解析” .... 因此,我认为 Tomcat 认为我的 /secure/ 是一个独立的应用程序。

Server.xml 条目:

<Host name="app.example.com" appBase="webapp_hosts/app.example.com" unpackWARs="false" autoDeploy="true" reloadable="true">
            <Alias>app.example.server</Alias>
            <Alias>app.example.local</Alias>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="crm_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
        <Context path="/" docBase="" debug="0" reloadable="true"/>
      </Host>

【问题讨论】:

  • 去掉正斜杠。
  • 试过了,还有../和/../。到目前为止什么都没有
  • 那么你有一个名为inc.header.jsp的文件吗?
  • 是的。抱歉,我的附加图片由于某种原因没有嵌入。在顶部附近,您可以单击并查看我的结构。
  • 好的。我正在做某事。当我将“安全”文件夹复制为“不安全”时,它可以工作。所以.....我的 AuthFilter 出了点问题。像 XSS 块什么的。现在我必须追逐它。

标签: java jsp tomcat


【解决方案1】:

您是说,如果您将 jsp 移动到安全文件夹中,所有请求都会失败。此请求将由您的过滤器过滤,如果不查看过滤器实现,答案将非常困难。

如果可以的话,请分享过滤器和监听器。

【讨论】:

  • 我已经分享了过滤器代码,它是web.xml中的声明。后台“登录”类只是对数据库进行身份验证,然后添加一些会话变量:IsAuthenticated、IsRemembered、IsLoggedIn(每个为真/假)。当我将 /secure/index.jsp 移动到 /index2.jsp 时,它会按预期显示。侦听器仅在启动时打开我的数据库连接。
  • BTW:过滤器注册了两次:通过注解和web.xml
  • 请求以 /secure/index.jsp 的形式出现,并被您的文件管理器拦截。如果用户已登录,过滤器链将处理请求,否则将发出重定向。没有更多的过滤器,所以这就是 jsp 处理器进来的地方。它试图在你的文件系统中查找 /secure/index.jsp。找到并转换为 servlet 后,将处理 include 指令。 /inc.header.jsp 将被处理并包含(如果存在)。如果您将其移动到安全文件夹并在包含指令中反映此更改,则它不再起作用。对吗?
  • 第一个请求时,jsp 将被转换为 servlet。所有进一步的请求都将由 servlet 处理,不再由 jsp 处理,直到您再次编辑 jsp。这同样适用于包含的 jsp。有没有试过清理tomcat的work文件夹下编译好的servlet?
  • 是的,我已经清理了工作目录,这是成功登录后的目标页面。从理论上讲,它可以容纳水。至于双重注册,我试过没有 web.xml 参考,但它不适用。 (最新的 Tomcat 9.0.12)。谢谢
【解决方案2】:

知道了。归结为我的 Tomcat 虚拟主机声明。我让我的 appBase 指向“每个应用程序的主文件夹”,这导致 Tomcat 认为子文件夹是更多应用程序。我已通过将 server.xml 条目更改为:

<Engine name="PROD" defaultHost="WWW">
  <Host name="WWW" appBase="webapps" unpackWARs="false" autoDeploy="true" reloadable="true">
    <Context name="www.example.com" path="" docBase="www.example.com" debug="0" reloadable="true"/>
    <Alias>example.com</Alias>
    <Alias>example.server</Alias>
    <Alias>example.local</Alias>
    <Alias>www.example.com</Alias>
    <Alias>www.example.server</Alias>
    <Alias>www.example.local</Alias>
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="www_access_log" suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  </Host>
  ... other hosts/subdomains
</Engine>

我的旧(错误)条目是:appBase="webapps/www.example.com"

【讨论】:

    猜你喜欢
    • 2015-03-27
    • 2018-07-11
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2019-04-17
    • 1970-01-01
    • 2014-03-09
    相关资源
    最近更新 更多