我正在尝试为除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);
}
} 发布于 2010-10-11 15:22:20
您可以使用request.getServletPath()检查请求的路径是否在您的“排除列表”中。
如果你想从SessionFilter中分离出一个新的Filter,你可以设置一个特殊的标志作为请求属性(比如"loginPage"),它将被其他过滤器检查(如果你想要一个新的Filter从SessionFilter中分离出来),或者你可以干脆不调用chain.doFilter()。
如果您正在修改SessionFilter,只要不重新调度到"login.jsp“即可。
发布于 2010-10-11 15:26:18
您不需要新的过滤器。你可以在你自己的过滤器上检查它。
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);
}但我不喜欢这种方法。这看起来像是重写了servlets的JAAS API。而且这意味着对jsp路径进行硬编码,这在维护和可移植性的顺序上可能不是一个好主意。
https://stackoverflow.com/questions/3904193
复制相似问题