1. 程式人生 > >SSM攔截器應用之登入許可權認證

SSM攔截器應用之登入許可權認證

SSM攔截器應用之登入許可權認證

攔截器:

攔截到某路徑,進行操作。

1.DispatcherServlet:攔截到路徑之後交給DispatcherServlet操作,用controller跳轉。

SpringMVC具有統一的入口DispatcherServlet,DispatcherServlet是ssm框架前置控制器,所有的請求都通過DispatcherServlet。配置在web.xml檔案中的。攔截匹配的請求,Servlet攔截匹配規則可以自己定義,定義規則可以上網查,這裡不一一敘述了,把攔截下來的請求,首先進入方法doDispatch(HttpServletRequest request, HttpServletResponse response)經過一系列步奏,找到你要請求的目標Controller,最後交給他處理(沒有其他的攔截器)來處理。如果沒有handle處理器就會返回去,不再執行後面,所以說能攔截jsp頁面,JS等靜態資源,但是不能處理。
在這裡插入圖片描述

2.自定義的攔截器:攔截到路徑之後自己實現介面自己操作

那麼自定義攔截器又是怎麼實現的了,和前置攔截器有什麼關係了?
首先請求通過統一入口進入DispatcherServlet,再DispatcherServlet裡面有個方法尋找這個這個請求的處理器和Interceptor,這時候就會尋找到HandlerInterceptor 介面,或者是這個類繼承實現了HandlerInterceptor 介面的類,就會找到你自定義的攔截器,繼承HandlerInterceptor 有是三個方法,preHandle , postHandle 和 afterCompletion,preHandle 在業務處理器處理請求之前被呼叫,然後處理完請求就會呼叫postHandle,或者在檢視渲染之前呼叫它,最後請求執行完,檢視渲染完呼叫,DispatcherServlet完全處理完請求後被呼叫afterCompletion,可用於清理資源,如果定義多個攔截器,先定義的攔截器先執行preHandle,但是沒有另外的兩個方法,而是等待其他攔截器執行prehandle方法,知道最後一個攔截器執行完畢,也是從最後一個攔截器逆序執行這兩個方法。
以登入許可權認證為例:
在springmvc的配置檔案中:

	 <!-- 配置登陸攔截器 -->
	 <mvc:interceptors>
	 	<mvc:interceptor>
	 		<mvc:mapping path="/**"/>
	 		<bean class="ssm.interceptor.LoginInterceptor" />
	 	</mvc:interceptor>
	 </mvc:interceptors>

攔截器:

package ssm.interceptor;

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 ssm.po.User;

/**
 * 登入許可權認證--攔截器
 * @author Administrator
 *
 */
public class LoginInterceptor implements HandlerInterceptor{
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
		//獲取請求的URL
		StringBuffer url = request.getRequestURL();
		//URL:除了login.jsp是可以公開訪問的,其餘的URL都要進行攔截控制
		if(url.indexOf("/first")>0||url.indexOf("/login/login")>0) {
			return true;
		}
		//獲取session
		HttpSession session = request.getSession();
		User user = (User)session.getAttribute("USER");
		//判斷session裡是不是有登入資訊
		if(user!=null) {
			return true;
		}
		request.setAttribute("msg", "你還沒有登入,請先登入!");
		request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
		return false;
	}
	
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {}
	
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {}
}

pojo類:不是一定要用來和資料庫聯絡的

package ssm.po;

public class User {
	private String id;
	private String username;
	private String password;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

controller:

@Controller
@RequestMapping("/login")
public class login {
	//跳轉到登入頁面
	@RequestMapping("/first")
	public String reLogin() {
		return "login";
	}
	//登入頁面的判斷
	@RequestMapping("/login")
	public String login(HttpServletRequest request,Model model,HttpSession session) {
		String name = request.getParameter("name");
		String password = request.getParameter("password");
		User user = new User();
		if(name.equals("ssm") && password.equals("123")) {
			user.setId(U.getUUID());
			user.setUsername(name);
			user.setPassword(password);
			session.setAttribute("USER", user);
			return "redirect:tofirst";
		}
		model.addAttribute("b", false);
		return "login";
	}
	//跳轉到首頁
	@RequestMapping("/tofirst")
	public String toFirst() {
		return "firstPage";
	}
}