Javafilter用于重定向未登录到登录页面的用户

我试图制作一个filter来阻止未登录的用户访问某些页面。为此我使用以下doFilter方法创建了一个filter类

 HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String url = request.getRequestURI(); boolean allowedRequest = false; System.out.println(url); if(urlList.contains(url)) { allowedRequest = true; System.out.println("in list"); } if (!allowedRequest) { Object o = request.getSession().getAttribute("UserInfo"); if (null == o) { System.out.println("Hey i am in"); response.sendRedirect("/login.jsp"); } } chain.doFilter(req, res); } // end of doFilter 

为了允许不需要用户登录的页面我在init()中创建了一个arraylist url-list

现在发生了一件非常奇怪的蠢事。 假设我有两页home.jsp和dcr.jsp。 当我尝试访问home.jsp而没有登录时,我成功地重定向到login.jsp,但是当我试图访问dcr.jsp时它没有重定向,虽然它进入循环如果(null == o)我能理解因为我在控制台中打印该行.THis是我在服务器中获得的输出这是我在服务器中获得的输出

 /dcrmaintenance.jsp Hey i am in 

这告诉我null == o是真的。

页面dcr.jsp访问一个会话对象,由于用户没有登录,它正在按预期获得java.lang.NullPointerException但我无法理解为什么即使进入循环后重定向也没有发生。如果有人可以在哪里我犯了一个错误,我将不胜感激。

response.sendRedirect("/login.jsp"); return;

我相信你应该调用sendRedirect或doFilter。 例如

 if (requiresLogin) response.sendRedirect("/login.jsp"); else chain.doFilter(req,resp); 
 chain.doFilter(req, res); 

您的应用程序中还运行了哪些其他filter 您发送重定向,但继续使用filter链。 我猜另一个filter正在再次修改响应。 如果您使用filter,只需在重定向后返回。

您可以在Java WebApp中定义安全约束,而不是filter。 看看安全约束

简短的例子:

   Restricted Area *   Authorized   

我认为你必须改变你的web.xml …你必须将你的受限资源放到适当的文件夹中。 这样,Filter Servlet将限制在“restricted”文件夹中分配的文件。( http://www.developer.com/security/article.php/3467801/Securing-J2EE-Applications-with-a-Servlet-Filter.htm )(我认为使用Filter Servlet的原因是编写自己的授权系统。 – 这样你就不必在web.xml中定义安全约束,你必须在数据库中定义它;))))

   AuthorizationFilter examples.AuthorizationFilter This Filter authorizes user access to application components based upon request URI.  error_page ../../login.html    AuthorizationFilter /restricted/*