← 返回首页
SpringBoot基础教程(二十二)
发表时间:2020-10-27 12:15:31
过滤器(Filter)

过滤器:Filter是Servlet技术中最实用的技术,过滤器作用就是过滤请求。Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter过滤客户的请求,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

SpringBoot配置过滤器的步骤: 自定义Filter 使用Servlet3.0的注解进行配置第三步的@WebFilter就是3.0的注解。

1).启动类里面增加 @ServletComponentScan,进行扫描


@SpringBootApplication
@ServletComponentScan("com.oracle.filter") //扫描有过滤器的包
public class MySpringBootApplication {

    public static void main(String[] args) {
        //SpringApplication.run(MySpringBootApplication.class, args);

        AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
        new SpringApplicationBuilder(MySpringBootApplication.class)//
                .main(SpringVersion.class) // 这个是为了可以加载 Spring 版本
                .bannerMode(Banner.Mode.CONSOLE)// 控制台打印
                .run(args);
    }

}

2).新建一个Filter类,implements Filter,并实现对应的接口方法。 3).@WebFilter 标记一个类为filter,被spring进行扫描urlPatterns:拦截规则,支持正则。 4).控制chain.doFilter的方法的调用,来实现是否通过放行不放行,web应用resp.sendRedirect("/index.html");场景:权限控制、用户登录(非前端后端分离场景)等。

package com.oracle.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
// /*表示过滤所有的请求
@WebFilter(filterName = "myFilter", urlPatterns = "/*") 
//用户自定义的一个过滤器
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行了MyFilter过滤器.....");
        //放行
        filterChain.doFilter(servletRequest, servletResponse);
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    @Override
    public void destroy() {

    }
}

5).编写控制器UsersController,测试发送请求时是否执行了过滤器。

@RestController
@RequestMapping("users")
public class UsersController {

    @Resource
    private UsersService usersService;

    @GetMapping("/")
    public JsonData login(String username, String password){

        Users loginUser = usersService.login(username,password);
        if(loginUser!=null){
            return JsonResult.success(loginUser,"loginSuccess");
        }
        return JsonResult.fail("loginFailure");
    }

    @PostMapping("/")
    public JsonData reg(@RequestBody Users user){
        Users regUser =  usersService.reg(user);
        if(regUser!=null){
            return JsonResult.success(regUser,"regSuccess");
        }
        return JsonResult.fail("regFailure");
    }
}

使用post测试用户登录接口,返回登录成功的用户数据,并且在控制层显示有过滤器的输出信息。