第九章 新版Servlet3.0和SpringBoot2.X过滤器-拦截器实战

1 SpringBoot2.X过滤器讲解

简介: SpringBoot2.X 过滤器讲解
什么是过滤器
        
        fifilter简单理解:⼈ ---> 检票员(fifilter)---> 景点
SpringBoot2.X ⾥⾯的过滤器
 
ApplicationContextHeaderFilter
OrderedCharacterEncodingFilter
OrderedFormContentFilter
OrderedRequestContextFilter

那么多过滤器,哪个优先级⾼呢? 

        Ordered.HIGHEST_PRECEDENCE Ordered.LOWEST_PRECEDENCE

           低位值意味着更⾼的优先级 Higher values are interpreted as lower priority、

⾃定义Filter,避免和默认的Filter优先级⼀样,不然会冲突 

注册Filter配置两种⽅式 

        bean FilterRegistrationBean

        Servlet3.0 webFileter 

2集 抛弃传统⽅式,使⽤新版Servlet3.0的注解开发⾃定义Filter

简介:使⽤Servlet3.0注解开发⾃定义的过滤器

使⽤ Servlet3.0 的注解进⾏配置步骤
        启动类⾥⾯增加 @ServletComponentScan ,进⾏扫描
        新建⼀个Filter 类, implements Filter ,并实现对应的接⼝
        @WebFilter 标记⼀个类为 fifilter ,被 spring 进⾏扫描
        urlPatterns:拦截规则,⽀持正则
        控制chain.doFilter 的⽅法的调⽤,来实现是否通过放⾏
        不放⾏,web 应⽤ resp.sendRedirect("/index.html") 或者 返回 json 字符串

 场景:权限控制、⽤户登录状态控制,也可以交给拦截器处理等

在线教育项⽬案例实战 :
        ⽤户登录过滤器
使用登录接口,然后把返回来的token放到save接口Header参数中。
过滤器:
@WebFilter(filterName = "loginFilter",urlPatterns = "/api/v1/pri/*")
public class loginFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行过滤方法");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        System.out.println(UserServiceImpl.sessionMap);
        String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)){
            token = request.getParameter("token");
        }

        if (StringUtils.isEmpty(token)){ //如果是空说明是没有登录的
            return ;
        }else { //判断是否合法 TODO
            User user = UserServiceImpl.sessionMap.get(token);
            if (user!=null){

                System.out.println("下单成功");
                filterChain.doFilter(request,response);

            }

        }

    }

    @Override
    public void destroy() {
        System.out.println("过滤结束");
    }
}

3集 前后端分离-⾃定义Filter 未登录json错误码提示开发

简介:使⽤Servlet3.0注解开发⾃定义的过滤器,返回未登录错误码 

       在Filter类中创建Json错误信息

  private void renderJson(HttpServletResponse response,String json,int code){ //编写错误的Json信息
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json");

        try (PrintWriter writer = response.getWriter()){
            writer.print("状态码为:");
            writer.println(code);
            writer.print("错误信息:");
            writer.println(json);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

4集 回归本质Servlet3.0的注解原⽣Servlet实战

简介:使⽤ Servlet3.0的注解⾃定义原⽣Servlet 

  • javaweb的使⽤doPostdoGet⽅法使⽤Servlet3.0替代更轻量级
@WebServlet(name = "userServlet", urlPatterns = "/api/v1/test/customs" )
class UserServlet extends HttpServlet {
 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
     PrintWriter writer = resp.getWriter();
     writer.write("this is my custom servlet");
     writer.flush();
     writer.close();
 }
 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
     this.doGet(req,resp);
 }
}

5 Servlet3.0+SpringBoot2.X 注解Listener常⽤监听器

简介:监听器介绍和Servlet3.0的注解⾃定义原⽣Listener监听器实战 

监听器:应⽤启动监听器,会话监听器,请求监听器

作⽤

  • ServletContextListener 应⽤启动监听
  • HttpSessionLisener 会话监听
  • ServletRequestListener 请求监听

 

@WebListener
public class ServletListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("应用启动初始化");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("应用启动结束");
    }
}

6集 新版SpringBoot2.X拦截器配置实战

简介: 讲解Spingboot2.x新版本配置拦截器在项⽬中的使⽤ 

拦截器: 和过滤器⽤途基本类似 

SpringBoot2.x 使⽤步骤
        SpringBoot2.X 新版本配置拦截器 implements WebMvcConfifigurer
                ⾃定义拦截器 HandlerInterceptor
                        preHandle:调⽤Controller某个⽅法之前
                        postHandle:Controller之后调⽤,视图渲染之前,如果控制器 Controller 出现了
                        异常,则不会执⾏此⽅法
                        afterCompletion:不管有没有异常,这个afterCompletion都会被调⽤,⽤于资
                        源清理

 

