package org.fielter.test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/**
* 过滤形成环路的fielter <p>
*
* @author yuezhen
*/
public class CircleFilter implements Filter {
private List<String> l =new ArrayList<String>();
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) {
try{
boolean circle=false;
HttpServletRequest req = (HttpServletRequest) request;
List<String> list =new ArrayList<String>();
// 从request中取出list
if(req.getAttribute("circle.finder.forward.list")!=null){
list=(List<String>)req.getAttribute("circle.finder.forward.list");
}else{
//list为null表明是初次的请求,获取原始的请求来源 ,并放入list
list.add((String)req.getAttribute("javax.servlet.forward.request_uri"));
}
// 如果原始请求地址和需要跳转的地址一致,抛出异常
if(list.contains(req.getRequestURI())){
circle=true;
}
// 将本次需要forward的路径放入list,并保存
list.add(req.getRequestURI());
req.setAttribute("circle.finder.forward.list", list);
// 用System.out来代替log
System.out.println("");
System.out.println("[info] ===========================================");
System.out.println("[info] "+list);
System.out.println("[info] ===========================================");
if(circle){
System.out.println("[error] find circle");
// 清空list
req.removeAttribute("circle.finder.forward.list");
l=list;
// 可以选择抛出异常,或者用其他的处理方式
throw new Exception();
}
filterChain.doFilter(request, response);
}catch(Exception e){
// 发现了重定向的死循环的后续处理
try {
// 页面显示发现死循环
response.getOutputStream().print("has circle,the cytle is : "+l.toString());
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
public void destroy() {
}
}