最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例

 更新時間:2018年05月09日 13:43:42   作者:Chenjiabing  
本篇文章主要介紹了Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

本文介紹了Springmvc中的轉(zhuǎn)發(fā)重定向和攔截器的示例,分享給大家,具體如下:

可變參數(shù)在設(shè)計方法時,使用 數(shù)據(jù)類型... 來聲明參數(shù)類型,例如: public static void function(int... numbers)

在實現(xiàn)方法體時,可變參數(shù)是作為數(shù)組來處理

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個可變參數(shù),并且,如果存在 可變參數(shù) ,那么必須是最后一個參數(shù)

轉(zhuǎn)發(fā)和重定向

在控制器內(nèi)部處理請求的方法中,默認(rèn)返回字符串時的處理方式是 轉(zhuǎn)發(fā) ,轉(zhuǎn)發(fā)的值是 view 組件的名稱,比如 return "login" ,實質(zhì)上會根據(jù)視圖解析器( ViewResolver )得到最終負(fù)責(zé)顯示的頁面,而通過 return redirect:路徑 這樣的語法表示重定向,在 redirect: 右側(cè)的內(nèi)容是路徑,這個路徑通常使用相對的路徑,是以當(dāng)前客戶端的地址欄中的路徑為標(biāo)準(zhǔn)進(jìn)行參考,例如當(dāng)前的地址為: 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:

默認(rèn)的方式,但是也是可以使用 return "forward:login"
返回的一定是一個 view ,經(jīng)過視圖解析器之后會轉(zhuǎn)發(fā)到指定的視圖

redirect:

重定向 : return "redirect:login.do"
返回的是一個Controller方法的路徑,而不是一個view,這個不會經(jīng)過視圖解析器,而是直接跳轉(zhuǎn)

實例

@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對應(yīng)的就是轉(zhuǎn)發(fā)到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";
 }

攔截器

基本概念

  1. 攔截器( interceptor )是springmvc中的一個 組件 ,是運行在 DispatcherServlet 之后,運行在 Controller 之前的
  2. 攔截器可以決定對某些符合條件的進(jìn)行 攔截 或者 放行 ,所以,通常用于對一些具有相同運行條件的功能進(jìn)行約束

使用攔截器

自定義攔截器類

創(chuàng)建一個攔截類( DemoInterceptor ),實現(xiàn) HandlerInterceptor 接口

public class DemoInterceptorimplements HandlerInterceptor{

 /**
 * 處理器執(zhí)行之前調(diào)用
 * @param request HttpServletRequest對象,可以獲取請求參數(shù)等等
 * @param response HttpServletResponse對象
 * @param Handler 攔截器的Controller對象
 * @return 如果返回false,就會中斷處理流程,不會處理后續(xù)的攔截器和Controller。如果返回true,則會執(zhí)行后續(xù)的攔截器和處理器
 */
 public boolean preHandle(HttpServletRequest request,
  HttpServletResponse response, Object handler) throws Exception {
 
 System.out.println("DemoInterceptor的PreHandler執(zhí)行");
 return true;
 }

 /**
 * 處理器執(zhí)行之后調(diào)用,跳轉(zhuǎn)到指定視圖之前調(diào)用
 * @param request HttpServletRequest對象
 * @param response HttpServletResponse對象
 * @param Handler 攔截器的Controller對象
 * @param modelAndView ModelAndView對象,其中存放的是處理結(jié)果和視圖的信息
 */
 public void postHandle(HttpServletRequest request,
  HttpServletResponse response, Object handler,
  ModelAndView modelAndView) throws Exception {
 /**
  * 1. 可以自己設(shè)計邏輯,例如某些情況下返回false,返回true
  * 2. 返回true表示執(zhí)行后續(xù)的處理器和攔截器,返回false會中斷處理流程
  */
 System.out.println("handler:"+handler);
 System.out.println("DemoInterceptor的PostHandler執(zhí)行");
 //設(shè)置視圖的名稱,那么執(zhí)行完成之后就會條跳轉(zhuǎn)到index.jsp頁面
 //modelAndView.setViewName("index");
 }
 
 /**
 * 請求處理完成之后調(diào)用
 */
 public void afterCompletion(HttpServletRequest request,
  HttpServletResponse response, Object handler, Exception ex)
  throws Exception {
 System.out.println("DemoInterceptor的afterCompletion執(zhí)行");

 }
}

在springmvc的配置文件中配置

  1. 配置攔截的路徑: <mvc:mapping path=""/> 可以使用通配符 * 比如: /** 匹配所有的路徑, /user/* 只能匹配 /user 的子路徑
  2. 配置不攔截的路徑 : <mvc:exclude-mapping path=""/> 可以配置 多個
  3. 配置攔截器類( bean ) : <bean class="">

配置

必須按照上面的順序配置,否則將會報錯

<!-- 配置攔截器,其中可以配置多個攔截器 -->
<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>

其中實現(xiàn)的方法

public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler)

  1. 該方法在 controller 處理請求之前執(zhí)行
  2. 如果返回的 false ,則會中斷處理流程,不會執(zhí)行后續(xù)的攔截器和處理器,返回 true 會執(zhí)行后續(xù)的攔截器和處理器
  3. 可以自行設(shè)計邏輯返回 false 或者 true

public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView)

  1. 處理器執(zhí)行之后,視圖處理之前調(diào)用,此時可以通過對 ModelAndView 對數(shù)據(jù)和視圖進(jìn)行處理
  2. 當(dāng)然需要 prehandler 方法返回 true 才會執(zhí)行

public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)

  1. 所有的請求處理完畢之后調(diào)用,比如性能監(jiān)控中,我們可以在此記錄結(jié)束時間和消耗時間,還可以進(jìn)行一些資源處理
  2. 當(dāng)然需要 prehandler 方法返回 true 才會執(zhí)行

演示登錄檢查

  1. 登錄檢查: 當(dāng)涉及到用戶信息的修改,查看什么的,必須要驗證是否登錄,因此需要設(shè)計攔截器驗證登錄
  2. 先設(shè)定登錄數(shù)據(jù),即: 在 login.jsp 中添加登錄按鈕,登錄完成之后,需要自己定義一個標(biāo)記存儲在 session 中,比如 用戶的id 或者 用戶的對象
  3. 我們使用用戶的 id 作為標(biāo)記驗證是否已經(jīng)的登錄,如果用戶登錄成功,會在 session 中添加一個 uid 的屬性
  4. 用戶退出登錄使用 session.invalidate(); 清除 session ,并且重定向到 登錄界面

自定義攔截器(LoginInterceptor)

具體流程在 prehandler 方法中寫的很清楚

public class LoginInterceptorimplements HandlerInterceptor{
 /*
 * 在處理器執(zhí)行之前調(diào)用(non-Javadoc)
 * 1. 獲取session
 * 2. 讀取session中的uid的值
 *  如果為null,表示沒有登錄,那么直接重定向到登錄界面,同時返回false,不需要執(zhí)行后面的流程了
 *  如果不為null,表示已經(jīng)登錄了,那么直接返回true,繼續(xù)執(zhí)行后面的攔截器或者處理器
 */
 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,登錄成功就需要執(zhí)行后續(xù)的流程
 }
 response.sendRedirect(request.getContextPath()+"/user/login.do"); //重定向到登錄界面
 return false;  //返回false,后面的流程也不用執(zhí)行了,直接中斷
 }

 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中配置攔截器

由于這里只是跳轉(zhuǎn)到用戶中心需要驗證登錄,那么只是匹配了 user_center.do

<!-- 配置攔截器,其中可以配置多個攔截器 -->  
 <mvc:interceptors>
 <mvc:interceptor>
  <mvc:mappingpath="/user/user_center.do"/>
  <beanclass="cn.tedu.spring.interceptor.LoginInterceptor"></bean>
 </mvc:interceptor>
 </mvc:interceptors>

多個攔截器的執(zhí)行順序

根據(jù)在 springmvc 配置文件中配置的順序執(zhí)行,即是在 <mvc:interceptors> 下配置的攔截器的順序,如果對同一個路徑進(jìn)行了攔截器,那么先配置的先攔截

攔截器和過濾器的區(qū)別(主要的區(qū)別)

  1. 攔截器是springmvc中,僅僅當(dāng)使用 springmvc 才可以使用攔截器,過濾器是 Java EE 體系中的,無論使用哪種框架都可以使用過濾器
  2. 攔截器在 DispatcherServlet 之后,在處理器之前執(zhí)行,過濾器在 DispatcherServlet 之前執(zhí)行
  3. 過濾器會在所有的 servlet 之前執(zhí)行(所有的請求都會執(zhí)行),而攔截器會在springmvc中 DispatcherServlet 之后執(zhí)行,所以過濾器在項目中可以過濾任何請求(只要是配置了對應(yīng)的路徑),而攔截器只會在 DispatcherServlet 處理的請求的基礎(chǔ)之上進(jìn)行攔截

