1 概述
- SpringMVC可以使用兰机器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须HandlerInterceptor接口。
- HandlerInterceptor接口的定义如下:
package org.springframework.web.servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.lang.Nullable; import org.springframework.web.method.HandlerMethod; public interface HandlerInterceptor { /** * 这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求进行处理。如果程序员决定拦截器对请求拦截处理后 * 还要调用其他拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求, * 则返回false。 */ default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } /** * 这个方法在业务处理器处理完请求后,但是DispaterServlet向客户端返回响应前被调用 * * */ default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } /** * 这个方法在DispatcherServlet完全处理完请求后被带哦用,可以在该方案分中进行一些资源清理操作 * */ default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { } }
2 入门示例
2.1 index.jsp
- 示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <a href="${pageContext.request.contextPath}/test">test</a> <a href="${pageContext.request.contextPath}/emp">emp</a> </body> </html>
2.2 FirstInterceptor.java
- 示例:
package com.sunxiaping.springmvc.controller; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FirstInceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("-------------FirstInceptor-------preHandle--"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("-------------FirstInceptor-------postHandle--"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("-------------FirstInceptor-------afterCompletion--"); } }
2.3 SecondInterceptor.java
- 示例:
package com.sunxiaping.springmvc.controller; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SecondInceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("-------------SecondInceptor-------preHandle--"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("-------------SecondInceptor-------postHandle--"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("-------------SecondInceptor-------afterCompletion--"); } }
2.4 TestController.java
- 示例:
package com.sunxiaping.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TestController { @RequestMapping(value = "/test") public String test(){ return "success"; } @RequestMapping(value = "/emp") public String emp(){ return "success"; } }
2.5 SpringMVC.xml
- 示例:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd "> <!-- 配置自动扫描的包 --> <context:component-scan base-package="com.sunxiaping.springmvc"></context:component-scan> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:interceptors> <!-- 拦截所有资源 --> <bean class="com.sunxiaping.springmvc.controller.FirstInceptor"></bean> <!-- 拦截指定资源 --> <mvc:interceptor> <mvc:mapping path="/emp"/> <bean class="com.sunxiaping.springmvc.controller.SecondInceptor"/> </mvc:interceptor> </mvc:interceptors> <mvc:annotation-driven></mvc:annotation-driven> </beans>
2.6 success.jsp
- 示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 成功啦 <br/> </body> </html>