Kite的学习历程之SpringMVC拦截器
Kite学习框架的第十四天
1. SpringMVC拦截器
简介:Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 用户可以自己定义一些拦截器来实现特定的功能。 谈到拦截器,还要向大家提一个词——拦截器链(Interceptor Chain)。拦截器链就是将拦截器按一定的顺 序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
域servlet中的过滤器进行比较
过滤器 是 servlet 规范中的一部分,任何 java web 工程都可以使用。
拦截器 是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
过滤器 在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
拦截器 它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦 截的。
它也是 AOP 思想的具体应用。
我们要想自定义拦截器, 要求必须实现:HandlerInterceptor 接口。
1.1 自定义拦截器步骤
1.1.1 创建一个controller类
package cn.kitey.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 被拦截的controller方法
*/
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testInterceptor")
public String testException() {
System.out.println("testInterceptor执行了!");
return "success";
}
}
1.1.2 创建一个index.jsp页面,用于controller的进入,一个success.jsp页面用于跳转成功页面,一个error.jsp页面,用于拦截器中的页面跳转
index.jsp页面
<%--
Created by IntelliJ IDEA.
User: 小风筝
Date: 2020/6/19
Time: 22:09
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC拦截器</title>
<h3>SpringMVC拦截器</h3>
<a href="user/testInterceptor">异常处理</a>
</head>
<body>
</body>
</html>
注意在pages包下,因为我们设置的视图解析器为该路径下的.jsp文件
success.jsp页面
<%--
Created by IntelliJ IDEA.
User: 小风筝
Date: 2020/6/19
Time: 22:18
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success</title>
</head>
<body>
转发成功!
<% System.out.println("success.jsp页面执行了"); %>
</body>
</html>
error.jsp页面
<%--
Created by IntelliJ IDEA.
User: 小风筝
Date: 2020/6/20
Time: 10:50
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>error</title>
</head>
<body>
<h3>ERROR页面</h3>
</body>
</html>
1.1.3 创建一个interceptor包,在其中创建MyInterceptor类,实现接口HandlerInterceptor
其中重写的方法有:
public boolean preHandle(): 预处理方法,在执行控制器前进行执行,含有返回值,返回为false表示不放行,但是可以在该方法中执行,请求转发,跳转到error页面request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
public void postHandle(): 后处理方法,在执行controller后,在success.jsp之前进行执行。没有返回值,可以执行请求转发方法,但是会执行success.jsp页面
public void afterCompletion(): 最后处理方法,在success.jsp页面执行后,执行该方法,不能进行请求转发方法。
package cn.kitey.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 {
/**
* 预处理,controller方法执行之前
* return true :表示放行,执行下一个拦截器,执行controller中的方法
* return false 不放行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor拦截器执行了。。。。。预处理!");
//request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
//这里设置不进行放行,或者放行
return true;
}
/**
* 后处理方法,经过controller后返回时,执行的方法,在success.jsp方法前执行
* @param request
* @param response
* @param handler
* @param
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor拦截器执行了。。。。。后处理!");
//这里也可以通过请求转发跳转页面(但是后面的success.jsp页面也会进行执行)
//request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
}
/**
* 最后处理,在success.jsp执行后,在执行该方法
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor拦截器执行了。。。。。最后处理!");
//该方法不能进行页面的请求转发!!
}
}
1.1.4 在创建一个拦截器进行拦截
package cn.kitey.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 MyInterceptor1 implements HandlerInterceptor {
/**
* 预处理,controller方法执行之前
* return true :表示放行,执行下一个拦截器,执行controller中的方法
* return false 不放行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor拦截器执行了。。。。。预处理111!");
//request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
//这里设置不进行放行,或者放行
return true;
}
/**
* 后处理方法,经过controller后返回时,执行的方法,在success.jsp方法前执行
* @param request
* @param response
* @param handler
* @param
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor拦截器执行了。。。。。后处理111!");
//这里也可以通过请求转发跳转页面(但是后面的success.jsp页面也会进行执行)
//request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
}
/**
* 最后处理,在success.jsp执行后,在执行该方法
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor拦截器执行了。。。。。最后处理111!");
//该方法不能进行页面的请求转发!!
}
}
1.1.5 在springMVC中配置拦截器
配置标签为interceptors
其中我们配置类两自定义拦截器
MyInterceptor :拦截路径为/uesr/
.MyInterceptor1:拦截路径:/**
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:nvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启对包路径的扫描-->
<context:component-scan base-package="cn.kitey"></context:component-scan>
<!--开启视图解析器 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--注入文件所在的路径-->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!--配置扫描的文件后缀名-->
<property name="suffix" value=".jsp"></property>
</bean>
<!--配置拦截器-->
<nvc:interceptors>
<mvc:interceptor>
<!--配置要进行拦截的路径-->
<mvc:mapping path="/user/*"/>
<bean class="cn.kitey.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
<!--添加拦截器路径-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.kitey.interceptor.MyInterceptor1"></bean>
</mvc:interceptor>
</nvc:interceptors>
<!--开启SpringMVC框架注解的支持-->
<mvc:annotation-driven ></mvc:annotation-driven>
</beans>
运行结果图
index.jsp页面
控制台显示
跳转页面
当设置不放行的话,就不会条状到该页面,则会跳转到error.jsp页面
上一篇: 包吃包住