一、拦截器与过滤器的区别:
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拦截器有很多相似
在Java Web开发中,Spring MVC框架提供了两种机制来处理请求:拦截器(Interceptor)和过滤器(Filter)。它们都是在请求被控制器处理之前和之后执行的一系列预处理和后处理操作,但它们在功能、使用场景和工作原理...
1、在SpringBoot中如何实现自定义过滤器(Filter)和拦截器(Interceptor) 2、通过执行案例了解多个过滤器和拦截器的执行顺序 【本案例包含源码以及可执行的jar文件,源码文件建议使用IDEA进行导入查看学习,建议使用...
在本文中,我们将深入探讨如何在Spring Boot应用中使用拦截器(Interceptor)和过滤器(Filter)来处理用户的登录session。这两个组件都是Spring框架的重要部分,它们在处理HTTP请求和响应时发挥着关键作用。 首先...
在现代软件开发过程中,特别是Web应用程序中,为了实现灵活高效的业务逻辑处理及控制流管理,常常会使用到两种设计模式:拦截器(Interceptor)与过滤器(Filter)。这两种技术虽然在功能上有一定的相似之处,但其...
Struts2 中的拦截器(Interceptor)和过滤器(Filter)是两个不同的概念,虽然它们都可以影响请求的处理过程,但它们的作用域、执行顺序和实现机制都有所不同。 拦截器(Interceptor) 拦截器是 Struts2 框架中的...
本项目主要关注的是如何使用过滤器(Filter)和拦截器(Interceptor)来实现登录页面的控制与跳转。以下是对这些知识点的详细说明: 1. **SpringBoot**: SpringBoot是Spring框架的一个子项目,旨在简化Spring应用...
在本项目中,过滤器可能与拦截器协同工作,同样负责验证用户登录状态。通常,过滤器通过实现`javax.servlet.Filter`接口并重写`doFilter()`方法来实现。过滤器可以全局应用,对所有请求或特定URL模式生效。 **非法...
在本文中,我们将深入探讨SpringMVC的拦截器(Interceptor)和Servlet的过滤器(Filter)之间的差异和联系,以及如何配置SpringMVC的拦截器。理解这两者的区别对于开发高效且安全的Web应用程序至关重要。 首先,让我们...
本文将深入探讨Struts框架中的拦截器(Interceptor)以及它与过滤器(Filter)的区别,并结合文件上传功能进行讲解。 1. 拦截器与过滤器的概念 - **拦截器**:在Struts2框架中,拦截器是基于AOP(面向切面编程)的...
在Web开发领域,过滤器(Filter)和拦截器(Interceptor)是两种常见的机制,它们用于在请求被实际处理之前或之后执行特定的操作。这两种技术在Java Web应用中尤为常见,尤其是使用Servlet API或者Spring框架的时候...
### Struts 2 过滤器与拦截器的深入解析 #### 一、概述 在Struts 2框架中,过滤器(Filter)和拦截器(Interceptor)都是用于处理请求的关键组件,但它们之间存在本质的区别。正确理解这些差异有助于开发者更高效地...
**拦截器与过滤器的区别** 1. **实现机制**:拦截器基于Java反射,而过滤器基于函数回调。 2. **依赖关系**:过滤器依赖于Servlet容器,而拦截器不依赖。 3. **作用范围**:拦截器只对Action请求起作用,而过滤器...
在Java Web开发中,拦截器(Interceptor)和过滤器(Filter)是两种常见的处理请求和响应的机制。它们都在请求到达目标Servlet之前进行介入,但各自有着不同的应用场景和功能特点。参数读取则是从客户端传递到服务器...
综上所述,"拦截器过滤器.rar"这个压缩包文件是一个关于如何在Web应用中实施拦截器和过滤器的学习资源,涵盖了拦截器与过滤器的基本概念、用法以及可能的问题处理。通过学习和实践这些示例,你可以提升自己在处理...
过滤器和拦截器的区别 过滤器和拦截器是两个常见的概念在 Java Web 开发中,它们都可以用来对请求进行处理和过滤,但是它们之间有着本质的区别。 首先,从机制上来说,拦截器是基于 Java 的反射机制的,而过滤器是...
拦截器(Interceptor)和过滤器(Filter)的区别: 1. 拦截器是基于 Java 的反射机制的,而过滤器是基于函数回调。 2. 过滤器依赖于 Servlet 容器,而拦截器不依赖于 Servlet 容器。 3. 拦截器只能对 Action 请求起...
拦截器和过滤器的区别 1、拦截器基于动态代理 , 过滤器基于函数回调 2、拦截器不依赖于servlet容器,通过动态代理实现,过滤器依赖于servlet容器 3、拦截器在方法前后,异常前后等调用,而过滤器只能在请求前和请求...
拦截器(Interceptor)和过滤器(Filter)在SpringBoot中用于在请求处理之前或之后执行特定任务,例如日志记录、权限检查或请求数据处理等。本文主要介绍如何在SpringBoot中使用拦截器和过滤器,以及它们之间的区别...