我的简单项目结构显示在this link中。我正在使用Eclipse和Tomcat 6。
有login.jsp
将其表单提交给login_servlet
。 login_servlet
设置会话变量,然后重定向到home.jsp
。 home.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}}。
答案 0 :(得分:4)
您实际上转发请求,而不是重定向。您通常使用RequestDispatcher#forward()
将请求和响应转发到URL无法直接访问的资源,因此您希望从浏览器地址栏中隐藏它们的位置。您通常使用HttpServletResponse#sendRedirect()
将响应重定向到新请求,从而反映在浏览器的地址栏中。
替换doFilter()
中的转发,如下所示:
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.sendRedirect("/login.jsp");
关于你的第二个问题,不幸的是,这是不可能的。您可以提供更具体和兼容的url-pattern
/sam/pages/*
,也可以让servlet检查请求URL。