day23-springMVC攔截器
prehandel:return true:放行
return false:攔截
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-LSGQK8BD-1627630800815)(…/…/AppData/Roaming/Typora/typora-user-images/image-20210728142839015.png)]
概述
SpringMVC的處理器攔截器類似于Servlet開發中的過濾器Filter,用于對處理器進行預處理和後處理。開發者可以自己定義一些攔截器來實作特定的功能。
**過濾器與攔截器的差別:**攔截器是AOP思想的具體應用。
過濾器
- servlet規範中的一部分,任何java web工程都可以使用
- 在url-pattern中配置了/*之後,可以對所有要通路的資源進行攔截
攔截器
- 攔截器是SpringMVC架構自己的,隻有使用了SpringMVC架構的工程才能使用
- 攔截器隻會攔截通路的控制器方法, 如果通路的是jsp/html/css/image/js是不會進行攔截的
自定義攔截器
那如何實作攔截器呢?
想要自定義攔截器,必須實作 HandlerInterceptor 接口。
1、建立一個Moudule , springmvc-07-Interceptor , 添加web支援
2、配置web.xml 和 springmvc-servlet.xml 檔案
3、編寫一個攔截器
package com.kuang.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
//在請求處理的方法之前執行
//如果傳回true執行下一個攔截器
//如果傳回false就不執行下一個攔截器
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("------------處理前------------");
return true;
}
//在請求處理方法執行之後執行
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("------------處理後------------");
}
//在dispatcherServlet處理後執行,做清理工作.
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("------------清理------------");
}
}
4、在springmvc的配置檔案中配置攔截器
<!--關于攔截器的配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--/** 包括路徑及其子路徑-->
<!--/admin/* 攔截的是/admin/add等等這種 , /admin/add/user不會被攔截-->
<!--/admin/** 攔截的是/admin/下的所有-->
<mvc:mapping path="/**"/>
<!--bean配置的就是攔截器-->
<bean class="com.kuang.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
5、編寫一個Controller,接收請求
package com.kuang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//測試攔截器的控制器
@Controller
public class InterceptorController {
@RequestMapping("/interceptor")
@ResponseBody
public String testFunction() {
System.out.println("控制器中的方法執行了");
return "hello";
}
}
6、前端 index.jsp
7、啟動tomcat 測試一下!
驗證使用者是否登入 (認證使用者)
實作思路
1、有一個登陸頁面,需要寫一個controller通路頁面。
2、登陸頁面有一送出表單的動作。需要在controller中處理。判斷使用者名密碼是否正确。如果正确,向session中寫入使用者資訊。傳回登陸成功。
3、攔截使用者請求,判斷使用者是否登陸。如果使用者已經登陸。放行, 如果使用者未登陸,跳轉到登陸頁面
測試:
1、編寫一個登陸頁面 login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<h1>登入頁面</h1>
<hr>
<body>
<form action="${pageContext.request.contextPath}/user/login">
使用者名:<input type="text" name="username"> <br>
密碼:<input type="password" name="pwd"> <br>
<input type="submit" value="送出">
</form>
</body>
</html>
2、編寫一個Controller處理請求
package com.kuang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
@Controller
@RequestMapping("/user")
public class UserController {
//跳轉到登陸頁面
@RequestMapping("/jumplogin")
public String jumpLogin() throws Exception {
return "login";
}
//跳轉到成功頁面
@RequestMapping("/jumpSuccess")
public String jumpSuccess() throws Exception {
return "success";
}
//登陸送出
@RequestMapping("/login")
public String login(HttpSession session, String username, String pwd) throws Exception {
// 向session記錄使用者身份資訊
System.out.println("接收前端==="+username);
session.setAttribute("user", username);
return "success";
}
//退出登陸
@RequestMapping("logout")
public String logout(HttpSession session) throws Exception {
// session 過期
session.invalidate();
return "login";
}
}
3、編寫一個登陸成功的頁面 success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>登入成功頁面</h1>
<hr>
${user}
<a href="${pageContext.request.contextPath}/user/logout" target="_blank" rel="external nofollow" >登出</a>
</body>
</html>
4、在 index 頁面上測試跳轉!啟動Tomcat 測試,未登入也可以進入首頁!
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>首頁</h1>
<hr>
<%--登入--%>
<a href="${pageContext.request.contextPath}/user/jumplogin" target="_blank" rel="external nofollow" >登入</a>
<a href="${pageContext.request.contextPath}/user/jumpSuccess" target="_blank" rel="external nofollow" >成功頁面</a>
</body>
</html>
5、編寫使用者登入攔截器
6、在Springmvc的配置檔案中注冊攔截器
7、再次重新開機Tomcat測試!
OK,測試登入攔截功能無誤.
登入驗證
在WEB-INF下的所有資源,隻能通過controller或者servlet通路