1. 程式人生 > 其它 >SpringMVC學習---攔截器Interceptor

SpringMVC學習---攔截器Interceptor

技術標籤: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

  1. 自定義攔截器
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;
    }
}

  1. 配置攔截器
<mvc:interceptor>
   <!--兩個星號代表所有層級下的請求-->
   <mvc:mapping path="/user/**"/>
   <bean class="com.yyl.config.LoginInterceptor"/>
</mvc:interceptor>
  1. 控制層程式碼
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";
    }
}

  1. 前端介面
    首頁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層的請求去訪問