Skip to content

etmvc的过滤器基础

shuzheng edited this page Aug 13, 2015 · 1 revision

struts2有拦截器,非常强大,spring mvc也有拦截器机制,但没有环绕的拦截处理机制。

etmvc也有过滤器,etmvc的过滤器类似于ROR,分为前置过滤器,后置过滤器和环绕过滤器。过滤器能够处理所有像安全、日志等的横切关注点。

我们先来看看应用得最多的前置过滤器,前置过滤器是控制器类中的一个方法,方法要求返回一个boolean类型,如果返回false,将停止后续的所有操作,否则继续后面的操作。来举个用户登录认证的例子,要求用户必须通过登录才能访问系统,使用前置过滤器是非常合适的,比如jpetstore中访问订单时要求用户必须登录后才能访问,否则重定向到登录页面让用户登录:

@BeforeFilter(execute="auth")
public class OrderController extends ApplicationController{
    protected boolean auth() throws Exception{
        if (session.getAttribute("sessionAccount") == null){
            String url = request.getServletPath();
            String query = request.getQueryString();
            if (query != null){
                url += "?" + query;
            }
            redirect("account/signon?signonForwardAction=" + url);
            return false;
        }
        return true;
    }
}

我们通过在控制器上使用@BeforeFilter注解增加了一个前置过滤器,过滤器将执行auth方法,检查用户是否登录,是否能够合法访问订单。

如果想对所有的控制器加上过滤器,则无须在每个控制器类上加上注解,只须在控制器基类ApplicationController中加注解就好。也就是说,过滤器具有继承特性。

过滤器可以有only或except选项,以确定对那些Action方法有效,比如:

@BeforeFilters({
    @BeforeFilter(execute="checkAdminPrivilege",except={"showImage","download","addComment"}),
    @BeforeFilter(execute="checkUserPrivilege",only={"addComment"})
})
public class ArticleController extends ApplicationController{
    /**
     * 显示文章附件图片
     */
    public View showImage(int id) throws Exception{
    }

    /**
     * 下载文章附件
     */
    public View download(int id) throws Exception{
    }

    /**
     * 增加评论
     */
    public void addComment(int articleId, String content) throws Exception{
    }
    
    public void create(){
    }

    public void edit(int id) throws Exception{
    }

    public void save(String title, String content, MultipartFile file, String source, Integer flag) throws Exception{
    }

    public void update(int id, String title, String content, MultipartFile file, String source, Integer flag) throws Exception{
    }

    public void destroy(int id) throws Exception{
    }

    public void destroyAttach(int id) throws Exception{
    }
}

在文章管理的控制器中加入了二个前置过滤器,以检查管理员和普通用户的操作权限:

  • 管理员权限检查除"showImage","download","addComment"方法外将全部检查
  • 普通用户权限检查只对"addComment"方法进行检查 可以对控制器加上多个过滤器,形成一个过滤器链。

前面介绍的是前置过滤器,这是用得最多的一种,后置过滤器用法相同。

关于环绕过滤器我们将分专门章节进行介绍。

Clone this wiki locally