【Filter 頁面重定向循環】寫一個過濾器形成的頁面重定向循環的問題

今天作一個過濾器,碰上頁面重定向循環的狀況: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 }
View Code

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>
View Code

 

錯誤緣由:瀏覽器

其實很簡單,就是過濾器類中的這一段中路徑給的有問題:session

1  if (user == null) {
2             // 跳轉到登錄頁面
3             servletResponse.sendRedirect("login/login1.htmls");
4         } else {
5             // 已經登錄,繼續這次請求
6             chain.doFilter(request, response);
7         }
View Code

 

修改方式:mvc

咱們應該把路徑給成這樣就能夠了:app

1 if (user == null) {
2             // 跳轉到登錄頁面
3             servletResponse.sendRedirect("/biologyInfo/login/login1.htmls");
4         } else {
5             // 已經登錄,繼續這次請求
6             chain.doFilter(request, response);
7         }
View Code

 

補充:ide

解釋:url

其實修改的點就是: /login/login1.htmls

這個login前面加上/就表示是絕對路徑了。而寫成這樣:login/login1.htmls,就是相對路徑。

相對路徑就會在每一次重定向的時候,在原有的基礎上再去增長:

 

看一看

Controller的代碼以下:

 

1 @Controller()
2 @RequestMapping("login")
3 public class LoginController {
View Code

而這個controller就死相對路徑的原有基礎:

就是LoginController的路徑就是http://192.168.16.104:8080/biologyInfo/login/,

因此,若是寫的是相對路徑,每次都會在這個基礎上加上login/login1.htmls。

這就形成了頁面重定向循環的問題。

相關文章
相關標籤/搜索