一、拦截器与过滤器的区别:
1、filter基于回调函数,而interceptor则基于java本身的反射机制,这是两者最本质的区别。
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求 起作用 。
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 。
二、举例
1、filter实现获取某个指定文件的图片失败时,返回一个默认的图片,用于提示用户。
<!--errorImgFilter过滤器 --> <filter> <filter-name>errorImgFilter</filter-name> <filter-class>com.yingjun.sharing.web.ErrorImgFilter</filter-class> </filter> <filter-mapping> <filter-name>errorImgFilter</filter-name> <url-pattern>/filelibs/*</url-pattern> </filter-mapping>
package com.yingjun.sharing.web; import java.io.File; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; /** * 获取指定文件下的文件失败时,返回一个默认的图片,用于提示用户 * */ public class ErrorImgFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("初始化ErrorImgFilter"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("执行ErrorImgFilter"); HttpServletRequest req = (HttpServletRequest) request; String realPath = req.getSession().getServletContext().getRealPath("/"); String contextPath = req.getContextPath(); String requestURI = req.getRequestURI(); String fileUrl = realPath + requestURI.substring(contextPath.length()); File f = new File(fileUrl); if (!f.exists()) { request.getRequestDispatcher("/images/front/errorImg.png").forward(request, response); return; } chain.doFilter(request, response); } @Override public void destroy() { System.out.println("销毁ErrorImgFilter"); } }
效果图:
2、interceptor来检测用户是否登录以及分页的实现。
<interceptors> <!-- struts2拦截器 --> <interceptor name="sessionInterceptor" class="com.yingjun.sharing.web.SessionInterceptor" /> <interceptor name="pagerInterceptor" class="com.yingjun.sharing.web.PagerInterceptor" /> <interceptor-stack name="myStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="sessionInterceptor"> <!-- 以下方法sessionInterceptor拦截器不拦截--> <param name="excludeMethods">login*,checkUserExistWithName,register</param> </interceptor-ref> <interceptor-ref name="pagerInterceptor"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 全局拦截器栈 --> <default-interceptor-ref name="myStack"></default-interceptor-ref> <global-results> <result name="error">/WEB-INF/error/error.jsp</result> </global-results>
package com.yingjun.sharing.web; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; import com.yingjun.sharing.dto.SessionInfo; /** * session拦截器 * */ public class SessionInterceptor extends MethodFilterInterceptor { private static final long serialVersionUID = 1L; protected String doIntercept(ActionInvocation actionInvocation) throws Exception { HttpServletRequest request=ServletActionContext.getRequest(); SessionInfo sessionInfo = (SessionInfo)request.getSession().getAttribute("SessionInfo"); System.out.println("#######SessionInterceptor:"+request.getRequestURI()); if (sessionInfo == null) { request.setAttribute("msg", "您还没有登录或登录已超时,请退出重新登录,然后再刷新本功能!"); return "error"; } return actionInvocation.invoke(); } }
package com.yingjun.sharing.web; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import com.yingjun.sharing.pager.SystemContext; public class PagerInterceptor extends AbstractInterceptor { private static final long serialVersionUID = 1L; @Override public String intercept(ActionInvocation arg) throws Exception { System.out.println("#######PagerInterceptor:"+arg.getAction().toString()); Integer offset = 0;//起始值 Integer page = 1;//第几页 Integer rows=15;//每页显示个数 try { offset = Integer.parseInt(ServletActionContext.getRequest().getParameter("offset")); } catch (NumberFormatException e) {} try { page = Integer.parseInt(ServletActionContext.getRequest().getParameter("page")); } catch (NumberFormatException e) {} try { rows = Integer.parseInt(ServletActionContext.getRequest().getParameter("rows")); } catch (NumberFormatException e) {} try { SystemContext.setOrder(ServletActionContext.getRequest().getParameter("order")); SystemContext.setSort(ServletActionContext.getRequest().getParameter("sort")); SystemContext.setOffset(offset); SystemContext.setRows(rows); SystemContext.setPage(page); return arg.invoke(); } finally { SystemContext.removeOrder(); SystemContext.removeSort(); SystemContext.removeOffset(); SystemContext.removeRows(); SystemContext.removePage(); } } }
相关推荐
Filter过滤器与Interceptor拦截器有很多相似
1、在SpringBoot中如何实现自定义过滤器(Filter)和拦截器(Interceptor) 2、通过执行案例了解多个过滤器和拦截器的执行顺序 【本案例包含源码以及可执行的jar文件,源码文件建议使用IDEA进行导入查看学习,建议使用...
NULL 博文链接:https://rd-030.iteye.com/blog/2384106
主要介绍了浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...
拦截器和过滤器的区别 1、拦截器基于动态代理 , 过滤器基于函数回调 2、拦截器不依赖于servlet容器,通过动态代理实现,过滤器依赖于servlet容器 3、拦截器在方法前后,异常前后等调用,而过滤器只能在请求前和请求...
15.1 拦截器概述 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。 ...
以上的这些功能,通过一种名为责任链或者拦截器或者过滤器(语义上的区别而技术上没有什么区别,知道做了什么就行了)的设计模式可以实现,那么就来看看什么是责任链的设计模式。 以下内容参考北京尚学堂的马士兵...
idea软件。SpringBoot的拦截器的博客所写的例子。preHandle()方法的返回值true和false的详细区别还未描述
过滤器、拦截器、AOP、ControllerAdvcie的使用对比、执行顺序及代码教程的文章内的示例代码,文章...通过文章和这份代码,你可以学到过滤器、拦截器、AOP、ControllerAdvcie的基本使用方式,并了解到他们的执行顺序。
当前struts2的filter过滤到一个.action结尾的请求的时候,会把这个请求交给struts2内部的拦截器(interceptor) 2)拦截器起到什么作用 可以帮我们丰富action的功能,比自动类型转换(页面传一个String类型的id,接收的...
给大家介绍了spring-boot中如何定义过滤器、监听器和拦截器,对Spring Boot 编写Servlet、Filter、Listener、Interceptor的相关知识感兴趣的朋友一起看看吧
拦截器就像MVC的过滤器或者是ASP.NET Core middleware 一样,具有面向切面的思想,可以在调用服务的时候进行一些统一处理, 很适合在这里处理验证、日志等流程。本片文章就以记录日志为例来进行讲解。 二. ...
本资源是包含过滤器、拦截器的一个完整的MyEclipse项目。下载后可以直接导入MyEclipse中部署运行。 关于过滤器和拦截器: 过滤器--是在java web中,提前过滤掉一些信息或者提前设置一些参数,然后再传入servlet/...
过滤器,拦截器 Filter首先在DispatcherServlet的前面运行,而Interceptor在DispatcherServlet和Controllr(Handler)之间运行。 筛选 Web应用程序上下文功能 使用Spring函数困难 通常,实现编码,CORS,XSS,LOG,...
水槽时间戳过滤器 Flume拦截器根据事件标头中配置的passedTime检查时间戳字段有选择地过滤事件。 这支持基于包含或排除的过滤。 入门 克隆存储库 构建源 $ mvn clean package 创建拦截器目录并部署 $ mkdir -p /...
Springboot-filter-listener-interceptor 过滤器、拦截器、监听器 Springboot-mongodb 与MongoDB 整合 Springboot-elasticsearch 与 Elasticsearch 整合 Springboot-i18n SpringBoot 国际化配置 SpringBoot-multi-...
项目基于jdk1.8整合了springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap等技术,springboot+Listener(监听器),Filter(过滤器),Interceptor(拦截器),Servlet,springmvc静态资源,文件上传下载,多数据源切换,缓存...
数据验证:HTML5 的原生验证模式、Struts2 的 Validation 验证框架以及 Interceptor 拦截器、JavaEE 的 Filter 过滤器 学生端(修改个人信息、修改密码、查看成绩) 教师端(成绩查看与修改、录入成绩、所教科目管理...
学生成绩管理系统JSP课程设计 可实现学生和老师两个端的登录;...教师个人信息修改、密码修改、成绩录入与...3、数据验证:HTML5的原生验证模式、Struts2的Validation验证框架以及Interceptor拦截器、JavaEE的Filter过滤器