导航:首页 > 净水问答 > ssm框架拦截器和过滤器

ssm框架拦截器和过滤器

发布时间:2023-07-13 12:01:06

『壹』 spring mvc拦截器 和 过滤器哪个先执行

先执行filter,只有限制性过滤器之后才可以进入容器执行拦截

『贰』 SpringMVC的拦截器和过滤器的区别与联系

首先给介绍下过滤器和拦截器的区别:
(1)拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
(2)拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
(3)拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
(4)拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
(5)在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
(6)拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,
可以调用业务逻辑。
然后进行分析下:
1.过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处
理,并且在请求结束返回给前端这之间进行后期处理。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("before...");
chain.doFilter(request, response);
System.out.println("after...");
}

chain.doFilter(request, response);这个方法的调用作为分水岭。事实上调用Servlet的doService()方法是在
chain.doFilter(request, response);这个方法中进行的。

2.拦截器是被包裹在过滤器之中的。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}

a.preHandle()这个方法是在过滤器的chain.doFilter(request, response)方法的前一步执行,也就是在
[System.out.println("before...")][chain.doFilter(request, response)]之间执行。
b.preHandle()方法之后,在return ModelAndView之前进行,可以操控Controller的ModelAndView内容。
c.afterCompletion()方法是在过滤器返回给前端前一步执行,也就是在[chain.doFilter(request, response)]
[System.out.println("after...")]之间执行。
3.SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法
中执行的。所以过滤器、拦截器、service()方法,dispatc()方法的执行顺序应该是这样的如下图:

『叁』 过滤器和拦截器的区别

拦截器与过来滤器的区别 :
拦截自器是基于java的反射机制的,而过滤器是基于函数回调。
拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
执行顺序 :过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。个人认为过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;Action处理完成返回后,拦截器还可以做其他过程(还没想到要做啥),再向上返回到过滤器的后续操作。

『肆』 spring过滤器和拦截器的区别

(1)过滤器:

依赖于servlet容器,是JavaEE标准,是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等

关于过滤器的一些用法可以参考我写过的这些文章:

『伍』 SpringMVC的拦截器和过滤器的区别与联系

1、首先要明确什么是拦截器、什么是过滤器
1.1 什么是拦截器:
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts2中称为拦截器栈 Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
1.2. 拦截器的实现原理:
大部分时候,拦截器方法都是通过代理的方式来调用的。Struts2的拦截器实现相对简单。当请求到达Struts2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。
1.3 什么是过滤器
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:
①以常规的方式调用资源(即,调用servlet或JSP页面)。
②利用修改过的请求信息调用资源。
③调用资源,但在发送响应到客户机前对其进行修改。
④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。

1.4 Servlet过滤器的基本原理
在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。例如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数据进行统一编码。这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。

2、拦截器与过滤器的区别 :
1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

拦截器的代码实现(以struts2为例):
1、在xml文件中如何定义拦截器
<interceptors>
<interceptor name="filterIPInterceptor"
class="com.xxxx.web.FilterIPActionInterceptor" />
<interceptor-stack name="filterIPStack">
<interceptor-ref name="defaultStack" />

<interceptor-ref name="filterIPInterceptor" />
</interceptor-stack>
</interceptors>

2、怎么遍别写自定义拦截器

public class FilterIPActionInterceptor extends AbstractInterceptor
{
/** 日志控制. */
private final Log log = LogFactory.getLog(getClass());

/**
* @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
*/
@Override
@SuppressWarnings("unchecked")
public String intercept(ActionInvocation invocation) throws Exception
{
String result = null;
// 获得当前方法名.
String methodName = invocation.getInvocationContext().getName();
String currIp = null;
try
{
if (invocation.getAction() instanceof PortletAction)
{
PortletAction action = (PortletAction) invocation.getAction();
currIp = action.getRequest().getRemoteAddr();
}
String ip = ApplicationResource.getHotValue("ALLOW_CACHE_IP");

if (StringUtils.isBlank(ip) || StringUtils.isBlank(currIp))
{
log.error("允许刷新的IP不存在或当前请求的IP非法.");
throw new NoAllowIPException();
}
else
{
String[] ips = ip.split(",");
boolean errorIp = true;
for (String s : ips)
{
if (s.equals(currIp))
errorIp = false;
}
// 判断IP
if (errorIp)
throw new NoAllowIPException();
}
result = invocation.invoke();//调用被拦截的方法
}
catch (Exception e)
{
log.error("异常类名:" + invocation.getAction().getClass());
log.error("异常方法:" + methodName, e);
throw e;
}

return result;
}

}

