在SpringMVC中,我们会常常使用到拦截器,尽管SpringAOP也能帮我们实现强大的拦截器功能,但在Web资源供给上。却没有SpringMVC来得方便快捷。

使用SpringMVC拦截器的核心应用场景是依据我们的实际需求,个性化定制拦截器,再对特定url进行拦截处理。

而自己定义拦截器。首先须要我们实现HandlerInterceptor拦截器接口。以下是它的定义:

package org.springframework.web.servlet;
public interface HandlerInterceptor {
//在控制器方法调用前运行
//返回值为是否中断。true,表示继续运行(下一个拦截器或处理器)
//false则会中断兴许的全部操作。所以我们须要使用response来响应请求
boolean preHandle(
HttpServletRequest request, HttpServletResponse response,
Object handler)
throws Exception; //在控制器方法调用后,解析视图前调用。我们能够对视图和模型做进一步渲染或改动
void postHandle(
HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView)
throws Exception;
//整个请求完毕,即视图渲染结束后调用。这个时候能够做些资源清理工作,或日志记录等
void afterCompletion(
HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex)
throws Exception;
}

非常多时候,我们仅仅须要实现以上三个方法的随意一个或两个。这个时候我们能够选择继承HandlerInterceptorAdapter。

它实现了AsyncHandlerInterceptor接口,为每一个方法提供了空实现,这样。我们就能够依据需求重写自己用到的拦截方法就可以。具体定义例如以下:

public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {

    @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
} @Override
public void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
} @Override
public void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
} @Override
public void afterConcurrentHandlingStarted(
HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
} }

相对于HandlerInterceptor,HandlerInterceptorAdapter多了一个实现方法afterConcurrentHandlingStarted()。它来自HandlerInterceptorAdapter的直接实现类AsyncHandlerInterceptor,AsyncHandlerInterceptor接口直接继承了HandlerInterceptor。并新添了afterConcurrentHandlingStarted()方法用于处理异步请求,当Controller中有异步请求方法的时候会触发该方法时,异步请求先支持preHandle、然后运行afterConcurrentHandlingStarted。异步线程完毕之后运行preHandle、postHandle、afterCompletion。

以下我们以登陆请求为例。编写我们的自己定义拦截器:

public class LoginInterceptor extends HandlerInterceptorAdapter {

  @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {
// 获得请求路径的uri
String uri = request.getRequestURI(); // 进入登录页面,推断session中是否有key。有的话重定向到首页。否则进入登录界面
if(uri.contains("login")) {
if(request.getSession().getAttribute("user") != null) {
response.sendRedirect(request.getContextPath());//默认跟路径为首页
} else {
return true;//继续登陆请求
}
} // 其它情况推断session中是否有key,有的话继续用户的操作
if(request.getSession().getAttribute("user") != null) {
return true;
} // 最后的情况就是进入登录页面
response.sendRedirect(request.getContextPath() + "/login");
return false;
}
}

以下是我们的拦截器配置:

<mvc:interceptors>
<mvc:interceptor><!--配置局部拦截器,须要满足下列路径条件-->
<mvc:exclude-mapping path="/user/logout"/><!--注销-->
<mvc:exclude-mapping path="/home/"/><!--在home中定义了无须登陆的方法请求,直接过滤拦截-->
<mvc:mapping path="/**"/>
<bean class="com.mvc.interceptor..LoginInterceptor"/><!--自己定义拦截器注冊-->
</mvc:interceptor>
<!-- 我们能够直接在者注冊自己定义拦截器Bean来配置全局拦截器,会对全部请求拦截-->
</mvc:interceptors>

在我们的拦截中,假设配置了多个拦截器,会形成一条拦截器链。运行顺序相似于AOP,前置拦截先定义的先运行。后置拦截和完结拦截(afterCompletion)后注冊的后运行,关于拦截器的运行顺序的深入理解可參考我的还有一篇文章《 spring学习笔记(12)@AspectJ研磨分析[3]增强织入顺序实例具体解释》