按照注册顺序进⾏拦截,先注册,先被拦截 

拦截器不⽣效常⻅问题: 

- 是否有加 @Configuration
- 拦截路径是否有问题 ** *
- 拦截器最后路径⼀定要 /** 如果是⽬录的话则是 /*/

 

 在线教育项⽬案例实战:

        改造下单 登录 接⼝ 

场景:权限控制、⽤户登录状态控制等 

Filter过滤器的区别:

Filter Interceptor ⼆者都是 AOP 编程思想的体现,功能基本都可以实现
拦截器功能更强⼤些, Filter 能做的事情它都能做
Filter 在只在 Servlet 前后起作⽤,⽽ Interceptor 够深⼊到⽅法前后、异常抛出前后等
filter 依赖于 Servlet 容器即 web 应⽤中,⽽ Interceptor 不依赖于 Servlet 容器所以可以运⾏在
多种环境。
在接⼝调⽤的⽣命周期⾥, Interceptor 可以被多次调⽤,⽽ Filter 只能在容器初始化时调⽤⼀
次。
Filter Interceptor 的执⾏顺序
过滤前 -> 拦截前 ->action 执⾏ -> 拦截后 -> 过滤后

 拦截器配置类:(可以同时配置多个拦截器)

/**
 * 定义SpringBoot的一个拦截器的配置类
 */
@Configuration
//配置不拦截某些路径,⽐如静态资源
//.excludePathPatterns("/**/*.html","/**/*.js"); 如果需要拦截页面的使用
public class CustomWebMvcConfigure implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) { //增加一个拦截器
        registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api/v1/pri/**") ;//配置需要拦截的路径
        //调用父类,增加一个拦截器
        WebMvcConfigurer.super.addInterceptors(registry);
    }

    public LoginIntercepter getLoginIntercepter(){
        return new LoginIntercepter();
    }
}

 

登录拦截器:(1.需要继承HadlerInterceptor类

                     2.重写一下三种方法

                     3.preHandle返回true就说明没有拦截,执行通过)

public class  LoginIntercepter implements HandlerInterceptor {
    //创建jacksong的Object对象
   private static final ObjectMapper ObjectMapper = new ObjectMapper();
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行拦截方法");
        System.out.println(UserServiceImpl.sessionMap);
        String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)){
            token = request.getParameter("token");
        }

        if (!StringUtils.isEmpty(token)){
            //判断是否合法 TODO
            User user = UserServiceImpl.sessionMap.get(token);
            if (user!=null){

                System.out.println("下单成功");
                //允许就说明通过
               return true;
            }else { //如果是空说明是没有登录的
                //使用jacksong将json数据变成String
                JsonData jsonData = JsonData.buildError(-2, "token过期");
                String jsonStr = ObjectMapper.writeValueAsString(jsonData);

                renderJson(response,jsonStr);
                return false;
            }

        }else{
            //使用jacksong将json数据变成String
            JsonData jsonData = JsonData.buildError(-3, "未登录");
            String jsonStr = ObjectMapper.writeValueAsString(jsonData);

            renderJson(response,jsonStr);
            return false;
        }
    }

    private void renderJson(HttpServletResponse response,String json){ //编写错误的Json信息
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json");

        try (PrintWriter writer = response.getWriter()){
          writer.print(json);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    //Controller调用之后,视图渲染之前,如果控制器Controller出现了
    //异常,则不会执⾏此⽅法
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    //不管有没有异常这个类都会执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中的拦截器过滤器具有不同的实现方式、作用范围和使用场景。拦截器是基于Spring MVC的组件,作用于具体的控制器方法,可以访问Spring MVC的上下文。而过滤器是基于Servlet规范的组件,作用于整个请求和响应过程,无法直接访问Spring MVC的上下文。拦截器是由Spring提供和管理的,可以在拦截器中注入一个service,以调用业务逻辑。而过滤器只需依赖servlet api,不需要依赖Spring过滤器先于拦截器执行,过滤器的执行顺序由注册顺序决定,而拦截器的执行顺序由配置的顺序决定。在Spring Boot中,可以通过注解@WebFilter来简化过滤器的注册,它会自动注册并配置过滤器,可以通过设置urlPatterns属性指定过滤器的拦截路径,也可以通过value属性设置过滤器的名称。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [springboot过滤器拦截器](https://blog.csdn.net/qq_42076204/article/details/125215984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [springboot拦截器过滤器详细说明](https://blog.csdn.net/xiaoweiwei11/article/details/130860352)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值