SpringMVC攔截器應用--------登陸認證
阿新 • • 發佈:2018-12-31
核心:攔截器、過濾器等都是AOP程式設計思想的一種體現
一、有一個登入頁面:login.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>使用者登入</title> </head> <body> <form action="${pageContext.request.contextPath }/user/login.action"> 使用者名稱:<input type="text" name="username" /><br> 密碼:<input type="password" name="password" /><br> <input type="submit"> </form> </body> </html>
二、登入頁面有一提交表單的動作,需要在controller中處理:UserController
- 判斷使用者名稱密碼是否正確
- 如果正確 向session中寫入使用者資訊
- 返回登入成功,或者跳轉到商品列表
package com.itheima.springmvc.controller; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * 使用者登陸 * @author cyn * */ @Controller @RequestMapping("user") public class UserController { //跳轉到登陸介面 @RequestMapping("toLogin") public String toLogin(){ return "login"; } //跳轉至商品列表主介面 @RequestMapping("login") public String login(String username,String password,HttpSession session){ //呼叫service進行使用者的驗證 //模擬登陸成功 if(username.equals("admin")){ //在session中儲存使用者資訊 //實際寫法:session.setAttribute("user", user); session.setAttribute("username", username); //重定向到主介面 return "redirect:/item/itemList.action"; } //登陸失敗返回重新登陸 return "login"; } }
三、攔截器
- 攔截使用者請求,判斷使用者是否登入
- 如果使用者已經登入。放行
- 如果使用者未登入,跳轉到登入頁面。
- 攔截器編碼實現:LoginInterceptor
package com.itheima.springmvc.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * 登入認證攔截器 * @author cyn * */ public class LoginInterceptor implements HandlerInterceptor { //進入Handler方法之前執行 //用於登陸認證、許可權校驗等 //比如登陸認證,如果認證不通過表示當前使用者沒有登陸,需要此方法攔截不再向下執行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { //判斷使用者有沒有登入 //實際寫法:User user = request.getSession().getAttribute("user"); Object object = request.getSession().getAttribute("username"); //如果使用者未登陸,則直接跳轉到登陸頁面(或者返回false,限制使用者接下來的操作) if(object == null){ //重定向到登陸介面 response.sendRedirect(request.getContextPath() + "/user/toLogin.action"); } //否則使用者已經登陸返回true,直接放行 //注意:true放行,false攔截 return true; } //執行Handler完成執行此方法 //應用場景:統一異常處理,統一日誌處理 @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } //進入Handler方法之後,返回modelAndView之前執行 //應用場景從modelAndView出發:將共用的模型資料(比如選單導航)在這裡傳到檢視,也可以在這裡統一指定檢視 @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } }
- 在springmvc的核心配置檔案中配置攔截器:
<!-- 配置攔截器 -->
<mvc:interceptors>
<!-- 如果配置多個攔截器,則順序執行 -->
<!-- 配置登陸認證攔截器 -->
<mvc:interceptor>
<!-- /**攔截所有請求,包括二級以上目錄 -->
<mvc:mapping path="/**"/>
<!-- 配置不攔截的url:包括跳轉登陸、密碼修改、註冊等不需要使用者登陸的主介面 -->
<mvc:exclude-mapping path="/user/**"/>
<bean class="com.itheima.springmvc.interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>