spring mvc拦截器
Java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
spring mvc中的拦截器概念和struts2的拦截器概念是一样的,这里先用struts2的拦截器原理来理解。
大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。Struts2拦截器是可插拔的,拦截器是AOP的一种实现。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。
spring mvc中自定义一个拦截器需要三步:
- 自定义拦截器,这个拦截器实现HandlerInterceptor接口。
- 在spring-mvc.xml配置文件中配置拦截器。
- 在自定义拦截器中做拦截处理。
实现拦截器
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
/**
* 在DispatcherServlet处理后执行,清理工作
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception)
throws Exception {
System.out.println("-----------------------清理工作------------------------");
}
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object object, ModelAndView modelAndView) throws Exception {
System.out.println("处理请求");
}
/**
* 在请求方法处理前执行
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object object) throws Exception {
System.out.println("---------------------拦截器之前先拦截--------------------");
return true;
}
}
HandlerInterceptor需要实现3个方法,preHandle()方法在调用controller前就调用,postHandle(),afterCompletion()在调用controller之后调用。在preHandle()方法中,如果返回true,那么执行下一个拦截器,如果返回false,那么不执行拦截器。
配置拦截器
<!-- 拦截器配置 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.shizongger.ssm.controller.MyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
mvc:mapping标签的path属性中,配置的拦截路径,/**包括路径的子路劲,如果是/admin*拦截的是/admin/add, /admin/list等,/admin/user/add不被拦截。
在ide打上断点,浏览器输入url,就会进入这个拦截器里面来。这里有个思考题:如果被拦截,能否到达指定的页面?答案是:使用HttpServletResponse或者HttpServletRequest可以实现转发或者重定向。
拦截器的应用:登录拦截器
web开发中,只要有登录用户这一模块几乎都需要权限验证。这里先配置一个登陆拦截器,默认登录地址不拦截,登录过的用户也不需要拦截,每个url都允许通过。只有未登录的用户,直接访问非登录地址,这是不允许的是,需要拦截。
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class LoginInterceptor implements HandlerInterceptor {
private List<String> allawedPass;
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object object, Exception exception)
throws Exception {
}
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object object, ModelAndView mav) throws Exception {
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object object) throws Exception {
String url = request.getRequestURL().toString().trim();
String loginName = (String) request.getSession().getAttribute("loginName");
if(loginName != null) {
return true;
}
for(String temp : allawedPass) {
if(url.endsWith(temp)) {
return true;
}
}
response.sendRedirect(request.getContextPath() + "/user/loginUI");
return false;
}
public void setAllawedPass(List<String> allawedPass) {
this.allawedPass = allawedPass;
}
}
<!-- 拦截器配置 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.shizongger.ssm.controller.MyInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.shizongger.ssm.controller.LoginInterceptor">
<property name="allawedPass">
<list>
<value>/user/loginUI</value>
<value>/user/login</value>
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
在拦截器中,定义一个List的变量这个变量默认哪些地址不需要拦截,赋值是通过配置文件中
<list>
<value>/user/loginUI</value>
<value>/user/login</value>
</list>
中设置,当前端访问url时,在进入controller方法前,先来到登录拦截器的preHandle()方法,这个方法的处理逻辑是:先从session中获取登录用户名,如果session中存在用户,那么通过。如果session中没有用户名,但是url后缀在白名单中,也让它通过,只有那些既没有登录过,也不是白名单地址在这里被强制返回到登录页面。
拦截器与过滤器区别
过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西;拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。
1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3.拦截器只对action起作用,而过滤器几乎可以对所有请求起作用。
4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
5.在action的生命周期里,拦截器可以多起调用,而过滤器只能在容器初始化时调用一次。
spring mvc拦截器的更多相关文章
- SSM(spring mvc+spring+mybatis)学习路径——2-2、spring MVC拦截器
目录 2-2 Spring MVC拦截器 第一章 概述 第二章 Spring mvc拦截器的实现 2-1 拦截器的工作原理 2-2 拦截器的实现 2-3 拦截器的方法介绍 2-4 多个拦截器应用 2- ...
- spring mvc 拦截器的使用
Spring MVC 拦截器的使用 拦截器简介 Spring MVC 中的拦截器(Interceptor)类似于 Servler 中的过滤器(Filter).用于对处理器进行预处理和后处理.常用于日志 ...
- 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor
[Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...
- Spring Boot 2.X(九):Spring MVC - 拦截器(Interceptor)
拦截器 1.简介 Spring MVC 中的拦截器(Interceptor)类似于 Servlet 开发中的过滤器 Filter,它主要用于拦截用户请求并作相应的处理,它也是 AOP 编程思想的体现, ...
- Spring MVC拦截器配置
Spring MVC拦截器配置 (1)自定义拦截器 package learnspringboot.xiao.other; import org.springframework.web.servlet ...
- 写的太细了!Spring MVC拦截器的应用,建议收藏再看!
Spring MVC拦截器 拦截器是Spring MVC中强大的控件,它可以在进入处理器之前做一些操作,或者在处理器完成后进行操作,甚至是在渲染视图后进行操作. 拦截器概述 对于任何优秀的MVC框架, ...
- 对于Spring MVC 拦截器的一些了解
Spring MVC 拦截器的执行顺序 应用场景 假设请求 localhost:8080/ 则要求直接重定向到 localhost:8080/login ; 定义拦截器顺序 permission lo ...
- Spring MVC拦截器浅析
Spring MVC拦截器 重点:Spring MVC的拦截器只会拦截控制器的请求,如果是jsp.js.image.html则会放行. 什么是拦截器 运行在服务器的程序,先于Servlet或JSP之前 ...
- spring MVC拦截器01
spring MVC拦截 作用:身份校验,权限检查,防止非法訪问. 场景:一个bbs系统,用户没有登录就无法发帖或者删除评论; 一个博客系统,没有登录就无法发表博文,无法添加分类,无法删除博文. sp ...
- spring mvc拦截器原理分析
我的springMVC+mybatis中的interceptor使用@autowired注入DAO失败,导致报空指针错误,这个是为什么呢? :空指针说明没有注入进来,你可以检查一下你的这个拦截器int ...
随机推荐
- Method Draw – 很好用的 SVG 在线编辑器
Method Draw 是一款在线 SVG 编辑器,是 SVG Edit 的一个分支.Method Draw 的目的是改进 SVG Edit 的可用性和用户体验.它移除了 line-caps/corn ...
- 前端上传组件Plupload使用指南
我之前写过一篇文章<文件上传利器SWFUpload使用指南>,里面介绍了上传组件SWFUpload的使用方法,但现在随着html5技术的逐渐推广和普及,再去使用以flash为上传手段的SW ...
- jQuery构造函数init参数分析(二)
接着上一篇随笔讨论. 如果selector是其他字符串情况就比较多了比较复杂了 // Handle HTML strings if ( typeof selector === "string ...
- C# 获得MP4时长
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- Mac下的Parallel Windows忘记密码怎么办?
Mac机上安装了Parallel Windows,日久年深不登录结果忘记了登录密码,百爪挠心,想破脑壳试了n个密码都不行,放了一个多月也没想起来. 今天没事网上溜溜,肯定也有和我同病相怜的弟兄,果然, ...
- clang LLVM 介绍和安装(Ubuntu10 64位)
http://www.csdn.net/article/2013-11-27/2817632 的对Stanley B.Lippman采访提到clang的一些优点,以前程序员杂志也写过,为了提高系统的性 ...
- 使用Masonry搭建特殊布局时与xib的对比
之前只有比较浅的接触过Masonry.项目中大多数的布局还是用xib中的AutoLayout与手码的frame计算相结合,相信也会有很多项目和我一样是这两种布局的组合.其实xib各方面用的感觉都挺好, ...
- Android环境搭建和编写helloworld
一.配置jdk环境(学过java的请无视) 1.安装jdk jdk下载地址:http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk ...
- mysql 数据库服务中的应用程序
mysql 是一个数据库服务,而实现数据库服务是由mysql中的很多子应用程序来完成的(http://dev.mysql.com/doc/refman/5.7/en/programs-overview ...
- 深入.net(类及方法)
.net 的命名规则: 帕斯卡命名法 ----- 多个单词说明,且直接连接,并首字母大写(类名.方法名.属性名....) 骆驼命名法---------多个单词说明,且直接连接,并首字母大写,第一个字母 ...