今天做一个过滤器,碰上页面重定向循环的情况:
浏览器的访问路径是:http://192.168.16.104:8080/biologyInfo/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login/login1.htmls
过滤器的类如下:
1 package com.agen.util; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest;10 import javax.servlet.ServletResponse;11 import javax.servlet.http.HttpServletRequest;12 import javax.servlet.http.HttpServletResponse;13 import javax.servlet.http.HttpSession;14 15 import org.springframework.util.Assert;16 import org.springframework.util.StringUtils;17 18 import com.agen.entity.User;19 20 /**21 * 首先写一个登录权限过滤类--LoginFilter类实现Filter接口22 * @author 申旭栋23 *下面这三个方法是必须要实现的24 */25 public class LoginFilter implements Filter {26 27 @Override28 public void init(FilterConfig filterConfig) throws ServletException {29 // TODO Auto-generated method stub30 31 }32 33 34 @Override35 public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {36 // 获得在下面代码中要用的request,response,session对象37 HttpServletRequest servletRequest = (HttpServletRequest) request;38 HttpServletResponse servletResponse = (HttpServletResponse) response;39 HttpSession session = servletRequest.getSession();40 41 // 获得用户请求的URI42 String path = servletRequest.getRequestURI();43 44 // 从session里取用户的登陆ID45 User user = (User) session.getAttribute("user");46 47 // 登陆页面无需过滤48 if("/biologyInfo/".equals(path) || "/biologyInfo/login/login1.htmls".equals(path)) {49 chain.doFilter(servletRequest, servletResponse);50 return;51 }52 53 // 判断如果没有取到员工信息,就跳转到登陆页面 StringUtils.isEmpty(username)等价于username == null || "".equals(username)54 if (user == null) {55 // 跳转到登陆页面56 servletResponse.sendRedirect("login/login1.htmls");57 } else {58 // 已经登陆,继续此次请求59 chain.doFilter(request, response);60 }61 62 }63 64 @Override65 public void destroy() {66 // TODO Auto-generated method stub67 68 }69 70 }
web.xml中的配置如下:
1 23 6 7rest 4*.htmls 58 openSessionInViewFilter 9/* 10
错误原因:
其实很简单,就是过滤器类中的这一段中路径给的有问题:
1 if (user == null) {2 // 跳转到登陆页面3 servletResponse.sendRedirect("login/login1.htmls");4 } else {5 // 已经登陆,继续此次请求6 chain.doFilter(request, response);7 }
修改方式:
我们应该把路径给成这样就可以了:
1 if (user == null) {2 // 跳转到登陆页面3 servletResponse.sendRedirect("/biologyInfo/login/login1.htmls");4 } else {5 // 已经登陆,继续此次请求6 chain.doFilter(request, response);7 }
补充:
解释:
其实修改的点就是: /login/login1.htmls
这个login前面加上/就表示是绝对路径了。而写成这样:login/login1.htmls,就是相对路径。
相对路径就会在每一次重定向的时候,在原有的基础上再去增加:
看一看
Controller的代码如下:
1 @Controller()2 @RequestMapping("login")3 public class LoginController {
而这个controller就死相对路径的原有基础:
就是LoginController的路径就是http://192.168.16.104:8080/biologyInfo/login/,
所以,如果写的是相对路径,每次都会在这个基础上加上login/login1.htmls。
这就造成了页面重定向循环的问题。