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";
}
}