拦截器
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>
测试结果: