版权声明:@渔闻520 https://blog.csdn.net/weixin_41060905/article/details/82764075
在做登录防止用户没有登录而访问其他web资源的时候,写了一个过滤器,却在浏览器无法打开,出现重定向次数过多 尝试清除cookie,试过没有用。
出现这个问题的原因是因为在过滤器中出现了无限循环重定向。
出现无限循环重定向的原因分析如下:
先上代码:
package net.book.util;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: JiangYi
* @Date: 2018/9/18 19:46
* @Description:用来统一设置表单字符集以便对所有请求统一处理表单参数的中文问题;二;不允许
* @Description:未经登录的用户访问站点中的其他任何资源,原理是通过检查session对象中是否保存有用户名来实现
*/
@WebFilter(filterName = "CharacterEncodingFilter",urlPatterns = "/*")
public class CharacterEncodingFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//chain.doFilter(req, resp);
HttpServletResponse response = (HttpServletResponse) resp;
HttpServletRequest request = (HttpServletRequest) req;
request.setCharacterEncoding("utf-8");
//获得基准地址
String basepath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";
//获得访问资源的url
String url = request.getRequestURL().toString();
//获得用户名
String userName = (String) request.getSession().getAttribute("userName");
if(userName!=null||url.equals(basepath+"index.html")){
chain.doFilter(req,resp);
}
else{
//未经登录的将强制转到登录界面
response.sendRedirect("/bookstory/index.html");
}
}
public void init(FilterConfig config) throws ServletException {
}
}
首先要了解doFilter(resquest,response)的意思。
其在有下一个过滤器的时候,就会执行下一个过滤器,如果没有则跳转到相关的页面。
在刚开始访问时,就是没有登录,此时会跳转到指定的页面,而还是没有登录..........,就这样,无限跳转,就在浏览器访问的时候的到上面的结果了。
解决的方法就是把chain.doFilter(request,response)方法放在开头。
原因尚不清除。
另外,如果用
/*if(url.endsWith("index.html")){ chain.doFilter(req,resp); }*/
来过滤,则验证码不能正确显示,原因也不清楚。