写点什么

神仙打架!阿里 p7 码农跳到华为,看到这份 SpringBoot 资料马上收藏

发布于: 2021 年 05 月 07 日
神仙打架!阿里p7码农跳到华为,看到这份SpringBoot资料马上收藏

今日分享开始啦,请大家多多指教~


今天给大家分享的是 SpringBoot 过滤器、拦截器、监听器对比及使用场景,这是我目前了解到的比较重要的知识点。话不多说,正文开始啦~


一、关系图理解


二、区别


1.过滤器


过滤器是在 web 应用启动的时候初始化一次, 在 web 应用停止的时候销毁


可以对请求的 URL 进行过滤, 对敏感词过滤


挡在拦截器的外层


实现的是 javax.servlet.Filter 接口 ,是 Servlet 规范的一部分


在请求进入容器后,但在进入 servlet 之前进行预处理,请求结束是在 servlet 处理完以后


依赖 Web 容器


会多次执行


1.1HttpServletRequestWrapper


在请求到达之前对 request 进行修改

package com.dingwen.lir.filter;import lombok.extern.slf4j.Slf4j;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.util.Arrays;/** *  在请求到达之前对 request 进行修改 */@Slf4jpublic class RequestWrapper extends HttpServletRequestWrapper {    public RequestWrapper(HttpServletRequest request) {        super(request);        log.info("RequestWrapper");    }    @Override    public String getParameter(String name) {        // 可以对请求参数进行过滤        return super.getParameter(name);    }    @Override    public String[] getParameterValues(String name) {        // 对请求参数值进行过滤//        String[] values =super.getRequest().getParameterValues(name);//        return super.getParameterValues(name);        return "t e s t".split(" ");    }}
复制代码

1.2 OncePerRequestFilter


OncePerRequestFilter,顾名思义,它能够确保在一次请求中只通过一次 filter




1.3 配置


package com.dingwen.lir.configuration;import com.dingwen.lir.filter.RequestFilter;import com.dingwen.lir.filter.RequestWrapper;import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.servlet.Filter;/** * 过滤器配置类 */@Configurationpublic class FilterConfig {    @Bean    public RequestFilter requestFilter(){        return new RequestFilter();    }    @Bean    public FilterRegistrationBean<RequestFilter> registrationBean() {        FilterRegistrationBean<RequestFilter> registrationBean = new FilterRegistrationBean<>();        registrationBean.setFilter(requestFilter());        registrationBean.addUrlPatterns("/filter/*");        registrationBean.setName("RequestFilter");        //过滤器的级别,值越小级别越高越先执行        registrationBean.setOrder(1);        return registrationBean;    }}
复制代码


2.拦截器


实现 org.springframework.web.servlet.HandlerInterceptor 接口,动态代理


拦截器应用场景, 性能分析, 权限检查, 日志记录


是一个 Spring 组件,并由 Spring 容器管理,并不


依赖 Tomcat 等容器,是可以单独使用的。不仅能应用在 web 程序中,也可以用于 Application、Swing 等程序中


是在请求进入 servlet 后,在进入 Controller 之前进行预处理的,Controller 中渲染了对应的视图之后请求结束


2.1 登录拦截




2.2 配置




3.监听器


实现 javax.servlet.ServletRequestListener, javax.servlet.http.HttpSessionListener, javax.servlet.ServletContextListener 等等接口


主要用来监听对象的创建与销毁的发生, 比如 session 的创建销毁, request 的创建销毁, ServletContext 创建销毁


三、注意


1.静态资源问题


SpringBoot2.x 以后版本拦截器也会拦截静态资源,在配置拦截器是需要将姿态资源放行。


/* * 拦截器依赖于Spring容器,此处拦截了所有,需要对静态资源进行放行 */@Overridepublic void addInterceptors(InterceptorRegistry registry) {    registry.addInterceptor(new PageInterceptor()).addPathPatterns("/**")            .excludePathPatterns("/page/login", "/user/login","/page/ajax","/static/**");}
复制代码


SpringBoot2.x 自定义静态资源映射


spring:  mvc:    static-path-pattern: /static/**
复制代码


默认目录


classpath:/META-INF/resources


classpath:/resources


classpath:/static


classpath:/public


优先级:META-INF/resources > resources > static > public


2.登录拦截 ajax 重定向


由于 ajax 是异步的,还在当前页面进行的局部请求。当拦截到登录请求时,即使重定向也无法生效。需采用服务端给地址由前端进行跳转。详细见登录拦截器代码。



四、测试


1.拦截器测试


1.1 启动项目访问首页


由于没有登录,直接重定向到了登录页


1.2 输入用户名密码完成登录,调转到用户页



此时在访问首页


1.2 退出登录


成功退出后,访问为授权的页面也相对会被重定向到登录页


1.3 ajax 未授权访问测试


点击访问 user ,由于未登录,没有全权访问。在前端进行了页面跳转,转到了登录页。


2.过滤器测试


可以看到过滤器进行了相对应的处理,重写的 getParameterValues()也生效了。配合使用 HttpServletRequestWrapper & OncePerRequestFilter 实现了对 request 的修改。


小结


主要内容是过滤器,拦截器,监听器这几个知识点,也给大家测试了一下。


今日份分享已结束,请大家多多包涵和指点!

用户头像

还未添加个人签名 2021.04.20 加入

Java工具与相关资料获取等WX: pfx950924(备注来源)

评论

发布
暂无评论
神仙打架!阿里p7码农跳到华为,看到这份SpringBoot资料马上收藏