Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器
转载请注明出处:
前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)——SpringMVC注解开发(高级篇)
1.拦截器定义
Spring Web MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。
定义拦截器,实现HandlerInterceptor接口。接口中提供三个方法。
<span style="color: #0000ff">package</span><span style="color: #000000"> joanna.yan.ssm.interceptor; </span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.http.HttpServletRequest; </span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.http.HttpServletResponse; </span><span style="color: #0000ff">import</span><span style="color: #000000"> org.springframework.web.servlet.HandlerInterceptor; </span><span style="color: #0000ff">import</span><span style="color: #000000"> org.springframework.web.servlet.ModelAndView; </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> HandlerInterceptor1 <span style="color: #0000ff">implements</span><span style="color: #000000"> HandlerInterceptor{ </span><span style="color: #008000">//</span><span style="color: #008000">执行Handler完成执行此方法 </span><span style="color: #008000">//</span><span style="color: #008000">应用场景:统一异常处理,统一日志处理</span> <span style="color: #000000"> @Override </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception { System.out.println(</span>"HandlerInterceptor1......afterCompletion"<span style="color: #000000">); } </span><span style="color: #008000">//</span><span style="color: #008000">进入Handler方法之后,返回modelAndView之前执行 </span><span style="color: #008000">//</span><span style="color: #008000">应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里同意指定视图</span> <span style="color: #000000"> @Override </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception { System.out.println(</span>"HandlerInterceptor1......postHandle"<span style="color: #000000">); } </span><span style="color: #008000">//</span><span style="color: #008000">进入Handler方法之前执行 </span><span style="color: #008000">//</span><span style="color: #008000">用于身份认证、身份授权 </span><span style="color: #008000">//</span><span style="color: #008000">比如身份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不再向下执行。</span> <span style="color: #000000"> @Override </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">boolean</span><span style="color: #000000"> preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception { System.out.println(</span>"HandlerInterceptor1......preHandle"<span style="color: #000000">); </span><span style="color: #008000">//</span><span style="color: #008000">return false表示拦截,不向下执行 </span><span style="color: #008000">//</span><span style="color: #008000">return true表示放行</span> <span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span><span style="color: #000000">; } }</span>
2.拦截器配置
struts中是有一个大的拦截器链,它是一个共用的东西,可以把它添加到任何的action链接,都让它拦截。但是spring的拦截器不是全局的。
2.1针对某种mapping配置拦截器
springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中设置拦截,经过该HandlerMapping映射成功的handler最终使用该拦截器。
<span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">class</span><span style="color: #0000ff">="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">property </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="interceptors"</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">list</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">ref </span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="handlerInterceptor1"</span><span style="color: #0000ff">/></span> <span style="color: #0000ff"><</span><span style="color: #800000">ref </span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="handlerInterceptor2"</span><span style="color: #0000ff">/></span> <span style="color: #0000ff"></</span><span style="color: #800000">list</span><span style="color: #0000ff">></span> <span style="color: #0000ff"></</span><span style="color: #800000">property</span><span style="color: #0000ff">></span> <span style="color: #0000ff"></</span><span style="color: #800000">bean</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">id</span><span style="color: #0000ff">="handlerInterceptor1"</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">="joanna.yan.ssm.interceptor.HandlerInterceptor1"</span><span style="color: #0000ff">/></span> <span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">id</span><span style="color: #0000ff">="handlerInterceptor2"</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">="joanna.yan.ssm.interceptor.HandlerInterceptor2"</span><span style="color: #0000ff">/></span>
一般不推荐使用。
2.2针对所有mapping配置全局拦截器
springmvc可以配置类似全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中。
<span style="color: #008000"><!--</span><span style="color: #008000">拦截器 </span><span style="color: #008000">--></span> <span style="color: #0000ff"><</span><span style="color: #800000">mvc:interceptors</span><span style="color: #0000ff">></span> <span style="color: #008000"><!--</span><span style="color: #008000">多个拦截器,顺序执行 </span><span style="color: #008000">--></span> <span style="color: #0000ff"><</span><span style="color: #800000">mvc:interceptor</span><span style="color: #0000ff">></span> <span style="color: #008000"><!--</span><span style="color: #008000"> /**表示所有url包括子url路径 </span><span style="color: #008000">--></span> <span style="color: #0000ff"><</span><span style="color: #800000">mvc:mapping </span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/**"</span><span style="color: #0000ff">/></span> <span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">class</span><span style="color: #0000ff">="joanna.yan.ssm.interceptor.HandlerInterceptor1"</span><span style="color: #0000ff">></</span><span style="color: #800000">bean</span><span style="color: #0000ff">></span> <span style="color: #0000ff"></</span><span style="color: #800000">mvc:interceptor</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">mvc:interceptor</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">mvc:mapping </span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/**"</span><span style="color: #0000ff">/></span> <span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">class</span><span style="color: #0000ff">="joanna.yan.ssm.interceptor.HandlerInterceptor2"</span><span style="color: #0000ff">></</span><span style="color: #800000">bean</span><span style="color: #0000ff">></span> <span style="color: #0000ff"></</span><span style="color: #800000">mvc:interceptor</span><span style="color: #0000ff">></span> <span style="color: #0000ff"></</span><span style="color: #800000">mvc:interceptors</span><span style="color: #0000ff">></span>
3.拦截测试
3.1测试需求
测试多个拦截器各个方法的执行时机。
3.2编写两个拦截器
3.3两个拦截器都放行
运行日志信息:
<span style="color: #000000">HandlerInterceptor1...preHandle HandlerInterceptor2...preHandle HandlerInterceptor2...postHandle HandlerInterceptor1...postHandle HandlerInterceptor2...afterCompletion HandlerInterceptor1...afterCompletion</span>
总结:
preHandle方法按顺序执行,postHandle和afterCompletion按拦截器配置的逆向顺序执行。
3.4拦截器1放行,拦截器2不放行
运行日志信息:
<span style="color: #000000">HandlerInterceptor1...preHandle HandlerInterceptor2...preHandle HandlerInterceptor1...afterCompletion</span>
总结:
拦截器1放行,拦截器2的preHandle才会执行。
拦截器2的preHandle不放行,拦截器2的postHandle和afterCompletion不会执行。
只要有一个拦截器不放行,postHandle就不会执行。
3.5拦截器1不放行,拦截器2不放行
运行日志信息:
HandlerInterceptor1...preHandle
拦截器1的preHandle不放行,postHandle和afterCompletion不会执行。
拦截器1的preHandle不放行,拦截器2不执行。
4.小结
根据测试结果,对拦截器应用。
比如:统一日志处理拦截器,需要改拦截器preHandle一定要放行,且将它放在拦截器链中的第一位置。
比如:登录认证拦截器,放在拦截器链中第一个位置。权限校验拦截器,放在登录拦截器之后。(因为登录通过后才校验权限)
5.拦截器应用(实现登录认证)
5.1需求
(1)用户请求url
(2)拦截器进行拦截校验
如果请求的url是公开地址(无需登录即可访问的url),让放行
如果用户session不存在,跳转到登录页面。
如果用户session存在,放行,继续操作。
5.2登录、退出controller方法
<span style="color: #0000ff">package</span><span style="color: #000000"> joanna.yan.ssm.controller; </span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.servlet.http.HttpSession; </span><span style="color: #0000ff">import</span><span style="color: #000000"> org.springframework.stereotype.Controller; </span><span style="color: #0000ff">import</span><span style="color: #000000"> org.springframework.web.bind.annotation.RequestMapping; @Controller </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> LoginController { </span><span style="color: #008000">//</span><span style="color: #008000">登录</span> @RequestMapping("/login"<span style="color: #000000">) </span><span style="color: #0000ff">public</span> String login(HttpSession session, String username, String password) <span style="color: #0000ff">throws</span><span style="color: #000000"> Exception{ </span><span style="color: #008000">//</span><span style="color: #008000">调用service进行用户身份认证 </span><span style="color: #008000">//</span><span style="color: #008000">... </span><span style="color: #008000">//</span><span style="color: #008000">在session中保存用户身份信息</span> session.setAttribute("username"<span style="color: #000000">, username); </span><span style="color: #0000ff">return</span> "redirect:items/queryItems.action"<span style="color: #000000">; } </span><span style="color: #008000">//</span><span style="color: #008000">退出</span> @RequestMapping("/logout"<span style="color: #000000">) </span><span style="color: #0000ff">public</span> String logout(HttpSession session) <span style="color: #0000ff">throws</span><span style="color: #000000"> Exception{ </span><span style="color: #008000">//</span><span style="color: #008000">清除session</span> <span style="color: #000000"> session.invalidate(); </span><span style="color: #0000ff">return</span> "redirect:items/queryItems.action"<span style="color: #000000">; } }</span>
5.3登录认证拦截实现
5.3.1LoginInterceptor
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> LoginInterceptor <span style="color: #0000ff">implements</span><span style="color: #000000"> HandlerInterceptor{ </span><span style="color: #008000">//</span><span style="color: #008000">执行Handler完成执行此方法 </span><span style="color: #008000">//</span><span style="color: #008000">应用场景:统一异常处理,统一日志处理</span> <span style="color: #000000"> @Override </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception { System.out.println(</span>"HandlerInterceptor1......afterCompletion"<span style="color: #000000">); } </span><span style="color: #008000">//</span><span style="color: #008000">进入Handler方法之后,返回modelAndView之前执行 </span><span style="color: #008000">//</span><span style="color: #008000">应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里同意指定视图</span> <span style="color: #000000"> @Override </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span><span style="color: #000000"> postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception { System.out.println(</span>"HandlerInterceptor1......postHandle"<span style="color: #000000">); } </span><span style="color: #008000">//</span><span style="color: #008000">进入Handler方法之前执行 </span><span style="color: #008000">//</span><span style="color: #008000">用于身份认证、身份授权 </span><span style="color: #008000">//</span><span style="color: #008000">比如身份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不再向下执行。</span> <span style="color: #000000"> @Override </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">boolean</span><span style="color: #000000"> preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception { System.out.println(</span>"HandlerInterceptor1......preHandle"<span style="color: #000000">); </span><span style="color: #008000">//</span><span style="color: #008000">获取请求的url</span> String url=<span style="color: #000000">request.getRequestURI(); </span><span style="color: #008000">//</span><span style="color: #008000">判断url是否是公开地址(实际使用时要将公开地址配置到文件中) </span><span style="color: #008000">//</span><span style="color: #008000">这里公开地址是登录提交的地址</span> <span style="color: #0000ff">if</span>(url.indexOf("login.action")>=0<span style="color: #000000">){ </span><span style="color: #008000">//</span><span style="color: #008000">如果进行登录提交,放行</span> <span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span><span style="color: #000000">; } </span><span style="color: #008000">//</span><span style="color: #008000">判断session</span> HttpSession session=<span style="color: #000000">request.getSession(); String username</span>=(String) session.getAttribute("username"<span style="color: #000000">); </span><span style="color: #0000ff">if</span>(username!=<span style="color: #0000ff">null</span><span style="color: #000000">){ </span><span style="color: #008000">//</span><span style="color: #008000">身份存在,放行</span> <span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span><span style="color: #000000">; } </span><span style="color: #008000">//</span><span style="color: #008000">执行到这里,表示用户身份需要认证,跳转登录页面</span> request.getRequestDispatcher("/WEB-INF/jsp/login.jsp"<span style="color: #000000">).forward(request, response); </span><span style="color: #008000">//</span><span style="color: #008000">return false表示拦截,不向下执行 </span><span style="color: #008000">//</span><span style="color: #008000">return true表示放行</span> <span style="color: #0000ff">return</span> <span style="color: #0000ff">false</span><span style="color: #000000">; } }</span>
5.3.2拦截器配置
classpath下springmvc.xml中配置:
如果此文对您有帮助,微信打赏我一下吧~
Atas ialah kandungan terperinci Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Cara cepat membina sistem carta statistik di bawah rangka kerja Vue Dalam aplikasi web moden, carta statistik merupakan komponen penting. Sebagai rangka kerja bahagian hadapan yang popular, Vue.js menyediakan banyak alatan dan komponen yang mudah yang boleh membantu kami membina sistem carta statistik dengan cepat. Artikel ini akan memperkenalkan cara menggunakan rangka kerja Vue dan beberapa pemalam untuk membina sistem carta statistik ringkas. Pertama, kita perlu menyediakan persekitaran pembangunan Vue.js, termasuk memasang perancah Vue dan beberapa pemalam yang berkaitan. Jalankan arahan berikut dalam baris arahan

Pemain boleh mengumpul bahan yang berbeza untuk membina bangunan apabila bermain di Mistlock Kingdom Ramai pemain ingin tahu sama ada untuk membina bangunan di alam liar Bangunan tidak boleh dibina di dalam Mistlock Kingdom. . Bolehkah bangunan dibina di alam liar di Mistlock Kingdom? 1. Bangunan tidak boleh dibina di kawasan liar Kerajaan Mist Lock. 2. Bangunan mesti dibina dalam skop altar. 3. Pemain boleh meletakkan Spirit Fire Altar dengan sendirinya, tetapi apabila mereka meninggalkan julat, mereka tidak akan dapat membina bangunan. 4. Kita juga boleh terus menggali lubang di gunung sebagai rumah kita, jadi kita tidak perlu menggunakan bahan binaan. 5. Terdapat mekanisme keselesaan dalam bangunan yang dibina oleh pemain sendiri, iaitu, lebih baik dalaman, lebih tinggi keselesaan. 6. Keselesaan yang tinggi akan membawa bonus atribut kepada pemain, seperti

Amalan terbaik dan langkah berjaga-jaga untuk membina pelayan web di bawah CentOS7 Pengenalan: Dalam era Internet hari ini, pelayan web adalah salah satu komponen teras untuk membina dan mengehos laman web. CentOS7 ialah pengedaran Linux berkuasa yang digunakan secara meluas dalam persekitaran pelayan. Artikel ini akan meneroka amalan dan pertimbangan terbaik untuk membina pelayan web pada CentOS7, dan memberikan beberapa contoh kod untuk membantu anda memahami dengan lebih baik. 1. Pasang pelayan HTTP Apache Apache adalah w yang paling banyak digunakan

Panduan Pemasangan PyTorch: Sediakan persekitaran pembangunan dengan pantas dalam PyCharm PyTorch ialah salah satu rangka kerja yang paling popular dalam bidang pembelajaran mendalam semasa Ia mempunyai ciri-ciri kemudahan penggunaan dan fleksibiliti, dan digemari oleh pembangun. Artikel ini akan memperkenalkan cara cepat menyediakan persekitaran pembangunan PyTorch dalam PyCharm, supaya anda boleh memulakan pembangunan projek pembelajaran mendalam. Langkah 1: Pasang PyTorch Mula-mula, kita perlu memasang PyTorch. Pemasangan PyTorch biasanya perlu mengambil kira persekitaran sistem

Dalam era yang kaya dengan maklumat hari ini, platform media sosial telah menjadi cara utama untuk orang ramai mendapatkan dan berkongsi maklumat. Bagi individu dan perusahaan, mewujudkan rangkaian akaun yang berkesan untuk mencapai penyebaran maklumat maksimum dan meningkatkan pengaruh telah menjadi cabaran mendesak yang perlu diselesaikan. 1. Bagaimana untuk membina matriks akaun? 1. Menjelaskan khalayak sasaran Sebelum membina matriks akaun, kuncinya ialah mentakrifkan khalayak sasaran dengan jelas dan memperoleh pemahaman yang mendalam tentang keperluan, minat dan tabiat penggunaan mereka, supaya strategi kandungan yang lebih disasarkan dapat dibangunkan. 2. Pilih platform yang sesuai Mengikut ciri kumpulan sasaran, pilih platform media sosial yang sesuai untuk susun atur. Pada masa ini, platform media sosial arus perdana termasuk Weibo, WeChat, Douyin, Kuaishou, dll. Setiap platform mempunyai kumpulan pengguna dan ciri komunikasinya yang unik, dan pemilihan perlu berdasarkan situasi sebenar.

Teknik pengukuhan keselamatan rangkaian untuk membina pelayan web di bawah CentOS7 Pelayan web adalah bahagian penting dalam Internet moden, jadi sangat penting untuk melindungi keselamatan pelayan web. Dengan mengeraskan keselamatan rangkaian, anda boleh mengurangkan risiko dan mengelakkan kemungkinan serangan. Artikel ini akan memperkenalkan teknik pengukuhan keselamatan rangkaian yang biasa digunakan semasa membina pelayan web pada CentOS7, dan memberikan contoh kod yang sepadan. Kemas kini sistem dan perisian anda Mula-mula, pastikan sistem dan perisian anda dikemas kini. Anda boleh menggunakan arahan berikut untuk mengemas kini

Dengan perkembangan pesat Internet mudah alih, aplikasi video pendek Douyin telah menjadi bahagian yang sangat diperlukan dalam kehidupan seharian orang ramai. Mempunyai akaun Douyin yang popular bukan sahaja dapat menarik perhatian peminat, tetapi juga membawa nilai komersial. Jadi, bagaimana untuk menyediakan akaun Douyin yang terbaik? 1. Apakah cara terbaik untuk menyediakan akaun Douyin? 1. Kedudukan yang jelas Apabila membuat akaun Douyin, anda mesti terlebih dahulu menjelaskan kedudukan anda. Adakah anda ingin menjadi pelawak lucu atau pekongsi pengetahuan profesional? Kedudukan yang jelas boleh membantu menarik peminat yang tepat, dengan itu meningkatkan nilai akaun anda. 2. Penamaan akaun: Nama akaun yang baik boleh membuatkan peminat mengingati anda sepintas lalu. Nama akaun hendaklah ringkas dan jelas, berkaitan dengan kedudukan anda, dan mempunyai tahap kreativiti tertentu. Elakkan menggunakan nama yang terlalu biasa untuk mengelakkan kekeliruan dengan orang lain

Kemahiran pengurusan log dan pemantauan untuk membina pelayan web pada pelayan Web CentOS adalah bahagian penting dalam aplikasi Internet moden, dan pengurusan dan pemantauan log pelayan adalah kunci untuk memastikan operasi pelayan yang stabil dan penyelesaian masalah. Artikel ini akan memperkenalkan cara membina pelayan web pada sistem pengendalian CentOS, dan menyediakan beberapa pengurusan log dan teknik pemantauan. 1. Bina pelayan Web dan pasang Apache ialah perisian pelayan Web sumber terbuka yang popular. Memasang Apache pada CentOS adalah mudah
