首页 > 编程知识 正文

java过滤器和监听器,java拦截器使用详解

时间:2023-05-04 02:27:37 阅读:17185 作者:931

一、个人资料1.什么是拦截器?

(1)在AOP中,用于在访问某个方法或字段之前进行拦截,然后在之前或之后施加某种操作。 拦截是AOP的实现策略。

)2)拦截器是动态监听Action呼叫的对象。 ActionScript提供了一种让开发人员可以定义在ActionScript之前和之后运行的代码以及阻止ActionScript执行的机制,同时还提供了一种提取ActionScript可重用部分的方法。

)3)实现原理:大部分通过代理调用。

(4)定制拦截器的步骤:

【1】定制实现Interceptor接口的类,继承抽象类AbstractInterceptor。

【2】将定义的拦截器登录到配置文件中。

【3】引入需要使用Action时定义的拦截器,为了方便,也可以将拦截器定义为默认拦截器。 所有的Action都将被这个拦截器拦截

2.什么是过滤器?

)1)过滤器是一个程序,也可以在相关servlet或jsp之前在服务器上运行。 可以将过滤器附加到一个或多个servlet或jsp页,并可以检查在这些资源中输入的请求信息。

)2)按常规方法调用资源

)3)利用修改后的请求信息调用资源

)4)调用资源,但在将响应发送到客户端之前进行修改

)5)阻止该资源调用,改为移动到另一资源,返回特定状态代码或生成替换输出。

)6)过滤器的基本原理:如果servlet用作过滤器,他可以处理客户的请求。 处理完成后,他将处理交给下一个过滤器。 以这种方式,在筛选器链中逐个处理客户的请求,直到将请求发送到目标。

二.拦截器与过滤器的区别(1)使用范围和规范不同

【1】filter由servlet规格规定,只能在web程序中使用。

【2】拦截器既可以用于web程序,也可以用于APP。 swing程序位于Spring容器中,并且支持Spring框架

)2)触发时机不同

顺序:过滤器servletinterceptorcontroller

在请求访问容器和请求访问servlet之前,将对过滤器进行预处理。 请求结束后返回也是在servlet处理结束后、返回前端之前进行过滤。 在请求servlet之前,在servlet处理完成后进行响应。

拦截器在方法到达控制器层之前生效

(3)滤波器的实现基于回调函数。 拦截器(代理模式)的实现基于反射,代理分为静态代理和动态代理,动态代理是拦截器的简单实现

窃听器什么时候使用? 什么时候使用过滤器?

【1】非spring项目时,不能使用拦截器。 只能用过滤器。

【2】在使用控制器前后,拦截器和过滤器都可以使用。

【3】在处理dispaterServlet前后,只能使用过滤器。

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

)窃听器可以访问action上下文、值和堆栈中的对象,但不能访问过滤器。

)阻塞器只对action请求起作用,过滤器几乎对所有请求起作用。

)7)拦截器可以获取IOC容器中的每个bean,但不能过滤。 向拦截器注入服务后,可以调用业务逻辑。

