繁体   English   中英

自定义servlet在Tomcat 6上提供404,在7上运行良好

[英]Custom servlet gives 404 on Tomcat 6, works fine on 7

在Tomcat 7 Web应用程序中,我有一个用于处理私人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时,它也可以正常工作,但是它允许任何人访问私有PDF。

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

这似乎是tomcat中的错误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); 
        }
    }

我通过使用过滤器而不是Servlet解决了这个问题。 我仍然很好奇为什么会发生错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM