在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. QT_8_Qt中的事件处理_定时器事件_定时器类_事件分发器_事件过滤器_绘图事件_高级绘图事件_绘图设备_QFile 文件读写_QFileInfo文件信息

    Qt中的事件处理 1.1. 捕获QLabel中是鼠标事件 1.2. enterevent 鼠标进入 1.3. leaveevent 鼠标离开 1.4. 鼠标按下MyLabel::mousePressE ...

  2. ibatis 实现 物理级别的 分页 兼容多种数据库(转载)

    最近在看iBatis时,想做用动态Sql做个分布.因为在做项目时用iBator工具生成没有分页的功能,只有一些我们常用的功能.所以要对生成后的代码做修改.我在Java高手真经的一书中看到有做了MySq ...

  3. POJ-1002-487-3279(字符串)

    487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 309685 Accepted: 55292 Descripti ...

  4. [Usaco2009 Nov]lights

    题目描述: 给出$n$,$m$,表示有$n$盏灯和$m$条奇怪的电线,按下电线一段的灯后另一端会有影响. 求最少按几次. 题解: 高消解异或方程组,得到一堆自由元后搜索自由元状态,然后不断更新答案. ...

  5. configparser ,subprocess , xlrd ,xlwt 模块

    一,configparser模块 ''' configparser模块: 是什么: 用于解析配置文件的模块 配置文件的定义: 用于编写保存某个软件或某个系统的一系列参数的文件 设置参数 为什么需要配置 ...

  6. UI进阶 即时通讯之XMPP环境搭建

    内容中包含 base64string 图片造成字符过多,拒绝显示

  7. 修改centos的yum源为国内的源

    1.安装Centos后默认的Yum源如下 ll /etc/yum.repos.d/   [root@localhost ~]# ll /etc/yum.repos.d/ total 32 -rw-r- ...

  8. 【瞎扯】我的OI之路

    这里大概是一些我自己对我的OI之路的一些记录. 2015.11不知道哪一天-- 我听说了"编程". 当时还不懂得啥是信息学竞赛,以为这只是纯粹的程序设计.后来才明白信息学竞赛是算法 ...

  9. Github 多账号配置

    1. 不同账户,生成不同密钥ssh-keygen -t rsa -f github1 -C "xxx@163.com"ssh-keygen -t rsa -f github2 -C ...

  10. python024 Python3 实例

    Python3 实例 以下实例在 Python3.4.3 版本下测试通过: Python Hello World 实例 Python 数字求和 Python 平方根 Python 二次方程 Pytho ...