Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java筛选器将未登录的用户重定向到登录页面_Java_Servlets_Servlet Filters - Fatal编程技术网

Java筛选器将未登录的用户重定向到登录页面

Java筛选器将未登录的用户重定向到登录页面,java,servlets,servlet-filters,Java,Servlets,Servlet Filters,我试图创建一个过滤器来阻止未登录的用户访问某些页面 HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String url = request.getRequestURI(); boolean allowedRequest = false; System.out.println(url); if(urlList.con

我试图创建一个过滤器来阻止未登录的用户访问某些页面

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列表

现在发生了一件非常奇怪的蠢事。假设我有两个页面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,但我无法理解为什么即使在进入循环后也没有发生重定向。如果有人能指出我在哪里犯了错误,我将不胜感激。

我相信您也应该这样做调用sendRedirect或doFilter。例如

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

response.sendRedirect(“/login.jsp”)之后执行<代码>返回

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>

禁区
*
经授权的

我认为您必须更改web.xml。。。 您必须将受限制的资源放入相应的文件夹。通过这种方式,Filter Servlet将限制在“受限”文件夹中分配的文件。((我认为使用Filter Servlet的原因是编写自己的授权系统。-通过这种方式,您不必在web.xml中定义您的安全约束,您必须在数据库中定义它;))


授权过滤器
示例.AuthorizationFilter
此筛选器授权用户访问应用程序
基于请求URI的组件。
错误页
../../login.html
授权过滤器
/受限的/*

我没有任何其他筛选器。其他解决方案有效。但我将检查如何使用安全约束!谢谢
<!--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>