在Filter重定向到login.jsp之后,不会调用正确的servlet

时间:2010-05-01 19:26:50

标签: java jsp tomcat servlets servlet-filters

我的简单项目结构显示在this link中。我正在使用Eclipse和Tomcat 6。

login.jsp将其表单提交给login_servletlogin_servlet设置会话变量,然后重定向到home.jsphome.jsp文件包含指向名为/sam的目录下的4个JSP文件的链接。在web.xml我已将url-pattern /sam/*作为LogFiler过滤器。

LogFilter只读取会话变量,如果有效则会doChain(request,resposne),否则会重定向到/login.jsp

RequestDispatcher rd = request.getRequestDispatcher("/login.jsp");
rd.forward(request,response);

基本上我不希望任何人直接访问/sam目录中的文件。现在让我们说,我尝试直接访问/sam目录中的文件,过滤器启动并重定向到login.jsp,甚至broswers内容都是login.jsp的内容,但是url在浏览器中不会改变。当我输入详细信息并按提交时,不是将数据发送到login_servlet,而是将其发送到sam/login_servlet,然后tomcat告诉我这里没有这样的servlet!显然没有。我怀疑的是,为什么它发送sam/login_servlet而不是/login_servlet,这通常是我自己开始运行login.jsp时的行为。

还有一种方法,是否有办法将servlet应用于.jsp内的/sam文件中的url-pattern个文件?我尝试过/sam/*.jsp url-pattern,但Tomcat拒绝接受{{1}}。

1 个答案:

答案 0 :(得分:4)

您实际上转发请求,而不是重定向。您通常使用RequestDispatcher#forward()将请求和响应转发到URL无法直接访问的资源,因此您希望从浏览器地址栏中隐藏它们的位置。您通常使用HttpServletResponse#sendRedirect()将响应重定向到请求,从而反映在浏览器的地址栏中。

替换doFilter()中的转发,如下所示:

HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.sendRedirect("/login.jsp");

关于你的第二个问题,不幸的是,这是不可能的。您可以提供更具体和兼容的url-pattern /sam/pages/*,也可以让servlet检查请求URL。