5

我试图制作一个过滤器来阻止未登录的用户访问某些页面。为此,我使用以下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) 我可以理解因为我正在控制台中打印该行。这是我在服务器中获得的输出 这是我在服务器中获得的输出

/dcrmaintenance.jsp

Hey i am in

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

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

4

4 回答 4

11

response.sendRedirect("/login.jsp");做完之后return;

于 2012-04-19T09:41:47.713 回答
3

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

if (requiresLogin)
  response.sendRedirect("/login.jsp");
else
  chain.doFilter(req,resp);
于 2012-04-19T09:41:39.277 回答
0
chain.doFilter(req, res);

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

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

简短的例子:

<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>
于 2012-04-19T09:48:45.613 回答
0

我认为您必须更改您的 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中定义你的安全约束,你必须在数据库中定义它;))))

<!--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>
于 2015-07-26T21:00:21.183 回答