zoukankan      html  css  js  c++  java
  • SpringBoot入门教程(十一)过滤器和拦截器

    在做web开发的时候,过滤器(Filter)拦截器(Interceptor)很常见,通俗的讲,过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西;拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。

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

    java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。

    v过滤器demo

    1.1 创建MyTestFilter

    package com.demo.Filter;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    
    /**
     * Created by toutou on 2018/10/27.
     */
    @Slf4j
    @Component
    public class MyTestFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("1111111111111111111111111"); log.info("filter 初始化"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub System.out.println("2222222222222222222222222"); log.info("doFilter 请求处理"); //TODO 进行业务逻辑 //链路 直接传给下一个过滤器 chain.doFilter(request, response); } @Override public void destroy() { System.out.println("33333333333333333333333333"); log.info("filter 销毁"); } }

    1.2 查看idea启动日志

    1.3 启动tomcat,查看日志。

    如果需要针对指定路径才让过滤器生效,可以参考WebConfig类。

    v拦截器demo

    2.1 MyTestInterceptor

    package com.demo.Filter;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    /**
     * Created by toutou on 2018/10/27.
     */
    @Component
    public class MyTestInterceptor implements HandlerInterceptor {
        /*
         * 视图渲染之后的操作
         */
        @Override
        public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
                throws Exception {
    
        }
    
        /*
         * 处理请求完成后视图渲染之前的处理操作
         */
        @Override
        public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
                throws Exception {
    
        }
    
        /*
         * 进入controller层之前拦截请求
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
            System.out.println("MyTestInterceptor  1111111111");
            return true;
        }
    }

    2.2 WebConfig

    package com.demo.Filter;
    
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    import javax.annotation.Resource;
    
    /**
    * Created by toutou on 2018/10/27.
    */
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Resource
        private MyTestInterceptor myTestInterceptor;
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            // 自定义拦截器,添加拦截路径和排除拦截路径
            registry.addInterceptor(myTestInterceptor).addPathPatterns("/show");
        }
    
        @Bean
        public FilterRegistrationBean testFilterRegistration(MyTestFilter myTestFilter) {
            FilterRegistrationBean registration = new FilterRegistrationBean();
            registration.setFilter(myTestFilter);//添加过滤器
            registration.addUrlPatterns("/show");//设置过滤路径,/*所有路径
            //registration.addInitParameter("name", "alue");//添加默认参数
            registration.setName("MyFilter");//设置优先级
            registration.setOrder(1);//设置优先级
            return registration;
        }
    }

    运行效果:

    SpringBoot入门教程(十一)过滤器和拦截器

    v注意事项

    注意设置启动类的扫描路径。

    package com.demo.hellospringboot;
    
    
    import lombok.extern.slf4j.Slf4j;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ComponentScan;
    
    @SpringBootApplication
    @ComponentScan(basePackages = {"com.demo"})
    @MapperScan(basePackages = {"com.demo.dao"})
    @Slf4j
    public class HellospringbootApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(HellospringbootApplication.class, args);
        }
    }

    v源码地址

    https://github.com/toutouge/javademosecond/tree/master/hellospringboot


    作  者:请叫我头头哥
    出  处:http://www.cnblogs.com/toutou/
    关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
    版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
    特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是作者坚持原创和持续写作的最大动力!

  • 相关阅读:
    CentOS下Apache开启Rewrite功能
    CentOS下Apache配置多域名或者多端口映射
    CentOS配置SVN服务器
    Windows下Apache配置域名
    PHP 返回13位时间戳
    主成分分析(PCA)特征选择算法详解
    均值、方差、标准差及协方差、协方差矩阵详解
    Jackson序列化日期类型的属性
    监控JVM内存使用情况,剩余空间小于2M时报警
    java 7中新增的CPU和负载的监控
  • 原文地址:https://www.cnblogs.com/toutou/p/9831678.html
Copyright © 2011-2022 走看看