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



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

当我在 Eclipse 中运行我的项目时,它工作正常,但是当我(通过 WAR(部署到我的生产服务器时,我得到 JasperException 文件未找到。这仅适用于不在根文件夹中的 JSP。我被难住了。从本质上讲,我正在为我的安全过滤器使用/secure/上下文。

文件结构: Eclipse 中的文件结构

网站.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 非常简单,我认为它没有任何问题。

身份验证过滤器.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 不恰当地将我的"安全"文件夹解析为独立的网络应用程序。我在这个系统上有多个虚拟主机,没有一个碰巧使用这个概念,也没有子文件夹索引文件。由于我刚刚收到将页眉/页脚文件移动到/secure/的新错误,我现在得到一个"绝对 uri:[http://java.sun.com/jsp/jstl/core] 无法在 web 或与此应用程序部署的 jar 文件中解析.xml"....因此,我认为Tomcat认为我的/secure/是一个独立的应用程序。

服务器.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>

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

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

明白了。 归结为我的Tomcat虚拟主机声明。我让我的应用程序库指向"每个应用程序的主文件夹",这导致Tomcat认为子文件夹是更多的应用程序。我已经通过将我的服务器.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">

最新更新