日期:2014-05-17  浏览次数:20662 次

filter的执行顺序到底是咋走的??

public class LoginFilter implements Filter {
private String sessionOut;

public void destroy() {

}

public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOExceptionServletException {
HttpServletRequest request = (HttpServletRequest) arg0;
HttpServletResponse response = (HttpServletResponse) arg1;
HttpSession session = request.getSession();
User user = (User) session.getAttribute(Constants.USER_CURRENT_SESSION);
if (user == null) {
response.sendRedirect(request.getContextPath() + "/" + sessionOut);
return;
} else {// 对URL进行过滤
String url = RequestUtil.getRealUrl(request);
// 当前角色具有的 菜单
List<String> roleUrlList = RoleCacheDao.roleMenuUrlCache.get(user
.getRoleId());
// 因为默认角色具有最高权限 所以取默认角色的权限 认定为 系统所有菜单
List<String> adminUrlList = RoleCacheDao.roleMenuUrlCache
.get(CodeHandler.DEFAULT_ID);
// 如果在表中定义了 那么该菜单才需要过滤
if (adminUrlList.contains(url)) {
// 判断 当前角色是否具有此菜单
if (!roleUrlList.contains(url)) {
response.sendRedirect(request.getContextPath()
+ "/Insufficient.jsp");
return;
}
}

}
arg2.doFilter(arg0, arg1);//程序到这个地方咋走??
}

public void init(FilterConfig arg0) throws ServletException {
sessionOut = arg0.getInitParameter("sessionOut");
}

}
对这个过滤器执行顺序不是很清楚,我从登陆开始看,到这里(如上)不知道该咋看了,求帮忙~~!谢谢。
filter?doFilter

------解决方案--------------------
arg2.doFilter(arg0, arg1);//程序到这个地方咋走??
并不是程序到这里要怎么走,arg2是个FilterChain,调用
它的doFilter(ServletRequest request, ServletResponse response,FilterChain chain)方法 实现过滤功能,该方法就是对每个请求及响应增加的额外处理,即对所有的请求都执行doFilter(request,reponse)方法,当Filter 对请求过滤后,依然将请求发送到目的地址。
去网上搜下过滤器吧,有详细的说明和例子。
------解决方案--------------------
arg2.doFilter(arg0, arg1);//程序到这个地方咋走??

执行完会调用web.xml中配置的LoginFilter过滤器的下一个过滤器,
如果LoginFilter为最后一个,然后才会调到你请求的servlet或者action