Spring mvc中的拦截器Interceptor
1 功能
Java 里的拦截器是动态拦截 action 调用的对象。它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个 action 执行前阻止其执行,同时也提供了一种可以提取 action 中可重用部分的方式。在AOP(Aspect-Oriented Programming,面向切面编程)中拦截器用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些操作。
2 使用
在实际应用中,一般都是通过实现HandlerInterceptor
接口或者继承HandlerInterceptorAdapter
抽象类,重写preHandle()
、postHandle()
和afterCompletion()
这 3 个方法来对用户的请求进行拦截处理的。
preHandle():返回值类型为Boolean,当
值为 true 时,就会继续调用下一个 Interceptor 的 preHandle 方法,如果已经是最后一个 Interceptor 的时候,就会是调用当前请求的 Controller 中的方法。
postHandle
:该方法在当前请求进行处理之后,也就是在 Controller 中的方法调用之后执行,但是它会在 DispatcherServlet 进行视图返回渲染之前被调用,所以咱们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作;
afterCompletion
:该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行,这个方法的主要作用是用于进行资源清理的工作;
以下为“注册开放时间拦截器”示例:
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Calendar;
import java.util.Date;
/**
* Created by wmh on 2018/7/26.
*/
public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {
private int openingTime;
private int closingTime;
public void setOpeningTime(int openingTime) {
this.openingTime = openingTime;
}
public void setClosingTime(int closingTime) {
this.closingTime = closingTime;
}
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
Calendar c=Calendar.getInstance();
c.setTime(new Date());
int now=c.get(Calendar.HOUR_OF_DAY);
if(now<openingTime || now>closingTime){
request.setAttribute("msg", "注册开放时间:9:00-24:00");
request.getRequestDispatcher("/msg.jsp").forward(request, response);
return false;
}
return true;
}
}
3 配置
<mvc:interceptors>
<!-- 使用 bean 定义一个 Interceptor,直接定义在 mvc:interceptors 下面的 Interceptor 将拦截所有的请求 -->
<!--<bean class="com.hit.interceptor.WrongCodeInterceptor"/>-->
<mvc:interceptor>
<!-- 拦截注册请求,这个必须写在前面,也就是写在【不拦截】的上面 -->
<mvc:mapping path="/user/register"/>
<mvc:exclude-mapping path="/user/index"/>
<!-- 定义在 mvc:interceptor 下面的 Interceptor,表示对特定的请求进行拦截 -->
<bean id="timeBasedAccessInterceptor" class="cn.topcheer.reap.service.interceptor.TimeBasedAccessInterceptor">
<property name="openingTime" value="9" />
<property name="closingTime" value="12" />
</bean>
</mvc:interceptor>
</mvc:interceptors>
至此,简单拦截器学习完成。
参考资料:https://blog.csdn.net/qq_35246620/article/details/68487904#commentsedit
下一篇: PHP 怎么带着 Cookie 跳转?
推荐阅读
-
详解如何在低版本的Spring中快速实现类似自动配置的功能
-
自定义spring mvc的json视图实现思路解析
-
OKHttp3(支持Retrofit)的网络数据缓存Interceptor拦截器的实现
-
spring mvc利用ajax向controller传递对象的方法示例
-
spring mvc中直接注入的HttpServletRequst安全吗
-
Spring中如何获取request的方法汇总及其线程安全性分析
-
关于Spring MVC在Controller层中注入request的坑详解
-
spring aop action中验证用户登录状态的实例代码
-
解读ASP.NET 5 & MVC6系列教程(17):MVC中的其他新特性
-
Spring mvc整合tiles框架的简单入门教程(maven)