總結(jié)

當(dāng)多種請求都需要做相同或者極為相似的任務(wù)時,可以使用攔截器

開發(fā)好攔截器,那么需要在 springmvc 的配置文件中配置

在 <mvc:interceptors> 可以有如果若干個 <mvc:interceptor> ,即是配置若干個攔截器,配置的多個攔截器將會形成 攔截器鏈 ,如果配置多個攔截器對同一個路徑都會攔截,那么會按照配置的節(jié)點順序執(zhí)行。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Day14基礎(chǔ)不牢地動山搖-Java基礎(chǔ)

    Day14基礎(chǔ)不牢地動山搖-Java基礎(chǔ)

    這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • 解決從Map、JSONObject取不存在鍵值對時的異常情況

    解決從Map、JSONObject取不存在鍵值對時的異常情況

    這篇文章主要介紹了解決從Map、JSONObject取不存在鍵值對時的異常情況,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 實例分析Try {} Catch{} 作用

    實例分析Try {} Catch{} 作用

    本文是通過一個簡單的實例,向大家介紹了Try {} Catch{}的意義和作用,非常的實用,有需要的小伙伴可以參考下。
    2015-10-10
  • Java數(shù)據(jù)結(jié)構(gòu)之AC自動機算法的實現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之AC自動機算法的實現(xiàn)

    AC自動機算法常被認(rèn)為是Trie樹+KMP算法的結(jié)合體,它是一個多模式匹配算法,在模式匹配領(lǐng)域被廣泛應(yīng)用。本文將詳細(xì)為大家介紹AC自動機的原理與實現(xiàn)方法,感興趣的可以了解一下
    2022-12-12
  • SpringBoot解決循環(huán)調(diào)用問題

    SpringBoot解決循環(huán)調(diào)用問題

    作者在將SpringBoot從1.5版本升級至2.6版本,并遷移至阿里云上運行后,遇到了循環(huán)調(diào)用問題,在Jetty容器中運行沒問題,但在Tomcat容器中就出現(xiàn)了循環(huán)引用問題,原因是SpringBoot 2.6不鼓勵循環(huán)引用,暴露出該問題,作者提供了兩種解決思路
    2024-10-10
  • spring boot實現(xiàn)文件上傳

    spring boot實現(xiàn)文件上傳

    這篇文章主要為大家詳細(xì)介紹了spring boot實現(xiàn)文件上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Java后端學(xué)習(xí)精華之TCP通信傳輸協(xié)議詳解

    Java后端學(xué)習(xí)精華之TCP通信傳輸協(xié)議詳解

    TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission Control Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層
    2021-09-09
  • mybatis plus 關(guān)聯(lián)數(shù)據(jù)庫排除不必要字段方式

    mybatis plus 關(guān)聯(lián)數(shù)據(jù)庫排除不必要字段方式

    這篇文章主要介紹了mybatis plus 關(guān)聯(lián)數(shù)據(jù)庫排除不必要字段方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot使用過濾器、攔截器和監(jiān)聽器的案例代碼(Springboot搭建java項目)

    SpringBoot使用過濾器、攔截器和監(jiān)聽器的案例代碼(Springboot搭建java項目)

    這篇文章主要介紹了SpringBoot使用過濾器、攔截器和監(jiān)聽器(Springboot搭建java項目),本文是基于Springboot搭建java項目,結(jié)合案例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • SpringBoot使用RestTemplate的示例詳解

    SpringBoot使用RestTemplate的示例詳解

    RestTemplate繼承自InterceptingHttpAccessor并且實現(xiàn)了RestOperations接口,其中RestOperations接口定義了基本的RESTful操作,這些操作在RestTemplate中都得到了實現(xiàn),這篇文章主要介紹了SpringBoot使用RestTemplate,需要的朋友可以參考下
    2023-05-05

最新評論

通辽市| 息烽县| 齐河县| 台山市| 长沙市| 广灵县| 七台河市| 黄梅县| 札达县| 乡城县| 大足县| 湘西| 明星| 元氏县| 呼玛县| 宜宾县| 察雅县| 来宾市| 荃湾区| 买车| 白河县| 广宗县| 本溪市| 公主岭市| 郴州市| 长武县| 德格县| 通榆县| 西藏| 富民县| 平潭县| 延安市| 津市市| 灵武市| 桃园县| 乐陵市| 舞阳县| 张家界市| 工布江达县| 北流市| 石狮市|