3、怎么编写过滤器

1、在web.xml里面配置自定义的拦截器
<filter>
<filter-name>Redirect Filter</filter-name>
<filter-class>com.xx.filter.RedirectFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>Redirect Filter</filter-name>
<url-pattern>/xx/xx/*</url-pattern>

</filter-mapping>

2、如何编写自定义的拦截器
public class RedirectFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
// 获取URL
Long startTime = null;
if (log.isDebugEnabled())
{
startTime = System.currentTimeMillis();
}
HttpServletRequest httpRequest = (HttpServletRequest) request;
String url = httpRequest.getRequestURL().toString();
if (url == null || url.trim().length() == 0) {
return;
}
if (url.indexOf(luceneCreateMapping) != -1
|| url.indexOf(luceneSearchMapping) != -1) {
doFilterForxxx(request, response, url);
} else {
doxxxx(request, response, url);
}
if (log.isDebugEnabled())
{
long endTime = System.currentTimeMillis();
Thread currentThread = Thread.currentThread();
String threadName = currentThread.getName();
log.debug("[" + threadName + "]" + "< "
+ this.getClass().getName() + " " + url + " "
+ (endTime - startTime) + " ms");
}
// 激活下一个Filter
filterChain.doFilter(request, response);

}
}

『陆』 判断用户登录是用springmvc 拦截器还是filter

在struts2中用过filter过滤器,在springmvc中还有拦截器,它们都能过滤请求,但是到底有什么区别呢?
一、定义

拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
过滤器:是在javaweb中,你传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符.。
二、xml文件配置
1.filter
该过滤器的方法是创建一个类XXXFilter实现此接口,并在该类中的doFilter方法中声明过滤规则,然后在配置文件web.xml中声明他所过滤的路径

<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>

<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>

<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
2.Interceptor

它也要实现HandlerInterceptor 接口,这里只介绍方法注解配置

<!-- 拦截器 -->
<mvc:interceptors>
<!-- 多个拦截器,顺序执行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" /><!-- 如果不配置或/*,将拦截所有的Controller -->
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!-- 拦截器 -->
<mvc:interceptors>
<!-- 多个拦截器,顺序执行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" /><!-- 如果不配置或/*,将拦截所有的Controller -->
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>

三、具体区别

filter
Interceptor

多个的执行顺序
根据filter mapping配置的先后顺序
按照配置的顺序,但是可以通过order控制顺序

规范
在Servlet规范中定义的,是Servlet容器支持的
Spring容器内的,是Spring框架支持的。

使用范围
只能用于Web程序中
既可以用于Web程序,也可以用于Application、Swing程序中。

深度
Filter在只在Servlet前后起作用
拦截器能够深入到方法前后、异常抛出前后等

四、总结
两者的本质区别:拦截器是基于java的反射机制的,而过滤器是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,他都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。

『柒』 SpringBoot系列:4.session和鉴权—过滤器和拦截器

本文主要介绍下,SpringBoot的web项目中,

使用redis保存并共享session,可以实现集群内的登录信息共享。SpringBoot项目中,通过在 application.yml 增加redis的配置,即可实现对session的存储和修改。

那么session是在何时被处理的?session的key又是如何生成的呢?这里实际使用了web项目中的过滤器。

在SpringBoot的web项目中,启动的tomcat在处理http请求时,有一个很重要的类: ApplicationFilterChain 。每个http请求在处理时都会通过这个类。这个类负责按顺序处理全部已注册的 Filter ,也就是过滤器。通过实现tomcat中的 Filter 接口,就可以定义一个过滤器。

在SpringBoot中的web项目中,有几个默认的过滤器,其中一个就是用来处理session的: SessionRepositoryFilter

SessionRepositoryFilter 主要的成员是两个接口,都有多个可选的实现类,通过这两个成员就实现了对session的解析。

当然也可以实现一个自己的过滤器,主要有两种方式:

下面我们使用第一种方式实现一个限制指定IP的过滤器:

通过过滤器解析session后,就可以根据session中保存的内容,判断当前登录的用户权限。

这里是通过一个拦截器实现的,在拦截器中可以直接通过 HttpServletRequest.getSession() 方法直接获取session的信息。

一个简单的拦截器实现如下:

定义之后要注册到处理流程中:

先来看下过滤器和拦截器的执行顺序,通过debug得到的执行顺序如下图:

在大部分场景中,过滤器和拦截器都是可互换的,使用哪个都可以。

过滤器和拦截器也有些区别,这里不谈实现和规范的差异,就说下使用中可能涉及的区别:

最后对于过滤器和拦截器的应用场景,说下个人的总结。基于执行顺序,方法参数和SpringBoot中的一些实现类来看。

以上内容属个人学习总结,如有不当之处,欢迎在评论中指正

『捌』 springmvc过滤器和拦截器的区别

拦截器与过滤器的区别 :
1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

拦截器的代码实现(以struts2为例):
1、在xml文件中如何定义拦截器
<interceptors>
<interceptor name="filterIPInterceptor"
class="com.xxxx.web.FilterIPActionInterceptor" />
<interceptor-stack name="filterIPStack">
<interceptor-ref name="defaultStack" />

<interceptor-ref name="filterIPInterceptor" />
</interceptor-stack>
</interceptors>

2、怎么遍别写自定义拦截器

public class FilterIPActionInterceptor extends AbstractInterceptor
{
/** 日志控制. */
private final Log log = LogFactory.getLog(getClass());

