Java框架之SpringMVC(六)攔截器

SpringMVC:攔截器

SpringMVC的處理器攔截器類似於Servlet開發中的過濾器Filter,用於對處理器進行預處理和後處理。開發者可以自己定義一些攔截器來實現特定的功能。

過濾器與攔截器的區別:
1.過濾器
servlet規範中的一部分,任何java web工程都可以使用
在url-pattern中配置了/*之後,可以對所有要訪問的資源進行攔截
2.攔截器
攔截器是AOP思想的具體應用。
攔截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
攔截器只會攔截訪問的控制器方法, 如果訪問的是jsp/html/css/image/js是不會進行攔截的

自定義攔截器的實現步驟

那如何實現攔截器呢?

想要自定義攔截器,必須實現 HandlerInterceptor 接口。

1. 自定義攔截器

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就不執行下一個攔截器
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("------------處理前------------");
        return true;
    }

    //在請求處理方法執行之後執行
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("------------處理後------------");
    }

    //在dispatcherServlet處理後執行,做清理工作.
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("------------清理------------");
    }
}

2. 配置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>

3.index.jsp

<a href="${pageContext.request.contextPath}/interceptor">攔截器測試</a>

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

運行:
在這裏插入圖片描述

案例實現:驗證用戶是否登錄(認證用戶)

實現思路

1有一個登陸頁面,需要寫一個controller訪問頁面。

2 登陸頁面有一提交表單的動作。需要在controller中處理。判斷用戶名密碼是否正確。如果正確,向session中寫入用戶信息。返回登陸成功。

3 攔截用戶請求,判斷用戶是否登陸。如果用戶已經登陸。放行, 如果用戶未登陸,跳轉到登陸頁面

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

攔截器編寫

package com.kuang.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
        // 如果是登陸頁面則放行
        System.out.println("uri: " + request.getRequestURI());
        if (request.getRequestURI().contains("login")) {
            return true;
        }

        HttpSession session = request.getSession();

        // 如果用戶已登陸也放行
        if(session.getAttribute("user") != null) {
            return true;
        }

        // 用戶沒有登陸跳轉到登陸頁面
        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

配置文件

        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean id="loginInterceptor" class="com.kuang.interceptor.LoginInterceptor"/>
        </mvc:interceptor>

前端-首頁

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<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>

前端-成功頁面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${user}
<a href="${pageContext.request.contextPath}/user/logout">註銷</a>
</body>
</html>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章