SpringMVC學習---攔截器Interceptor
阿新 • • 發佈:2021-01-10
技術標籤:SpringMVCspringmvcinterceptor
攔截器是什麼
攔截器一般用於攔截Controller層的請求(也就是Handler)。
它跟過濾器差不多,但也有區別:
攔截器是基於AOP思想,是橫切進去的,不影響其他流程
而且攔截器是基於SpringMVC框架的,所以適用範圍僅限於SpringMVC
如何使用攔截器
1. 通過自定義的類實現HandlerInterceptor介面來具備攔截器的功能
2. 重寫相關方法
package com.yyl.config;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Author: LongLongA
* @Description:
* @Date: Created in 17:56 2021/1/9
*/
public class MyInterceptor implements HandlerInterceptor {
@Override
//return true代表放行,執行下一個攔截器(如果有的話)
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("==========處理前==========");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("==========處理後==========");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("==========清理==========");
}
}
一般來說,只用寫攔截前的方法。而攔截後以及清理的方法通常用於新增攔截日誌。
3. 在Spring-mvc.xml檔案中配置攔截器
<!--攔截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--兩個星號代表所有層級下的請求-->
<mvc:mapping path="/**"/>
<bean class="com.yyl.config.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
/**代表的是當前層級以及以下層級的所有路徑:/a ,/a/b,/a/b/c …等等
登入攔截器Demo
- 自定義攔截器
package com.yyl.config;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* @Author: LongLongA
* @Description:
* @Date: Created in 19:28 2021/1/9
*/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
//設定放行條件
if(session.getAttribute("username") != null){//如果session不為空,則可以放行
return true;
}
if(request.getRequestURI().contains("login")){//登入請求也放行
return true;
}
if(request.getRequestURI().contains("toLogin")){//去往登入介面的請求也放行
return true;
}
//如果登入失敗,則跳轉到首頁
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
return false;
}
}
- 配置攔截器
<mvc:interceptor>
<!--兩個星號代表所有層級下的請求-->
<mvc:mapping path="/user/**"/>
<bean class="com.yyl.config.LoginInterceptor"/>
</mvc:interceptor>
- 控制層程式碼
package com.yyl.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
/**
* @Author: LongLongA
* @Description:
* @Date: Created in 19:31 2021/1/9
*/
@Controller
@RequestMapping("/user")
public class LoginController {
//登入操作
@RequestMapping("/login")
public String login(String username, String password, HttpSession session,Model model){
session.setAttribute("username",username);
session.setAttribute("password",password);
model.addAttribute("username",username);
return "success";
}
//去往登入介面
@RequestMapping("/toLogin")
public String toLoginPage(){
return "login";
}
//去往登入成功介面
@RequestMapping("/toSuccess")
public String toLoginSuccess(){
return "success";
}
//登出
@RequestMapping("/logOut")
public String logOut(HttpSession session){
//session.invalidate(); //毀掉session,不建議使用
session.removeAttribute("username");
session.removeAttribute("password");
System.out.println("----登出完畢!!!------");
System.out.println(session.getAttribute("username"));
return "login";
}
}
- 前端介面
首頁index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>遊客大廳</title>
</head>
<body>
<h1>
<a href="${pageContext.request.contextPath}/user/toLogin">登入</a>
</h1>
<h1>
<a href="${pageContext.request.contextPath}/user/toSuccess">去往首頁</a>
</h1>
</body>
</html>
登入介面login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登入介面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login" method="post">
使用者名稱:<input type="text" name="username"/><br/>
密碼:<input type="password" name="password"/><br>
<input type="submit" value="提交"/>
</form>
</body>
</html>
登入成功介面success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>成功介面</title>
</head>
<body>
<h1>登入成功!</h1>
<p>你好,${username}</p>
<a href="${pageContext.request.contextPath}/user/logOut">登出</a>
</body>
</html>
JSP介面層級關係
其中,index.jsp是客戶可以通過位址列訪問的,而login.jsp和success.jsp都在WEB-INF/jsp的資料夾下,使用者無法直接訪問,只能通過Controller層的請求去訪問