/**
* @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
*/
@Override

『玖』 spring mvc 框架中拦截web请求是通过什么技术

可以是基于url

基于URL

也可以是基于Spring boot

1.拦截器介绍


Web开发中,可以用Filter(过滤器)和 HandlerInterceptor(拦截器) 来过滤web请求,都能对客户端发来的请求进行处理。


过滤器:是一个服务器端的组件,它可以截取用户端的请求和响应信息,并对这些信息过滤。


Spring MVC 中的拦截器(Interceptor)类似于 Servlet 开发中的过滤器 Filter,它主要用于拦截用户请求并作相应的处理,它也是 AOP 编程思想的体现,底层通过动态代理模式完成。听说:只有经过DispatcherServlet 的请求,才会走拦截器链,我们自定义的Servlet 请求是不会被拦截的


参考 Spring:过滤器filter、拦截器interceptor、和AOP的区别与联系


原理

Filter:过滤器是基于函数回调。

HandlerInterceptor:拦截器是基于java的反射机制,使用代理模式

作用域不同

Filter:过滤器依赖于servlet容器,只能在 servlet容器,web环境下使用。跟Spring没有关系

HandlerInterceptor:拦截器依赖于spring容器,可以在spring容器中调用,不管此时Spring处于什么环境

过滤内容

Filter:过滤器可以对几乎所有的请求起作用(可以保护资源)

HandlerInterceptor:拦截器只能对action起作用

细粒度的不同

Filter:过滤器的控制比较粗,只能在请求进来时进行处理,对请求和响应进行包装

HandlerInterceptor:拦截器提供更精细的控制,可以在controller对请求处理之前或之后被调用,也可以在渲染视图呈现给用户之后,以及request全部结束之后,都可以拦截到

中断

Filter:过滤器比较复杂,需要处理请求和响应对象来引发中断,需要额外的动作,比如将用户重定向到错误页面

HandlerInterceptor:不能通过拦截器修改request内容,但是可以通过抛出异常或者preHandle方法内返回 false 进行中断来暂停request执行

小结

如果过滤器和拦截器同时存在:执行顺序:过滤前-拦截前-Action处理-拦截后-过滤后

替代:过滤器能做的,拦截器基本上都能做

————————————————

原文链接:https://blog.csdn.net/dreamstar613/article/details/106746128

阅读全文

与ssm框架拦截器和过滤器相关的资料

热点内容
如何测试滤芯的消耗时间 浏览:850
连接空气滤芯盒那个壶叫什么 浏览:552
南昌市污水处理费怎么算的 浏览:926
浏览器看视频提升 浏览:154
厂家纯净水桶怎么清洗 浏览:466
污水太硬怎么去除 浏览:15
干洗机蒸馏锅炉温度开路 浏览:496
九亭污水处理 浏览:753
饮水机下面接水叫什么 浏览:120
中央净水如何设置自动冲洗 浏览:430
饮水机小桶多少毫升卡 浏览:546
H3C3600mac过滤 浏览:74
步进式开水器除垢视频 浏览:20
嗯纯水为什么发涩 浏览:775
纸坊净水机质量怎么样 浏览:356
废水ph值11 浏览:73
逆流再生离子交换再生步骤 浏览:639
建果酒厂蒸馏设备多少钱 浏览:691
用探针检测蒸馏水水位 浏览:380
含苏打的纯净水为什么不结冰 浏览:564