springmvc攔截器登錄驗證示例
一開始,學(xué)了攔截器與過濾器,咋一看兩者有點像,實際上兩者有很大的不同。就用攔截器和過濾器分別做了登錄驗證試驗,這次先說攔截器。下面是自己實踐的一個實例:
在spring-mvc.xml中配置攔截器:
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/user/*"/> <!-- 定義在mvc:interceptor下面的表示是對特定的請求才進(jìn)行攔截的 --> <bean class="com.wyb.interceptor.LoginInterceptor"/> </mvc:interceptor> </mvc:interceptors>
如上所示,這里配置了LoginIntercepter,為了簡單起見,該過濾器只攔截了URL為"/user/*"的請求。
要攔截的請求對應(yīng)控制器如下:
import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.wyb.domain.User; import com.wyb.service.IUserService; import com.wyb.service.impl.UserServiceImpl; @Controller @RequestMapping("/user") public class UserController { private static final Logger LOG=Logger.getLogger(UserController.class); @Autowired private IUserService userService; @RequestMapping("/showAllUser") public String showAllUser(Model m){ List<User> userlist=new ArrayList<User>(); userlist=userService.findAllUser(); for(User user :userlist){ System.out.println(user.getUserName()); } return "/jsp/showAllUser"; } }
這里的showAllUser()方法是為了輸出所有的用戶,為了表明執(zhí)行了方法,將所有用戶在后臺打印,URL為:http://localhost:8080/TestSSM/user/showAllUser,可見該URL肯定會被LoginIntercepter攔截。
測試頁面showAllUser.jsp如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>show All User</title> </head> <body> this is showAllUser Page!!! </body> </html>
LoginIntercepter如下:
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.wyb.domain.User; public class LoginInterceptor implements HandlerInterceptor{ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("this is afterCompletion of LoginInterceptor"); } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("this is postHandle of LoginInterceptor"); } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { // TODO Auto-generated method stub System.out.println("this is preHandle of LoginInterceptor"); HttpSession session=request.getSession(); User user=(User)session.getAttribute("user"); if(user==null){ System.out.println("no user in LoginInterceptor!!!"); request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); } //返回true代表繼續(xù)往下執(zhí)行 return true; } }
這里我犯了一個錯誤,聰明的小伙伴也許已經(jīng)看出來了,如果按照上面的代碼,當(dāng)我們訪問:http://localhost:8080/TestSSM/user/showAllUser結(jié)果如下:
咋一看,成功攔截了,輸入用戶名信息,正常跳轉(zhuǎn)到主頁,再次進(jìn)入http://localhost:8080/TestSSM/user/showAllUser如下:
頁面正常輸出,已經(jīng)記錄了session,不會被再次攔截,看似成功了,可是看看后臺輸出:
有沒有發(fā)現(xiàn),我們執(zhí)行了兩次showAllUser()方法,可見第一次訪問雖然被攔截器攔截了下來進(jìn)入登錄頁面,但后臺已經(jīng)悄悄執(zhí)行了showAllUser()。為什么呢?我們回頭再看看LoginIntercepter.java,尤其是preHandle()方法:
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { // TODO Auto-generated method stub System.out.println("this is preHandle of LoginInterceptor"); HttpSession session=request.getSession(); User user=(User)session.getAttribute("user"); if(user==null){ System.out.println("no user in LoginInterceptor!!!"); request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); } //返回true代表繼續(xù)往下執(zhí)行 return true; }
在判斷user為空后,雖然執(zhí)行了頁面跳轉(zhuǎn),但是程序還是會繼續(xù)執(zhí)行,最后返回true,返回true意味著,被攔截的業(yè)務(wù)邏輯可以繼續(xù)往下執(zhí)行,因此,雖然表面上被攔截了,但從本質(zhì)上來說并沒有攔截到。因此需要修改如下:
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { // TODO Auto-generated method stub System.out.println("this is preHandle of LoginInterceptor"); HttpSession session=request.getSession(); User user=(User)session.getAttribute("user"); if(user==null){ System.out.println("no user in LoginInterceptor!!!"); request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); //本次訪問被攔截,業(yè)務(wù)邏輯不繼續(xù)執(zhí)行 return false; } //返回true代表繼續(xù)往下執(zhí)行 return true; }
user為空,跳轉(zhuǎn)后,返回false,就不會執(zhí)行被攔截的業(yè)務(wù)邏輯了,修改后后臺輸出如下:
現(xiàn)在后臺正常輸出,且session保存了user信息后,才能執(zhí)行showAllUser()方法,大功告成!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java日常練習(xí)題,每天進(jìn)步一點點(42)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07淺析Java中print、printf、println的區(qū)別
以下是對Java中print、printf、println的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-08-08java線程并發(fā)cyclicbarrier類使用示例
CyclicBarrier類似于CountDownLatch也是個計數(shù)器,不同的是CyclicBarrier數(shù)的是調(diào)用了CyclicBarrier.await()進(jìn)入等待的線程數(shù),當(dāng)線程數(shù)達(dá)到了CyclicBarrier初始時規(guī)定的數(shù)目時,所有進(jìn)入等待狀態(tài)的線程被喚醒并繼續(xù),下面使用示例學(xué)習(xí)他的使用方法2014-01-01詳解SpringBoot通過restTemplate實現(xiàn)消費(fèi)服務(wù)
本篇文章主要介紹了詳解使用RestTemplate消費(fèi)spring boot的Restful服務(wù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01SpringBoot事件發(fā)布與監(jiān)聽超詳細(xì)講解
今天去官網(wǎng)查看spring boot資料時,在特性中看見了系統(tǒng)的事件及監(jiān)聽章節(jié),所以下面這篇文章主要給大家介紹了關(guān)于SpringBoot事件發(fā)布和監(jiān)聽的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11Java實現(xiàn)讀取resources目錄下的文件路徑的九種方式
本文主要介紹了Java實現(xiàn)讀取resources目錄下的文件路徑的九種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Java for循環(huán)Map集合優(yōu)化實現(xiàn)解析
這篇文章主要介紹了Java for循環(huán)Map集合優(yōu)化實現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01