攔截器
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>
測試結果: