在我的Tomcat 7网络应用程序中,我有一个私有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中的页面提供服务?
答案 0 :(得分:1)
这似乎是tomcat https://issues.apache.org/bugzilla/show_bug.cgi?id=50026
中的一个错误正如@ 1&#34;过滤器可以完成这项工作,以下是它的外观:
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 :(得分:0)
我通过使用Filter而不是Servlet解决了这个问题。不过,我仍然对错误发生的原因感到好奇。