springMVC4(16)拦截器解析与登陆拦截模拟的更多相关文章

  1. Springboot 拦截器配置(登录拦截)

    Springboot 拦截器配置(登录拦截) 注意这里环境为springboot为2.1版本 1.编写拦截器实现类,实现接口   HandlerInterceptor, 重写里面需要的三个比较常用的方 ...

  2. struts2拦截器配置;拦截器栈;配置默认拦截器;拦截方法的拦截器MethodFilterInterceptor;完成登录验证

    struts2.xml 内容 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  3. 说说struts2中拦截器的请求流程一(模拟大致流程)

    本文可作为北京尚学堂struts2课程的学习笔记. 首先 什么是拦截器?拦截器能干什么? 拦截器,顾名思义就是拦截对象然后做操作的东西,至于是拦截谁?那自然是拦截action了.能做什么操作呢?你想让 ...

  4. AOP 貌似是拦截器 对方法进行拦截

    AOP 貌似是拦截器 对方法进行拦截

  5. JavaWeb -- Struts 自定义拦截器, 登录权限拦截

    1. 自定义拦截器, 登录权限拦截 login.jsp 登录JSP <%@ page language="java" contentType="text/html; ...

  6. Struts2他们拦截器实例定义—登陆权限验证

    版本号:struts2.1.6 这种情况下实现功能:用户需要指定username登陆,进入相应的页面运行成功登陆作战,否则,它返回到着陆的登录页面,当直接进入操作页面(登陆访问页面后的能力)如果不同意 ...

  7. SpringMVC源码情操陶冶-InterceptorsBeanDefinitionParser拦截器解析器

    解析mvc:interceptors节点 观察下InterceptorsBeanDefinitionParser的源码备注 /** * {@link org.springframework.beans ...

  8. 使用SpirngMvc拦截器实现对登陆用户的身份验证

    登陆成功则按returnUrl进行跳转,即跳转到登陆之前的页面,否则跳转到登陆页面,返回登陆错误信息. 1.SpringMVC.xml <!-- 映射器 --> <bean clas ...

  9. springboot项目配置拦截器,进行登陆等拦截

    新建拦截类: public class LoginInterceptor implements HandlerInterceptor{ private static Log logger = LogF ...

随机推荐

  1. url跳转路径参数获取

    function getUrlParam1(name){ //正则表达式过滤 var reg = new RegExp("(^|&)" + name + "=([ ...

  2. error: version in "./docker-compose.yml" is unsupported

    #sudo rm /usr/bin/docker-compose #curl -L https://github.com/docker/compose/releases/download/1.20.0 ...

  3. 牛客网练习赛25 C 再编号

    链接:https://www.nowcoder.com/acm/contest/158/C来源:牛客网 定义对 a 的再编号为 a' ,满足 . 现在有 m 次询问,每次给定 x,t ,表示询问经过 ...

  4. 连接远程docker内的mysql(navicat)

    拉取mysql镜像 docker pull mysql:5.6 查看mysql镜像 docker images | grep mysql 启动mysql容器 docker run -p 3306:33 ...

  5. [CF] 37 E. Trial for Chief

    如果固定了一个中心,那么只需要考虑从它开始最远染到的那些点究竟染了几次. 上下左右不同的点连1边,相同的连0边,跑单源最短路就可以啦. lyd讲的是统计到最远黑点+1的最小值,但是#58数据全是白点, ...

  6. Mysql中max函数取得的值不是最大

    ①问题:遇到一个很有意思的问题,这里记录一下, 就是在使用max函数的时候发现取得的最大值其实不是最大值. 比如: 某一列中有10000000,和9999999, 其最大值应该是10000000但是查 ...

  7. PHP中的预定义常量、类常量和魔术常量的区别

    PHP 向它运行的任何脚本提供了大量的预定义常量.不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了. 对于一些基本的常量是这些常量在 ...

  8. laravel(4.2) +Zizaco

    操作步骤:https://github.com/Zizaco/entrust/tree/1.0 这篇博客说的蛮详细的:http://blog.boolw.com/?p=241 简化后的步骤 1.在根项 ...

  9. ES6(Proxy 和 Reflect)

    Proxy 和 Reflect 1.Proxy 和 Reflect 的概念 Proxy 意为 ‘代理’,连接了用户和真实对象之间的一个层 Reflect 意为‘反射’   反射的是Object 2.适 ...

  10. NGINX模块(一)

    [NGINX核心模块] 1.主模块 该模块包含一些Nginx的基本控制功能. 指令1:daemon 语法:daemon on | off 默认值:on daemon off; 说明:生产环境中不要使用 ...