首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义servlet在Tomcat 6上提供404,在7上工作良好。

自定义servlet在Tomcat 6上提供404,在7上工作良好。
EN

Stack Overflow用户
提问于 2014-04-14 02:24:08
回答 2查看 301关注 0票数 1

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

代码语言:javascript
复制
@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的主机上。我删除了Tomcat 6中不支持的@WebServlet注释,将以下内容添加到我的应用程序的WEB-INF/web.xml中,并将servlet规范的级别从3.0降至2.5:

代码语言:javascript
复制
<?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中的页面提供服务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-19 09:48:10

它似乎是tomcat bug.cgi?id=50026中的一个bug。

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

代码语言:javascript
复制
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); 
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2014-04-15 05:02:39

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23050995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档