Java 如何实现虚拟筛选器以将文件从筛选中排除?
我正在尝试为除login.jsp之外的所有文件实现一个过滤器。我知道过滤器映射不能排除某些文件。我需要做的是创建另一个过滤器来映射login.jsp。如何创建另一个具有url模式/login.jsp的文件,并且之后不处理SessionFilter? 这是我为所有文件编写的会话筛选器代码的一部分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
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
,这样就不会调用其他筛选器。