Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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,我正在尝试为除login.jsp之外的所有文件实现一个过滤器。我知道过滤器映射不能排除某些文件。我需要做的是创建另一个过滤器来映射login.jsp。如何创建另一个具有url模式/login.jsp的文件,并且之后不处理SessionFilter? 这是我为所有文件编写的会话筛选器代码的一部分 public class SessionFilter implements Filter{ RequestDispatcher rd = null; public void doFilte

我正在尝试为除login.jsp之外的所有文件实现一个过滤器。我知道过滤器映射不能排除某些文件。我需要做的是创建另一个过滤器来映射login.jsp。如何创建另一个具有url模式/login.jsp的文件,并且之后不处理SessionFilter? 这是我为所有文件编写的会话筛选器代码的一部分

public class SessionFilter implements Filter{ 
   RequestDispatcher rd = null; 

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) 
   throws IOException, ServletException{ 
      HttpServletRequest request = (HttpServletRequest)request; 
      HttpSession session = request.getSession(); 

   // New Session so forward to login.jsp 
   if (session.isNew()){ 
     rd = request.getRequestDispatcher("login.jsp"); 
     rd.forward(request, response); 
  } 

  // Not a new session so continue to the requested resource 
   else{ 
      filterChain.doFilter(request, response); 
  } 
} 

您可以使用
request.getServletPath()
检查请求的路径是否在“排除列表”中

如果您想要一个新的
过滤器
会话过滤器
中分离出来,您可以将一个特殊的标志设置为请求属性(例如“loginPage”),其他过滤器将对其进行检查(如果您想要一个新的
过滤器
会话过滤器
中分离出来),或者您可以不调用
链.doFilter()


如果要修改
SessionFilter
,只需不要重新修补到“login.jsp”

您可以使用
request.getServletPath()
检查请求的路径是否在“排除列表”中

如果您想要一个新的
过滤器
会话过滤器
中分离出来,您可以将一个特殊的标志设置为请求属性(例如“loginPage”),其他过滤器将对其进行检查(如果您想要一个新的
过滤器
会话过滤器
中分离出来),或者您可以不调用
链.doFilter()


如果您正在修改会话过滤器,只需不重新修补到“login.jsp”

您不需要新的过滤器。你可以在自己的过滤器上检查

if(request.getServletPath().equals("login.jsp") || !session.isNew()) { // or "/login.jsp", not sure about this
   filterChain.doFilter(request, response); 
} else { // session is new and it's not login.jsp
     rd = request.getRequestDispatcher("login.jsp"); 
     rd.forward(request, response);    
}

但我不喜欢这种方法。这似乎是在为servlet重写JAAS API。它还意味着对jsp路径进行硬编码,从维护和可移植性的角度来看,这可能不是一个好主意。

您不需要新的过滤器。你可以在自己的过滤器上检查

if(request.getServletPath().equals("login.jsp") || !session.isNew()) { // or "/login.jsp", not sure about this
   filterChain.doFilter(request, response); 
} else { // session is new and it's not login.jsp
     rd = request.getRequestDispatcher("login.jsp"); 
     rd.forward(request, response);    
}

但我不喜欢这种方法。这似乎是在为servlet重写JAAS API。这意味着要对jsp路径进行硬编码,从维护和可移植性的角度来看,这可能不是一个好主意。

谢谢您的回复。我不知道如何不调用chain.doFilter()。@JustToHelp,只是不使用此语句;)@JustToHelp:您已经在粘贴的代码(else块内的最后一行代码)上执行了此操作。如果存在无效会话,我将尝试将用户重定向到我的登录页面。如果(!session.isNew()){filterChain.doFilter(request,response);}else{rd=request.getRequestDispatcher(“login.jsp”);rd.forward(request,response);}问题是,如果我使用requestdispatcher,当用户访问login.jsp时会有一个无限循环。@JustToHelp,因此,如果您的登录页面是
request.getServletPath()
,请不要调用
filterChain.doFilter
,这样就不会调用其他筛选器。谢谢您的回复。我不知道如何不调用chain.doFilter()。@JustToHelp,只是不使用此语句;)@JustToHelp:您已经在粘贴的代码(else块内的最后一行代码)上执行了此操作。如果存在无效会话,我将尝试将用户重定向到我的登录页面。如果(!session.isNew()){filterChain.doFilter(request,response);}else{rd=request.getRequestDispatcher(“login.jsp”);rd.forward(request,response);}问题是,如果我使用requestdispatcher,当用户访问login.jsp时会有一个无限循环。@JustToHelp,因此,如果
request.getServletPath()
是您的登录页面,不要调用
filterChain.doFilter
,这样就不会调用其他筛选器。