gpt4 book ai didi

java - 自定义 servlet 在 Tomcat 6 上给出 404,在 7 上工作正常

转载 作者:行者123 更新时间:2023-11-28 22:20:24 25 4
gpt4 key购买 nike

在我的 Tomcat 7 网络应用程序中,我有一个用于私有(private) PDF 文件的 servlet:如果未登录,则将用户转发到登录页面;否则,使用默认的 servlet 来显示页面。

@WebServlet(name="pdfServlet",urlPatterns={"/pdf/*"})
public class PDFServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (!isLoggedIn(request, response)) {
getServletContext().getRequestDispatcher("/login.jsp").forward(request, response);
} else {
getServletContext().getNamedDispatcher("default").forward(request, response);
}
}
}

最近,我不得不将网站转移到另一个使用 Tomcat 6 的主机。我删除了 @WebServlet 注释,Tomcat 6 不支持该注释,而是将以下内容添加到我的应用程序的 WEB-INF/web.xml,以及将 servlet 规范从 3.0 降级到 2.5:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
[...]
<servlet>
<servlet-name>pdfServlet</servlet-name>
<servlet-class>com.myapp.PDFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pdfServlet</servlet-name>
<url-pattern>/pdf/*</url-pattern>
</servlet-mapping>
</web-app>

但是,尽管在未登录时转发仍然有效,但如果用户已登录,当默认 servlet 尝试提供页面时,我会收到 404 错误。它在我的站点的 Tomcat 7 版本上仍然可以正常工作,即使对代码进行了修改以使其向后兼容;当删除 PDF servlet 时它也能正常工作,但随后它允许任何人访问私有(private) PDF。

为什么默认的 servlet 不能正确地只在 Tomcat 6 中提供页面?

最佳答案

好像是tomcat的bug https://issues.apache.org/bugzilla/show_bug.cgi?id=50026

正如@1 所建议的那样,过滤器可以完成这项工作,它应该是这样的:

public class SampleFilter implements Filter {

FilterConfig config; //setter and getters ommited

@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.config=filterConfig;
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;

if (!isLoggedIn(request, response)) {
getFilterConfig().getServletContext().getRequestDispatcher("/login.jsp").forward(request, response);
} else {
chain.doFilter(request, response);
}
}

关于java - 自定义 servlet 在 Tomcat 6 上给出 404,在 7 上工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23050995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com