天天看點

day23-springMVC攔截器day23-springMVC攔截器

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 測試一下!

day23-springMVC攔截器day23-springMVC攔截器
驗證使用者是否登入 (認證使用者)

實作思路

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通路