本文介紹了springmvc中的轉發重定向和攔截器的示例,分享給大家,具體如下:
可變參數在設計方法時,使用 數據類型...
來聲明參數類型,例如: public static void function(int... numbers)
在實現方法體時,可變參數是作為數組來處理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class test{ public static void main(string[] args){ system.out.println(test.sum( 1 , 2 , 3 )); system.out.println(test.sum( 1 , 2 , 3 , 4 , 54 )); } public static int sum( int ... numbers){ int sum= 0 ; for ( int i= 0 ;i<numbers.length;i++){ sum+=numbers[i]; } return sum; } } |
注意:每個方法中,最多只允許存在1個可變參數,并且,如果存在 可變參數 ,那么必須是最后一個參數
轉發和重定向
在控制器內部處理請求的方法中,默認返回字符串時的處理方式是 轉發 ,轉發的值是 view 組件的名稱,比如 return "login" ,實質上會根據視圖解析器( viewresolver )得到最終負責顯示的頁面,而通過 return redirect:路徑 這樣的語法表示重定向,在 redirect: 右側的內容是路徑,這個路徑通常使用相對的路徑,是以當前客戶端的地址欄中的路徑為標準進行參考,例如當前的地址為: http://localhost:8080/project/user/reg.do ,然后 return "redirect:login.do" ,則會重定向到 http://localhost:8080/project/user/login.do ,如果 return "redirect:/main/index.do" 或者 return "redirect:../main/index.do" ,則會重定向到 http://localhost:8080/project/main/index.do
forward:
默認的方式,但是也是可以使用 return "forward:login"
返回的一定是一個 view ,經過視圖解析器之后會轉發到指定的視圖
redirect:
重定向 : return "redirect:login.do"
返回的是一個controller方法的路徑,而不是一個view,這個不會經過視圖解析器,而是直接跳轉
實例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@requestmapping (value= "/handle_reg.do" , method=requestmethod.post) public string handlereg(user user,modelmap map){ try { userservice.reg(user); system.out.println( "注冊成功!" ); return "redirect:login.do" ; //重定向到login.do這個控制方法,login.do對應的就是轉發到login.jsp } catch (usernameconflictexception e) { system.out.println(e.getmessage()); map.put( "errormessage" , e.getmessage()); return "error" ; } } @requestmapping (value= "login.do" ) public string handlelogin(){ return "login" ; } |
攔截器
基本概念
- 攔截器( interceptor )是springmvc中的一個 組件 ,是運行在 dispatcherservlet 之后,運行在 controller 之前的
- 攔截器可以決定對某些符合條件的進行 攔截 或者 放行 ,所以,通常用于對一些具有相同運行條件的功能進行約束
使用攔截器
自定義攔截器類
創建一個攔截類( demointerceptor ),實現 handlerinterceptor 接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
public class demointerceptorimplements handlerinterceptor{ /** * 處理器執行之前調用 * @param request httpservletrequest對象,可以獲取請求參數等等 * @param response httpservletresponse對象 * @param handler 攔截器的controller對象 * @return 如果返回false,就會中斷處理流程,不會處理后續的攔截器和controller。如果返回true,則會執行后續的攔截器和處理器 */ public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception { system.out.println( "demointerceptor的prehandler執行" ); return true ; } /** * 處理器執行之后調用,跳轉到指定視圖之前調用 * @param request httpservletrequest對象 * @param response httpservletresponse對象 * @param handler 攔截器的controller對象 * @param modelandview modelandview對象,其中存放的是處理結果和視圖的信息 */ public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception { /** * 1. 可以自己設計邏輯,例如某些情況下返回false,返回true * 2. 返回true表示執行后續的處理器和攔截器,返回false會中斷處理流程 */ system.out.println( "handler:" +handler); system.out.println( "demointerceptor的posthandler執行" ); //設置視圖的名稱,那么執行完成之后就會條跳轉到index.jsp頁面 //modelandview.setviewname("index"); } /** * 請求處理完成之后調用 */ public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception { system.out.println( "demointerceptor的aftercompletion執行" ); } } |
在springmvc的配置文件中配置
- 配置攔截的路徑: <mvc:mapping path=""/> 可以使用通配符 * 比如: /** 匹配所有的路徑, /user/* 只能匹配 /user 的子路徑
- 配置不攔截的路徑 : <mvc:exclude-mapping path=""/> 可以配置 多個
- 配置攔截器類( bean ) : <bean class="">
配置
必須按照上面的順序配置,否則將會報錯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<!-- 配置攔截器,其中可以配置多個攔截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 配置攔截器的攔截路徑,攔截/user下的全部處理器方法映射 比如:http: //localhost:8080/springmvc/user/login.do這個請求就會被攔截 --> <mvc:mappingpath= "/user/*" /> <!-- 配置不被該攔截器攔截器的controller方法,這個是可選配置 比如:http: //localhost:8080/springmvc/user/index.do將不會被攔截器 --> <mvc:exclude-mappingpath= "/user/index.do" /> <mvc:exclude-mappingpath= "/user/login.do" /> <!-- 配置攔截器的bean,指定的是全類名 --> <beanclass= "cn.tedu.spring.interceptor.demointerceptor" ></bean> </mvc:interceptor> </mvc:interceptors> |
其中實現的方法
public boolean prehandle(httpservletrequest request,httpservletresponse response, object handler)
- 該方法在 controller 處理請求之前執行
- 如果返回的 false ,則會中斷處理流程,不會執行后續的攔截器和處理器,返回 true 會執行后續的攔截器和處理器
- 可以自行設計邏輯返回 false 或者 true
public void posthandle(httpservletrequest request,httpservletresponse response, object handler,modelandview modelandview)
- 處理器執行之后,視圖處理之前調用,此時可以通過對 modelandview 對數據和視圖進行處理
- 當然需要 prehandler 方法返回 true 才會執行
public void aftercompletion(httpservletrequest request,httpservletresponse response, object handler, exception ex)
- 所有的請求處理完畢之后調用,比如性能監控中,我們可以在此記錄結束時間和消耗時間,還可以進行一些資源處理
- 當然需要 prehandler 方法返回 true 才會執行
演示登錄檢查
- 登錄檢查: 當涉及到用戶信息的修改,查看什么的,必須要驗證是否登錄,因此需要設計攔截器驗證登錄
- 先設定登錄數據,即: 在 login.jsp 中添加登錄按鈕,登錄完成之后,需要自己定義一個標記存儲在 session 中,比如 用戶的id 或者 用戶的對象
- 我們使用用戶的 id 作為標記驗證是否已經的登錄,如果用戶登錄成功,會在 session 中添加一個 uid 的屬性
- 用戶退出登錄使用 session.invalidate(); 清除 session ,并且重定向到 登錄界面
自定義攔截器(logininterceptor)
具體流程在 prehandler 方法中寫的很清楚
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public class logininterceptorimplements handlerinterceptor{ /* * 在處理器執行之前調用(non-javadoc) * 1. 獲取session * 2. 讀取session中的uid的值 * 如果為null,表示沒有登錄,那么直接重定向到登錄界面,同時返回false,不需要執行后面的流程了 * 如果不為null,表示已經登錄了,那么直接返回true,繼續執行后面的攔截器或者處理器 */ public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception { httpsession session=request.getsession(); //獲取session object uid=session.getattribute( "uid" ); //讀取session中的對象 //如果uid存在,那么即可登錄完成 if (uid!= null ) { return true ; //返回true,登錄成功就需要執行后續的流程 } response.sendredirect(request.getcontextpath()+ "/user/login.do" ); //重定向到登錄界面 return false ; //返回false,后面的流程也不用執行了,直接中斷 } public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception { } public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception { } } |
springmvc中配置攔截器
由于這里只是跳轉到用戶中心需要驗證登錄,那么只是匹配了 user_center.do
1
2
3
4
5
6
7
|
<!-- 配置攔截器,其中可以配置多個攔截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mappingpath= "/user/user_center.do" /> <beanclass= "cn.tedu.spring.interceptor.logininterceptor" ></bean> </mvc:interceptor> </mvc:interceptors> |
多個攔截器的執行順序
根據在 springmvc 配置文件中配置的順序執行,即是在 <mvc:interceptors> 下配置的攔截器的順序,如果對同一個路徑進行了攔截器,那么先配置的先攔截
攔截器和過濾器的區別(主要的區別)
- 攔截器是springmvc中,僅僅當使用 springmvc 才可以使用攔截器,過濾器是 java ee 體系中的,無論使用哪種框架都可以使用過濾器
- 攔截器在 dispatcherservlet 之后,在處理器之前執行,過濾器在 dispatcherservlet 之前執行
- 過濾器會在所有的 servlet 之前執行(所有的請求都會執行),而攔截器會在springmvc中 dispatcherservlet 之后執行,所以過濾器在項目中可以過濾任何請求(只要是配置了對應的路徑),而攔截器只會在 dispatcherservlet 處理的請求的基礎之上進行攔截
總結
當多種請求都需要做相同或者極為相似的任務時,可以使用攔截器
開發好攔截器,那么需要在 springmvc 的配置文件中配置
在 <mvc:interceptors> 可以有如果若干個 <mvc:interceptor> ,即是配置若干個攔截器,配置的多個攔截器將會形成 攔截器鏈 ,如果配置多個攔截器對同一個路徑都會攔截,那么會按照配置的節點順序執行。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://chenjiabing666.github.io/2018/05/09/Springmvc中的轉發重定向和攔截器