“过滤器”(Filter ) :过滤器顾名思义是用于过滤的,Java过滤器提供系统级过滤。 这意味着您可以过滤所有web请求。 这是拦截器做不到的。 在Java Web上,您传递给request,response预先过滤一些信息,预先设置一些参数,然后传递给servlet或struts操作以进行业务逻辑。 例如,过滤不正确的URL (不是log in.do的地址请求,或者如果用户没有登录就进行过滤。 过滤器进程是线性的,在传递url后进行检查,然后继续运行原始进程,并被下一个过滤器、servlet接收。

监听程序(监听器) :是Java的监听程序,也是系统级的监听程序。 侦听器将在web APP应用程序启动时启动。 Java侦听器经常用于c/s模式,用于处理特定事件。 监听在很多模式下都在使用。 例如,观察者模式是使用侦听器实现的。 例如,统计网站的在线人数。 例如,struts2可以通过监听启动。 servlet侦听器用于监视重要事件的发生。 侦听器对象可以在事件发生之前和之后进行必要的处理。

拦截器(Interceptor ):java拦截器提供非系统级拦截。 也就是说,在覆盖面上,拦截器虽然没有过滤器那么强大,但更有针对性。 Java拦截器基于Java反射机制实现,更准确的划分应该基于JDK实现的动态代理。 依赖于特定接口,并在运行时动态生成字节码。 拦截器是动态阻止Action调用的对象,提供开发人员在执行Action之前和之后执行代码的机制

可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后在之前或者之后加入某些操作。java的拦截器主要是用在插件上,扩展件上比如 Hibernate Spring Struts2等,有点类似面向切片的技术,在用之前先要在配置文件即xml,文件里声明一段的那个东西。

三.SpringBoot使用过滤器

两种方式:
1.使用spring boot提供的FilterRegistrationBean注册Filter
2.使用原生servlet注解定义Filter
两种方式的本质都是一样的,都是去FilterRegistrationBean注册自定义Filter

封装Filter

package com.theeternity.common.baseFilter;import javax.servlet.Filter;/** * @program: ApiBoot * @description: 封装Filter * @author: TheEternity Zhang * @create: 2019-02-17 13:08 */public interface MappingFilter extends Filter { String[] addUrlPatterns(); int order();}

自定义Filter

package com.theeternity.beans.filterConfig;import com.theeternity.common.baseFilter.MappingFilter;import lombok.extern.slf4j.Slf4j;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.servlet.*;import javax.servlet.FilterConfig;import java.io.IOException;/** * @program: ApiBoot * @description: 权限过滤器 * @author: TheEternity Zhang * @create: 2019-02-17 13:14 */public class AuthFilter implements MappingFilter { @Override public String[] addUrlPatterns() { return new String[]{"/*"}; } @Override public int order() { return 0; } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { }}

注册过滤器

package com.theeternity.beans.filterConfig;import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @program: ApiBoot * @description: 注册过滤器 * @author: TheEternity Zhang * @create: 2019-02-17 13:10 */@Configurationpublic class FilterConfig { @Bean public FilterRegistrationBean registFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); AuthFilter authFilter=new AuthFilter(); registration.setFilter(authFilter); registration.addUrlPatterns(authFilter.addUrlPatterns()); registration.setOrder(authFilter.order()); registration.setName("AuthFilter"); return registration; }} 四.SpringBoot使用拦截器

加粗样式封装Interceptor

package com.theeternity.common.baseInterceptor;import org.springframework.web.servlet.HandlerInterceptor;/** * @program: ApiBoot * @description: 封装Interceptor * @author: TheEternity Zhang * @create: 2019-02-15 17:49 */public interface MappingInterceptor extends HandlerInterceptor { String[] addPathPatterns(); String[] excludePathPatterns(); int order();}

自定义Interceptor

package com.theeternity.beans.interceptorConfig;import com.theeternity.common.baseInterceptor.MappingInterceptor;import org.springframework.stereotype.Component;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * @program: BoxApi * @description: 跨域拦截器 * @author: tonyzhang * @create: 2018-12-21 14:44 */@Componentpublic class CrossOriginInterceptor implements MappingInterceptor { @Override public String[] addPathPatterns() { return new String[]{"/**"}; } @Override public String[] excludePathPatterns() { return new String[0]; } @Override public int order() { return 0; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("允许的头信息"+request.getHeader("Origin")); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "*"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); //是否允许浏览器携带用户身份信息(cookie) response.setHeader("Access-Control-Allow-Credentials","true"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) throws Exception { }}

注册Interceptor

package com.theeternity.beans.interceptorConfig;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/** * @program: ApiBoot * @description: 拦截器注册 * @author: TheEternity Zhang * @create: 2019-02-15 17:55 */@Configurationpublic class InterceptorConfig implements WebMvcConfigurer { @Autowired private CrossOriginInterceptor crossOriginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(crossOriginInterceptor).addPathPatterns(crossOriginInterceptor.addPathPatterns()); }}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。