分享

SpringBoot过滤器、拦截器区别,以及使用场景!

 笑笑兔 2023-09-27 发布于天津

关系图

Filter-过滤器

在web应用启动的时候初始化一次, 在web应用停止的时候销毁
可以对请求的URL进行过滤, 对敏感词过滤
挡在拦截器的外层
实现的是 javax.servlet.Filter 接口 ,是 Servlet 规范的一部分
在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后
依赖Web容器
会多次执行

2、 HttpServletRequestWrapper

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

@Slf4j
public 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);

    }


}

3、配置过滤器

/**
 * 过滤器配置类
 *
 */
@Configuration
public 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;
    }
}

Interceptor—拦截器

实现 org.springframework.web.servlet.HandlerInterceptor 接口,动态代理
拦截器应用场景, 性能分析, 权限检查, 日志记录
是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,可以单独使用。不仅能应用在web程序中,也可以用于Application、Swing等程序中。
是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。

1、登录拦截

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        User user = (User)request.getSession().getAttribute("user");
        if (!ObjectUtils.isEmpty(user)) {	// 存在用户信息,即用户已登录
            return true;
        } else {
            // 不管是转发还是重定向,必须返回false。否则出现多次提交响应的错误
            redirect(request, response);
            return false;
        }
    }

    /*
     * 对于请求是ajax请求重定向问题的处理方法
     * @param request
     * @param response
     *
     */
    public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {

        if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){// ajax
            //获取当前请求的路径
            response.setHeader("Access-Control-Expose-Headers", "REDIRECT,CONTENT_PATH");
            //告诉ajax我是重定向
            response.setHeader("REDIRECT", "REDIRECT");
            //告诉ajax我重定向的路径
            StringBuffer url = request.getRequestURL();
            String contextPath = request.getContextPath();
            response.setHeader("CONTENT_PATH", url.replace(url.indexOf(contextPath) + contextPath.length(), url.length(), "/").toString());
        }else{// http
            response.sendRedirect( "/page/login");
        }

        response.getWriter().write(403);
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
    }



}

2、拦截器配置

@Configuration
public class WebMvcConfigurer implements WebMvcConfigurer {

    /*
     * 拦截器依赖于Spring容器,此处拦截了所有,需要对静态资源进行放行
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器默认的执行顺序,就是它的注册顺序,也可以通过Order手动设置控制,值越小越先执行。
//        registry.addInterceptor(new PageInterceptor()).addPathPatterns("/**").order()
        registry.addInterceptor(new PageInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/page/login", "/user/login","/page/ajax","/static/**");
    }


    /*
     * 不要要写控制器即可完成页面跳转访问
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/page/ajax").setViewName("ajax");
    }
//    @Override
//    public void addResourceHandlers(ResourceHandlerRegistry registry) {
       // registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        //registry.addResourceHandler("/static/**").addResourceLocations("file:E:/static/");
//    }
}

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多