1. 程式人生 > >SpringMVC攔截器應用--------登陸認證

SpringMVC攔截器應用--------登陸認證

核心:攔截器、過濾器等都是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

  1. 判斷使用者名稱密碼是否正確
  2. 如果正確 向session中寫入使用者資訊
  3. 返回登入成功,或者跳轉到商品列表
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";
	}
}

三、攔截器

  1. 攔截使用者請求,判斷使用者是否登入
  2. 如果使用者已經登入。放行
  3. 如果使用者未登入,跳轉到登入頁面。
  • 攔截器編碼實現: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>