首页 > 其他分享 >Springboot:拦截器和过滤器

Springboot:拦截器和过滤器

时间:2023-01-10 16:11:46浏览次数:54  
标签:拦截器 return Springboot request String 过滤器 public 请求

项目的开发中,在某些情况下,我们需要对客户端发出的请求进行拦截,常用的API拦截方式有Fliter,Interceptor,ControllerAdvice以及Aspect。

请求从Filter-->>Controller的过程中,只要在指定的环节出现异常,可以通过对应的机制进行处理。反之在任何一个环节如果异常未处理则不会进入下一个环节,会直接往外抛,例如在ControllerAdvice验证发生异常则会抛给Filter,如果Filter未处理,则最终会由Tomcat容器抛出。

过滤器:Filter
可以获得Http原始的请求和响应信息,但是拿不到响应方法的信息。
注册Filter,在springboot当中提供了FilterRegistrationBean类来注册Filter

点击查看代码
/**
 * 检查用户是否已经完成登录
 */
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter{
    //路径匹配器,支持通配符
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
 
        //1、获取本次请求的URI
        String requestURI = request.getRequestURI();// /backend/index.html
 
        log.info("拦截到请求:{}",requestURI);
 
        //定义不需要处理的请求路径
        String[] urls = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };
 
 
        //2、判断本次请求是否需要处理
        boolean check = check(urls, requestURI);
 
        //3、如果不需要处理,则直接放行
        if(check){
            log.info("本次请求{}不需要处理",requestURI);
            filterChain.doFilter(request,response);
            return;
        }
 
        //4、判断登录状态,如果已登录,则直接放行
        if(request.getSession().getAttribute("employee") != null){
            log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
            filterChain.doFilter(request,response);
            return;
        }
 
        log.info("用户未登录");
        //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;
 
    }
 
    /**
     * 路径匹配,检查本次请求是否需要放行
     * @param urls
     * @param requestURI
     * @return
     */
    public boolean check(String[] urls,String requestURI){
        for (String url : urls) {
            boolean match = PATH_MATCHER.match(url, requestURI);
            if(match){
                return true;
            }
        }
        return false;
    }
}

最后在Springboot主启动类中添加@ServletComponentScan

点击查看代码
@Slf4j
@SpringBootApplication
@ServletComponentScan //使用过滤器需加此注解
public class ReggieApplication {
    public static void main(String[] args) {
        SpringApplication.run(ReggieApplication.class,args);
        log.info("项目启动成功...");
    }
}

拦截器:Interceptor
可以获得Http原始的请求和响应信息,也拿得到响应方法的信息,但是拿不到方法响应中的参数的值。
在web开发中,拦截器是经常用到的功能。它可以帮我们验证是否登陆、预先设置数据以及统计方法的执行效率等。在spring中拦截器有两种,第一种是HandlerInterceptor,第二种是MethodInterceptor。HandlerInterceptor是SpringMVC中的拦截器,它拦截的是Http请求的信息,优先于MethodInterceptor。而MethodInterceptor是springAOP的。前者拦截的是请求的地址,而后者是拦截controller中的方法

拦截器特点
1.请求到达经过拦截器,响应回来也经过拦截器
2.只能拦截控制器相关请求不能拦截JSP请求
3.拦截器可以中断用户请求轨迹

拦截器作用
将多个控制器中共有代码放入拦截器可以减少控制器代码冗余

springmvc中开发拦截器步骤
1.实现HandlerInterceptor接口(或继承其实现类)或者实现实现WebRequestInterceptor(或继承其实现类)。
2.XML文件中配置拦截器

创建一个拦截器实现HandlerInterceptor接口

点击查看代码
package wmq.fly.mybatis.interceptor;
 
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;
 
@Component
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 预处理回调方法,实现处理器的预处理
     * 返回值:true表示继续流程;false表示流程中断,不会继续调用其他的拦截器或处理器
   */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("开始拦截.........");
        //业务代码
        return false;
    }
 
     /**
     * 后处理回调方法,实现处理器(controller)的后处理,但在渲染视图之前
     * 此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
 
    }
    /**
     * 整个请求处理完毕回调方法,即在视图渲染完毕时回调,
     * 如性能监控中我们可以在此记录结束时间并输出消耗时间,
     * 还可以进行一些资源清理,类似于try-catch-finally中的finally,
     * 但仅调用处理器执行链中
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
 
    }
 
}

文章转载于https://blog.csdn.net/m0_63748493/article/details/126606101

标签:拦截器,return,Springboot,request,String,过滤器,public,请求
From: https://www.cnblogs.com/sisxxw/p/17040596.html

相关文章

  • Springboot .properties或.yml配置文件读取pom.xml文件值
    需要在pom.xml中打开过滤才可以<build><resources><resource><directory>src/main/resources</directory><fi......
  • springboot启动报错
    前言​ 学习构建springboot+maven项目,在父模块下创建的一个新的模块,依赖版本由父模块pom.xml控制;写了一个测试接口,启动测试时,一直报错,初始化失败、datasource创建失败、......
  • springboot集成dubbo
    使用SpringBoot+Dubbo搭建一个简单分布式服务实战之前,先来看几个重要的概念什么是分布式?什么是Duboo?Dubbo架构什么是RPC?为什么要用Dubbo?开始实战1:zoo......
  • springboot_yaml与properties区别
    application.properties##springboot这个配置文件可以配置什么的东西呢?##第一种:背官方的配置,呜呜呜太多了##然后,官方推荐视图.yaml代替.properties#key=value,......
  • SpringBoot设置跨域的几种方式
    什么是跨域?浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域 原因:由于浏览器的同源策略,即a网站只能访问a网站的内容,......
  • springboot集成caffine本地缓存
    一、缓存算法1.FIFOFIFO(FirstinFirstout)先进先出。可以理解为是一种类似队列的算法实现算法:当一个查询请求命中了某个元素之后,便会将它放入到队列中,后续的命中元素也......
  • SpringBoot整合ueditor编辑器
    1.到ueditor编辑器官网下载jsp版(目前官网地址改为了GitHub)​​https://ueditor.baidu.com/website/download.html​​2.下载解压后复制到当前项目3.导入maven依赖<de......
  • Spring Boot---(25)SpringBoot使用AOP
    摘要:本文示例,是在一个简单的SpringBoot项目中,通过AOP技术,来实现对接口访问时的信息统计,和接口耗时统计。AOP是Spring提供的两个核心功能之一:IOC(控制反转),AOP(AspectOriented......
  • @ComponentScan详解&@SpringBootApplication的scanBasePackages属性
    一、@ComponentScan源码@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})@Documented@Repeatable(ComponentScans.class)public@interfaceComponen......
  • 【转】Vue+springboot集成PageOffice实现在线编辑Word、excel文档
    说明:PageOffice是一款在线的office编辑软件,帮助Web应用系统或Web网站实现用户在线编辑Word、Excel、PowerPoint文档。可以完美实现在线公文流转,领导批阅,盖章。可以给文件......