Springboot——过滤器

简介

过滤器(Filter)是Servlet技术中最实用的技术,它依赖于Servlet容器,在实现上基于函数回调,可以对几乎所有请求进行过滤,其生命周期由Servlet管理。
其主要可用于以下方面:
1、最常见的字符集编码的过滤。
2、对web服务器管理的所有web资源(例如Jsp, Servlet, 静态图片文件或静态 html 文件等)进行拦截,从而实现一些特殊的功能。例如:实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
3、用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。
使用Filter的完整流程:
Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

使用

权限访问控制
方式1、使用自带的FilterRegistrationBean完成设置
(1)创建一个自定义过滤器MyFilter

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }
    @Override
    public void destroy() { }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponseWrapper responseWrapper = new HttpServletResponseWrapper((HttpServletResponse) servletResponse);
        //如果路径包含/login或者/index则放行进行正常访问,否则就重定向到login页面
        if(request.getRequestURI().indexOf("/login")!=-1 || request.getRequestURI().indexOf("/index")!=-1){
            //在过滤器中修改request,这是过滤器的一大特色。待到达控制层之后,控制层可以取到这里新设置的值
            request.setAttribute("attr","过滤器中新设置的值");
            filterChain.doFilter(request,servletResponse);
        }else{
            responseWrapper.sendRedirect("/login");
        }
    }
}

(2)创建配置类MyMvcConfig

@Configuration
public class MyMVCConfig {
    @Bean
    public FilterRegistrationBean filterRegist(){
        FilterRegistrationBean frbean = new FilterRegistrationBean();
        frbean.setFilter(new MyFilter());
        frbean.addUrlPatterns("/*");
        return frbean;
    }
}

(3)创建控制类FilterController

@RestController
public class FilterController {
    @RequestMapping("/login")
    public String login(){
        return "登录页面";
    }
    @RequestMapping("/shop")
    public String shop(){
        return "商品页面";
    }
    @RequestMapping("/index")
    public String index(HttpServletRequest request){
        System.out.println("attr="+request.getAttribute("attr"));
        return "首页";
    }
}

方式2、使用@WebFilter注解完成设置
(1)创建一个自定义过滤器MyFilter

@WebFilter
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
    @Override
    public void destroy() {}
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponseWrapper responseWrapper = new HttpServletResponseWrapper((HttpServletResponse) servletResponse);
        //如果路径包含/login或者/index则放行进行正常访问,否则就重定向到login页面
        if(request.getRequestURI().indexOf("/login")!=-1 || request.getRequestURI().indexOf("/index")!=-1){
            //在过滤器中修改request,这是过滤器的一大特色。待到达控制层之后,控制层可以取到这里新设置的值
            request.setAttribute("attr","过滤器中新设置的值");
            filterChain.doFilter(request,servletResponse);
        }else{
            responseWrapper.sendRedirect("/login");
        }
    }
}

(2)在启动类上添加@ServletComponentScan注解

@ServletComponentScan
@SpringBootApplication
public class Filterdemo2Application {
    public static void main(String[] args) {
        SpringApplication.run(Filterdemo2Application.class, args);
    }
}

(3)创建控制类FilterController(同方式1)

你可能感兴趣的:(Springboot——过滤器)