在springMVC和struts2中都具有拦截器,当然我的框架中也必不可少。
在web当中,拦截器是对调用的Controller起作用,它提供了一种机制可以使开发者可以定义在一个请求执行的前后执行的代码,也可以在一个请求执行前阻止其执行。
比如,访问一个URL,可以先定义一个拦截器判断用户有没有权限,有权限才让访问。
首先,我们写一个拦截器的接口
package handlerExecutionChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface IHandlerChain {
boolean preHandler(HttpServletRequest req,HttpServletResponse resp);
boolean postHandler(HttpServletRequest req,HttpServletResponse resp);
void afterCompletion(HttpServletRequest req,HttpServletResponse resp);
}
开发者可以在此接口上扩展自己想要实现的拦截器处理形式,下面是我实现的一个拦截器
package handlerExecutionChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//拦截器自然是使用责任链模式
public class HandlerInterceptor implements IHandlerChain {
private String interceptor;
//属性注入,在这里配置拦截器
public void setInterceptor(String interceptor) {
this.interceptor = interceptor;
}
public final void deal(HttpServletRequest req, HttpServletResponse resp){
boolean pre=preHandler(req,resp);
boolean post=postHandler(req,resp);
if(pre&&post){
deal(req,resp);
}
}
@Override
public boolean preHandler(HttpServletRequest req, HttpServletResponse resp) {
String path=req.getServletPath();
if(path==interceptor){
return true;
}
return false;
}
@Override
public boolean postHandler(HttpServletRequest req, HttpServletResponse resp) {
String path=req.getServletPath();
if(path==interceptor){
return true;
}
return false;
}
@Override
public void afterCompletion(HttpServletRequest req, HttpServletResponse resp) {
}
}
一个拦截器完成了,接下来需要做的是把每个拦截器都组合在一起形成一个拦截器链,当然这也是一种责任链模式
package handlerExecutionChain;
import java.util.LinkedList;
import java.util.List;
public class HandlerChain {
private HandlerInterceptor[] hiList;
private List<HandlerInterceptor> interceptors;
private static HandlerChain chain=new HandlerChain();
//单例模式
private HandlerChain(){
}
public static HandlerChain getInstance(){
return chain;
}
private void initChain() throws Exception{
if(interceptors==null){
interceptors=new LinkedList<HandlerInterceptor> ();
for(int i=0;i<hiList.length;i++){
interceptors.add(hiList[i]);
}
}else{
throw new Exception("there is alread an interceptorchain");
}
}
public List<HandlerInterceptor> getChain() throws Exception{
initChain();
return interceptors;
}
}