Java过滤器用于重定向未登录到登录页面的用户

时间:2012-04-19 09:27:39

标签: java servlets servlet-filters

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

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时它没有被重定向,尽管它进入循环if(null == o)我能理解因为我在控制台中打印该行.THis是我在服务器中获得的输出 这是我在服务器中获得的输出

/dcrmaintenance.jsp

Hey i am in

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

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

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

我相信你应该调用sendRedirect或doFilter。 E.g。

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

答案 2 :(得分:0)

chain.doFilter(req, res);

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

您可以在Java WebApp中定义安全约束,而不是过滤器。查看安全约束

简短的例子:

<security-constraint>
  <web-resource-collection>
     <web-resource-name>Restricted Area</web-resource-name>
     <url-pattern>*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
     <role-name>Authorized</role-name>
  </auth-constraint>
</security-constraint>

答案 3 :(得分:0)

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

<!--Servlet Filter that handles site authorization.-->
<filter>
     <filter-name>AuthorizationFilter</filter-name>
     <filter-class>examples.AuthorizationFilter</filter-class>
     <description>This Filter authorizes user access to application
                  components based upon request URI.</description>
     <init-param>
        <param-name>error_page</param-name>
        <param-value>../../login.html</param-value>
     </init-param>
</filter>

<filter-mapping>
     <filter-name>AuthorizationFilter</filter-name>
     <url-pattern>/restricted/*</url-pattern>
</filter-mapping>