SpringMVC——自定義攔截器


攔截器
    Interceptor攔截器的主要作用是攔截用戶的請求並進行相應的處理。SpringMVC攔截器是可插拔式的設計,在配置文件中配置或取消即可。
    HandlerInterceptor接口:
        Interceptor攔截器攔截請求是通過實現HandlerInterceptor接口實現的。定義一個Interceptor攔截器通常在該類中實現HandlerInterceptor接口,或者繼承抽象類HandlerInterceptorAdapter。
        HandlerInterceptor接口中定義了三個方法:
          boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handle) 該方法在請求處理之前被調用。返回false表示請求結束,后續的Interceptor和Controller都不會再執行;當返回值為true時,就會繼續調用下一個Interceptor的preHandle方法,若已經是最后一個Interceptor,就會調用當前請求的Controller。
          void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView mv) 該方法只能在當前所屬的interceptor的preHandle方法返回true之后才能被調用。在Controller方法之后DispatherServlet進行視圖返回渲染之前執行,可以對Controller方法返回的ModelAndView對象進行操作。先聲明該方法的Interceptor會后執行。
          void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception exception) 該方法會在當前所屬Interceptor的prehandle方法返回true時執行。該方法在DispatcherServlet渲染了對應的視圖之后執行。
   

Bean

/FileUploadTest/src/com/spring/file/bean/Book.java

package com.spring.file.bean;

public class Book {
    private String name;
    private String author;
    private double price;
    
    public Book( String name, String author, double price) {
        super();
        this.name = name;
        this.author = author;
        this.price = price;
    }
//省略getter和setter方法 }

 

/FileUploadTest/src/com/spring/file/bean/User.java

package com.spring.file.bean;

import org.springframework.web.multipart.MultipartFile;

public class User {
    private String loginname;
    private String password;
    private String username;
    private MultipartFile image;
//省略getter和setter方法
}

配置文件

/FileUploadTest/WebContent/WEB-INF/springmvc-config.xml

 <!-- Spring MVC 攔截器定義 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 攔截所有請求 -->
            <mvc:mapping path="/*"/>
            <!-- 使用bean定義一個Interceptor -->
            <bean class="com.spring.file.controller.AuthorizationInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

攔截器

/FileUploadTest/src/com/spring/file/controller/AuthorizationInterceptor.java

package com.spring.file.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

import com.spring.file.bean.User;

/**
 * 攔截器必須實現HandlerInterceptor接口
 */
public class AuthorizationInterceptor implements HandlerInterceptor{
    //不攔截的請求
    private static final String[] IGNORE_URI = {"/login","/loginForm"};
    
    /*該方法將在整個請求完成后執行,主要用於清理資源,該方法只能在當前Interceptor的preHandle方法返回值為true時才會執行*/
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception)
            throws Exception {
        System.out.println("AuthorizationInterceptor afterCompletion -->");
    }
    /*該方法將在Controller調用之后執行,可以對ModelAndView進行操作。priHandle返回true時才會執行*/
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv)
            throws Exception {
        System.out.println("AuthorizationInterceptor postHandle -->");
    }
    /*該方法進行處理器攔截,該方法將在Controller處理之前調用。該方法返回true攔截器才會繼續往下執行,返回false整個請求結束*/
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("AuthorizationInterceptor preHandle -->");
        //flag判斷用戶是否登錄
        boolean flag = false;
        //獲取請求的路徑進行判斷
        String servletPath= request.getServletPath();
        //判斷是否需要攔截請求
        for(String s : IGNORE_URI) {
            if(servletPath.contains(s)) {
                flag = true;
                break;
            }
        }
        //攔截請求
        if(!flag) {
            //獲取session總的用戶
            User user = (User) request.getSession().getAttribute("user");
            //判斷是否登錄
            if(user == null) {
                //用戶沒登錄
                System.out.println("AuthorizationInterceptor攔截請求:");
                request.setAttribute("message", "請先登錄!");
                request.getRequestDispatcher("login").forward(request, response);
            }else {
                //已登錄
                System.out.println("AuthorizationInterceptor放行請求:");
                flag = true;
            }
        }
        return flag;
    }
    
}

Controller

/FileUploadTest/src/com/spring/file/controller/BookController.java

package com.spring.file.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.spring.file.bean.Book;

@Controller
public class BookController {
    @RequestMapping(value="main")
    public String main(Model model) {
        //模擬數據
        List<Book> bookList = new ArrayList<Book>();
        bookList.add(new Book("java","小明",77.2));
        bookList.add(new Book("javaee","小明",19.9));
        bookList.add(new Book("android","小明",29.9));
        bookList.add(new Book("ajax","小明",39.9));
        model.addAttribute("bookList", bookList);
        return "mainForm";
    }
}

 

/FileUploadTest/src/com/spring/file/controller/UserController.java

package com.spring.file.controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.spring.file.bean.User;

@Controller
public class UserController {
    
    @RequestMapping(value="/login")
    public ModelAndView login(String loginname,String password,ModelAndView mv,HttpSession session) {
        //模擬數據
        if(loginname != null && loginname.equals("hello")
                && password!=null && password.equals("123456")) {
            //創建用戶
            User user = new User();
            user.setLoginname(loginname);
            user.setPassword(password);
            user.setUsername("管理員");
            //登錄成功,將user對象設置到HttpSession作用域
            session.setAttribute("user", user);
            //轉發到main請求
            mv.setViewName("redirect:main");
        }else {
            mv.addObject("message","登錄失敗!");
            mv.setViewName("loginForm");
        }
        
        return mv;
    }
}

JSP

/FileUploadTest/WebContent/WEB-INF/content/loginForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登錄頁面</title>
</head>
<body>
    <h3>登錄頁面</h3>
    <form action="login" method="post">
      <font color="red">${requestScope.message}</font>
      <table>
        <tr>
          <td><label>登錄名:</label></td>
          <td><input type="text" id="loginname" name="loginname"></td>
        </tr>
        <tr>
          <td><label>密碼:</label></td>
          <td><input type="password" id="password" name="password"></td>
        </tr>
        <tr>
          <td><input type="submit" value="登錄"></td>
        </tr>
      </table>
    </form>
</body>
</html>

 

/FileUploadTest/WebContent/WEB-INF/content/mainForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>main</title>
</head>
<body>
<h3>歡迎[ ${sessionScope.user.username}]訪問</h3><br>
<table border="1">
  <tr>
    <th>書名</th><th>作者</th><th>價格</th>
  </tr>
  <c:forEach items="${requestScope.bookList}" var="book">
    <tr>
      <td>${book.name}</td>
      <td>${book.author}</td>
      <td>${book.price}</td>
    </tr>
  </c:forEach>
</table>
</body>
</html>

測試結果:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM