使用Filter后,出现重定向循环问题,求高手帮忙看下
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response;
HttpSession session=req.getSession();
//判断用户是否登陆,如果没有登陆,就跳到login.jsp页面!!!过滤的时候就出现了重定向循环,我清了cookie,换了ie和chrome都是这个情况,求高手看看是程序哪错了
if(session.getAttribute("user")==null){
res.sendRedirect("login.jsp");
return;
}
// pass the request along the filter chain
chain.doFilter(request, response);
}
------解决思路----------------------
问题在于第一次登录进来时,你的用户信息还没有进session呢,就被filter给过滤回去了。
过滤器过滤的时候,要避开登录的url。
给其他的应用url进行过滤,登录的url就不要通过过滤器了否则就陷入现在这种死循环了。
------解决思路----------------------
参考这个
/**
* 处理字符集及用户登陆验证
* @author rick
*/
public class LesFilter implements Filter {
//字符集编码
private String encoding = "UTF-8";
/**
* 未登陆前过滤的路径地址
*/
private String[] urlPatterns = {
"/actions/*",
"/FCL/*",
"/vp/*",
"/vdm/*",
"/print/*",
"/system/*",
"/modules/*",
"/index.jsp"
};
public void init(FilterConfig filterConfig) throws ServletException {
encoding = filterConfig.getInitParameter("encoding");
}
public void doFilter(ServletRequest req, ServletResponse rep, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) rep;
HttpServletRequest request = (HttpServletRequest) req;
request.setCharacterEncoding(encoding);
//
String actions = ActionUtil.getString(request, "actions");
String location = request.getRequestURI().replace(request.getContextPath(), "");
boolean gotoAuth = false;
//
for (int i = 0; i
String urlPattern = urlPatterns[i];
urlPattern = urlPattern.replace("*", "[\\w\\d\\/\\.]+");
Pattern pattern = Pattern.compile(urlPattern);
Matcher matcher = pattern.matcher(location);
if(matcher.find()){
gotoAuth = true;
break;
}
}
if(gotoAuth && !"login".equals(actions)){
Object loginer = request.getSession().getAttribute("loginer");
response.setHeader("auth", loginer == null ? "failed" : "success");
response.setHeader("site", request.getContextPath());
if(loginer == null){
String path = request.getContextPath() + "/login.jsp";
response.sendRedirect(path);
}else{
filterChain.doFilter(request, response);
}
}else{
filterChain.doFilter(request, response);
}
}
public void destroy() {
}
}
------解决思路----------------------
if(session.getAttribute("user")==null && !rqeust.getRequestURI().contains("login.jsp")){
res.sendRedirect("login.jsp");
return;
}
------解决思路----------------------
其实是你自己忽略了登陆这个url。
这么说吧,因为的这个过滤器是过滤所有的请求吧,只有没有也就是session中没有username就跳到login页面。
而你跳到login页面的时候也是会发一个请求,而这个请求又被这个过滤器给拦截一遍,而此时显然是session中没有值的,所以又会跳到login,这样就一直循环了了,所以你要在配置这个过滤器的时候除掉登陆,等相关的url。