今天作一個過濾器,碰上頁面重定向循環的狀況:html
瀏覽器的訪問路徑是: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.htmlsjava
過濾器的類以下:web
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 @Override 28 public void init(FilterConfig filterConfig) throws ServletException { 29 // TODO Auto-generated method stub 30 31 } 32 33 34 @Override 35 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 // 得到用戶請求的URI 42 String path = servletRequest.getRequestURI(); 43 44 // 從session裏取用戶的登錄ID 45 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 @Override 65 public void destroy() { 66 // TODO Auto-generated method stub 67 68 } 69 70 }
web.xml中的配置以下:spring
1 <!-- 配置了springmvc攔截的url爲以.hmls結尾的請求 --> 2 <servlet-mapping> 3 <servlet-name>rest</servlet-name> 4 <url-pattern>*.htmls</url-pattern> 5 </servlet-mapping> 6 7 <filter-mapping> 8 <filter-name>openSessionInViewFilter</filter-name> 9 <url-pattern>/*</url-pattern> 10 </filter-mapping>
錯誤緣由:瀏覽器
其實很簡單,就是過濾器類中的這一段中路徑給的有問題:session
1 if (user == null) { 2 // 跳轉到登錄頁面 3 servletResponse.sendRedirect("login/login1.htmls"); 4 } else { 5 // 已經登錄,繼續這次請求 6 chain.doFilter(request, response); 7 }
修改方式:mvc
咱們應該把路徑給成這樣就能夠了:app
1 if (user == null) { 2 // 跳轉到登錄頁面 3 servletResponse.sendRedirect("/biologyInfo/login/login1.htmls"); 4 } else { 5 // 已經登錄,繼續這次請求 6 chain.doFilter(request, response); 7 }
補充:ide
解釋:url
其實修改的點就是: /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。
這就形成了頁面重定向循環的問題。