我正在尝试为除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);
}
}
答案 0 :(得分:2)
您可以使用request.getServletPath()
检查所请求的路径是否在“排除列表”中。
如果您想要一个与Filter
分开的新SessionFilter
,您可以将特殊标志设置为请求属性(例如“loginPage”),该标志将由其他过滤器检查(如果您需要与Filter
分隔的新SessionFilter
或您无法调用chain.doFilter()
。
如果您要修改SessionFilter
,请不要重新发送到“login.jsp”
答案 1 :(得分:1)
您不需要新的过滤器。你可以在你自己的过滤器上查看它。
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路径,这可能不是维护和可移植性的好主意。