spring拦截器-过滤器的区别

1.  理解

拦截器 :是在面向切面编程的时候,在你的 service 或者一个方法前调用一个方法,或者在方法后调用一个方法;比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

过滤器:是在 javaweb 中,你传入的 request、response 提前过滤掉一些信息,或者提前设置一些参数,然后再传入 servlet 或者 struts 的 action 进行业务逻辑,比如过滤掉非法url(不是 login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入 servlet 或者 struts 的 action 前统一设置字符集,或者去除掉一些非法字符.。

 

2.  具体区别

拦截器是 AOP( Aspect-Oriented Programming) 的一种实现,底层通过动态代理模式完成。

区别:

(1)拦截器是基于 java 的反射机制的,而过滤器是基于函数回调。

(2)拦截器不依赖于 servlet 容器,而过滤器依赖于 servlet 容器。

(3)拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起作用。

(4)拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能。

(5)在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

3.  本质区别

从灵活性上说拦截器功能更强大些,Filter能做的事情,他都能做,而且可以在请求前,请求后执行,比较灵活。

Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用 interceptor。

不过还是根据不同情况选择合适的。

4.  摘要

Spring 的拦截器与 Servle t的 Filter 有相似之处,比如二者都是 AOP 编程思想的体现,都能实现权限检查、日志记录等。

不同的是:
1、使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。


2、规范不同:Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。


3、使用的资源不同:同其他的代码块一样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而Filter则不能。


4、深度不同Filter 只在 Servlet 前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在 Spring 构架的程序中,要优先使用拦截器。 (重点)


实际上 Filter 和 Servlet 极其相似,区别只是Filter不能直接对用户生成响应。实际上 Filter 里 doFilter() 方法里的代码就是从多个 Servlet 的 service() 方法里抽取的通用代码,通过使用Filter可以实现更好的复用。  


filter是一个可以复用的代码片段,可以用来转换 HTTP 请求、响应和头信息。Filter 不像 Servlet,它不能产生一个请求或者响 应,它只是修改对某一资源的请求,或者修改从某一的响应。  


JSR 中说明的是,按照多个匹配的Filter,是按照其在 web.xml 中配置的顺序 来执行的。 所以这也就是,把自己的 Filter 或者其他的 Filter(比如UrlRewrite的Filter)放在 springmvc 的 DispatcherFilter 的前面的原因。因为,它们需要在请求被 springmvc 框架处理之前,做一些前置的工作。 当 Filter 被调用,并且进入了 SpringMVC 的 DispatcherFilter 中 后,SpringMVC 会按照在 Action 中配置的 Interceptor Stack中的 Interceptor 的顺序,来调用 Interceptor。

 

本文地址:http://www.cnblogs.com/niceyoo/articles/8743116.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(2716):重读vue电商网站36之slot插槽使用

项目需求:由于用户列表状态后台返回的是 true/false,无法进行渲染,而我们需要的是有一个Switch开关来控制我们的状态。添加一个template 模板后,此时就可以用 slot-scope 作用域插槽来获取我们数据列表中的每一行数据,…

jsp调用struts,jsp调用action,action获取表单提交的参数

自定义action类。LgqAction: Component Scope(value"prototype") public class LgqAction { private Connection conn null; private PreparedStatement pstmt null; private ResultSet rs null; public String execut…

员工信息增删改查

1 #Author guixin2 def find():3 4 查询语法如下:5 find name,age from staff_table where age > 226 find * from staff_table where dept IT7 find * from staff_table where enroll_date like 20138 9 data input("查询:&…

springmvc.xml 中 url-pattern/url-pattern节点详解

1. 先来上段常见的代码 1 <!-- MVC Servlet -->2 <servlet>3 <servlet-name>springServlet</servlet-name>4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>5 <…

前端学习(2717):重读vue电商网站37之通过switch开关更改用户状态

首先&#xff0c;在 switch 开关添加一个 change 事件&#xff0c;并且通过作用域插槽的形式&#xff0c;将该行数据作为参数传入&#xff0c;目的是为了后续的修改。 在函数内我们将传递过来的参数作为我们请求的参数&#xff0c;通过 put 方式修改我们的后台数据 。

边框回归(Bounding Box Regression)详解

原文地址&#xff1a;http://blog.csdn.net/zijin0802034/article/details/77685438 Bounding-Box regression 最近一直看检测有关的Paper, 从rcnn&#xff0c; fast rcnn, faster rcnn, yolo, r-fcn, ssd&#xff0c;到今年cvpr最新的yolo9000。这些paper中损失函数都包含了边…

前端学习(2718):重读vue电商网站38之通过input输入框优化

通过增加 clearable 属性&#xff0c;我们的输入框就可以多一个 x&#xff0c;然后通过绑定 clear 事件&#xff0c;当我们进行清除 &#xff08;即点击由 clearable 属性生成的清空按钮时触发)时&#xff0c;就会重新获取我们的用户列表&#xff0c;不再需要用户再次点击搜索按…

web项目Servlet配置及jsp访问Servlet

方法1&#xff1a;单一方法请求servlet 1、创建Servlet WebServlet("/HelloForm") public class HelloForm extends HttpServlet { private static final long serialVersionUID 1L; /** * see HttpServlet#HttpServlet() */ publi…

php与数据库的连接用法 (签到一)

注册页面 //插入js验证 <script type"text/javascript"> window.onload function(){ var hid document.getElementById("id"); if(hid.value !""){ //当用户名已存在数据…

Oracle不连续的值,如何实现查找上一条、下一条

1. 遇到的问题 已知一个题库&#xff0c;希望实现当前页切换上一题&#xff0c;下一题的需求。 查看得知&#xff0c;数据库中用于查询的字段(主键)是不连续的。如上图所示&#xff1a;stxh为主键number类型。 2. 实现方式lead over 2.1 实现代码 下一条 select nowId, afte…

前端学习(2719):重读vue电商网站39之正则表达式验证邮箱和手机号码

Javascript // 验证邮箱的规则var checkEmail (rule, value, cb) > {const regEmail /^([a-zA-Z]|[0-9])(\w|-)[a-zA-Z0-9]\.([a-zA-Z]{2,4})$/if (regEmail.test(value)) {// 合法的邮箱return cb()}cb(new Error(请输入合法的邮箱))}// 验证手机号码的规则var checkMobi…

支付宝提现,单笔转账到支付宝账户

很简单。只需三个参数实现 单笔转账到支付宝账户 1、获取开放平台创建的APPID&#xff0c;同时必须添加 单笔转账到支付宝账户 这个功能 开放平台&#xff1a;https://open.alipay.com/platform/home.htm 2、登录支付宝商家中心平台&#xff1a;https://b.alipay.com/index.h…

Flink系列之:Checkpoints

Flink系列之&#xff1a;Checkpoints 一、概述二、保留Checkpoint三、目录结构四、通过配置文件全局配置五、创建 state backend 对单个作业进行配置六、从保留的checkpoint 中恢复状态 一、概述 Checkpoint 使 Flink 的状态具有良好的容错性&#xff0c;通过 checkpoint 机制…

filter过滤器实现验证跳转_返回验证结果

1. 需求背景 需要对某个请求url进行拦截&#xff0c;模拟是否可以进入某一个接口&#xff0c;如果拦截需要返回数据false&#xff0c;别问我为何不用intercept拦截器。 2. web.xml <filter> <filter-name>restfulFilter</filter-name> <filter-clas…

学习基础和C语言基础调查

一.你有什么技能比大多人&#xff08;超过90%以上&#xff09;更好&#xff1f; 答&#xff1a;回答这个问题之前应该加上“我觉得”三个字&#xff1b;其实我没什么太多太实用的技能&#xff0c;无非就是一些特别的、没什么新鲜有意义的技能&#xff0c;比如说我觉得有一些不太…

前端学习(2730):重读vue电商网站40之使用vue-table-with-tree-grid

安装新的依赖 vue-tabel-with-tree-gridvue-tabel-with-tree-grid 官方文档 安装完成后&#xff0c;在 main.js 入口文件内先导入 tree-tabel 然后全局注册组件 tree-tabel 页面中&#xff0c;我们使用了如下属性&#xff1a; data 确定我们的数据源&#xff0c;columns定义我…

年终个人工作总结

这里有25篇个人年终总结&#xff0c;涵盖各行各业 http://www.duanmeiwen.com/zongjie/fanwen/46847.html https://wenku.baidu.com/view/9cddf7653069a45177232f60ddccda38376be180.html https://jz.docin.com/p-322307149.html

腾讯TBS加载网页无法自适应记录

1. 所遇到的问题 webview加载指定网页无法实现自适应&#xff0c;之前在加载重构一个网页的时候&#xff0c;其实也遇到这种问题&#xff0c;然后就有了下面的一下步骤 WebSettings webSettings view.getSettings(); webSettings.setJavaScriptEnabled(true); // settings…

前端学习(2731):重读vue电商网站41之自定义格式化时间的全局过滤器

在 main.js 入口文件全局注册格式化时间的过滤器&#xff0c;代码如下所示&#xff1a; Javascript // 自定义格式化时间的全局过滤器 Vue.filter(dataFormat, function(originVal) {const dt new Date(originVal)const year dt.getFullYear()const mon (dt.getMonth() 1 …

sign check fail: check Sign and Data Fail

支付宝开发报错&#xff1a;com.alipay.api.AlipayApiException: sign check fail: check Sign and Data Fail 解决方法&#xff1a; 确认使用的支付宝公钥是否正确&#xff0c;不同的环境使用的支付宝公钥不同&#xff0c; 如沙箱环境、线上openapi网关和mapi网关对应的支付…