mint mvc的拦截器是借用了struts的设计,但是和struts的拦截器有较大的区别。先通过一张图直观的了解-下拦截器在mint mvc中所处的位置和作用:
上图清楚的显示,mint mvc对请求静态资源的请求是不做拦截的。拦截器的执行时间在前端控制器之后和action方法之前,这个特点使它在一些情景下很好用,比如全局的权限检查。
为了方便进一步说明拦截器的用法,下面先上一个简单拦截器的代码:
@InterceptorOrder(0)
@InterceptorMapping(urls={"/*", "/"})
public class LoginInterceptor extends Interceptor{
public void intercept(ActionContext ctx, InterceptorChain chain) throws Exception {
HttpServletRequest request = ctx.getHttpServletRequest();
··· ···
chain.doInterceptor(ctx);
}
}
拦截器的配置
Interceptor有两个注解用以配置。分别是InterceptorOrder,InterceptorMapping。
- InterceptorOrder指定拦截器在拦截器链中顺序,InterceptorOrder的配置数值越小,拦截器在拦截器链中的位置越高前,也越先被调用。
- InterceptorMapping配置拦截器对哪些请求起作用,有urls属性,只有两种合法值:精确匹配和通配符匹配。精确匹配形如:"/xyz"或"/xyz/",通配符匹配形如:"/xyz/*"。
拦截器的定义和用法
一个拦截器必须要继承Interceptor抽象类,并且实现interceptor抽象方法。
interceptor抽象方法有两个参数ActionContext 和 InterceptorChain。
ActionContent封装了请求的上下文和mint mvc的启动上下文(在web.xml中配置的参数)。最常用的比如HttpServletRequest和HttpServletResponse对象。
InterceptorChain是拦截器链(栈)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。InterceptorChain有一个公开的方法:doInterceptor(),唯一的参数是ActionContent,此方法允许你自行决定,是否执行拦截器链中剩下的拦截器。如果doInterceptor方法没有被执行,当前请求将直接返回,拦截器链中剩下的未被执行的拦截器和当前请求的action将不会得到执行。
拦截器的使用示例
拦截器顾名思义就是做拦截的,它拦截的是请求。请求被拦截下来之后,根据具体的规则对之进行盘查,再根据盘查结果做出进一步动作。
比如下面这个LoginInterceptor拦截器,它拦截url为“/test/login”请求,做了一件很简单的事情:把一个User对象放到的request里。
@InterceptorOrder(0)
@InterceptorMapping(urls={"/test/login"})
public class LoginInterceptor extends Interceptor{
public void intercept(ActionContext ctx, InterceptorChain chain) throws Exception {
HttpServletRequest request = ctx.getHttpServletRequest();
User user = new User();
user.setUsername("琼羽");
user.setPassword("somebody");
request.setAttribute("user", user);
chain.doInterceptor(ctx);
}
}
结合“mint mvc的参数”博文可知,mint mvc可以将这个User对象自动取出来传递到你定义的action里,只要你的action定义了类型为:User, 名字为:user的参数。比如这样:
@Mapping(urls="/login")
public String login(User user){
return "账户:"+user.getUsername()+"<br/>"+
"密码:"+user.getPassword()+"<br/>";
}
像OSC这种自动登录功能也可以这样做,在拦截器里获取到加密的cookie,然后解密出用户的信息进行登录。
期待你喜欢,期待你玩出更多花样。
本demo下载地址:http://git.oschina.net/895925636/mintdemo/tree/master
项目地址:http://git.oschina.net/895925636/mint-mvc
收录地址:http://www.oschina.net/p/mint-mvc
博客地址:http://www.wemakers.net/home/blog?cate=1001
(完)