JFinal中,所有请求统一通过JFinalFilter这个过滤器处理,当然我们也可以写自己的过滤器,但是必须放在 JFinalFilter之前,否则,有可能不会执行。这是因为,在JFinalFilter中,会判断 Handler是否执行完,执行完的话,会直接跳出过滤器,而不执行之后的过滤器。代码如下:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
request.setCharacterEncoding(encoding);
String target = request.getRequestURI();
if (contextPathLength != 0)
target = target.substring(contextPathLength);
boolean[] isHandled = {false};
try {
handler.handle(target, request, response, isHandled);
}
catch (Exception e) {
if (log.isErrorEnabled()) {
String qs = request.getQueryString();
log.error(qs == null ? target : target + "?" + qs, e);
}
}
if (isHandled[0] == false)
chain.doFilter(request, response);
}
其实JFinal中没有必要定义过滤器,可以使用JFinal中的Handler。
JFinal中的Handler使用了责任链模式,一个handler持有下一个handler,形成一个链条,链条的最后一个则是ActionHandler,用来处理 AOP、Action方法执行以及页面生成。
Handler 是一个抽象类,它包含一个属性 next(持有的下一个Handler),以及一个抽象方法handle, 我们自定义Handler可以通过实现这个方法,来做一些个性化处理,比如访问权限。
在过滤器中,我们可以通过
next.handle(target, request, response, isHandled);
来实现类似过滤器中
chain.doFilter(request, response);
的效果。