JSP / JasperException:找不到文件[/xyz.jsp]

时间:2018-10-23 05:34:25

标签: java jsp tomcat

我已经搜索过,但是却找不到自己的情况。

当我在Eclipse中运行项目时,它可以正常工作,但是当我(通过WAR)部署到生产服务器时,会得到“找不到JasperException文件”。仅对于不在根文件夹中的JSP会发生这种情况。我很沮丧本质上,我将/ secure /上下文用于我的安全过滤器。

FileStructure: 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成员加载在标题中

<%@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不适当地将我的“安全”文件夹解析为独立的Web应用程序。我在该系统上有多个虚拟主机,没有一个使用该概念,也没有一个子文件夹索引文件。正如我刚遇到一个将我的页眉/页脚文件移动到/ 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>

2 个答案:

答案 0 :(得分:0)

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

如果可以,请共享过滤器和侦听器。

答案 1 :(得分:0)

明白了。归结为我的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>

我以前的(WRONG)条目为:appBase =“ webapps / www.example.com”