整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          java中Filter的幾種實(shí)現(xiàn)方式

          實(shí)現(xiàn)Filter的幾種方法

          問題點(diǎn):如何應(yīng)用過濾器?實(shí)現(xiàn)過濾器有哪些方法?

          過濾器的作用:在javaweb的中過濾器的主要作用是過濾指定路徑格式的接口,在請(qǐng)求前后做處理,既可以更改請(qǐng)求頭也可以更改請(qǐng)求的返回值。

          應(yīng)用場(chǎng)景:改變請(qǐng)求頭信息、添加新的請(qǐng)求頭內(nèi)容、判斷來自客戶端的內(nèi)容是否存在非法信息等等!

          實(shí)現(xiàn)過濾器的幾種常見的方式:

          // 實(shí)現(xiàn)Filter接口
          @Component  // 通過Component注解讓Spring容器自動(dòng)為我們創(chuàng)建實(shí)例
          public class MyFilter implements Filter {
              
              // 銷毀過濾器時(shí)調(diào)用的方法(默認(rèn)不用實(shí)現(xiàn))
              @Override
              public void destroy() {
                  Filter.super.destroy();
              }
              // 初始化方法(默認(rèn)不用實(shí)現(xiàn)該方法)
              @Override
              public void init(FilterConfig filterConfig) throws ServletException {
                  Filter.super.init(filterConfig);
              }
              @Override
              public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                  // 請(qǐng)求接口前操作
                  // 調(diào)用接口方法前需要執(zhí)行的代碼
          		filterChain.doFilter(servletRequest,servletResponse);  // 放行到下一個(gè)過濾器
                  // 請(qǐng)求接口后操作
                  // 調(diào)用接口方法后需要執(zhí)行的代碼
              }
          }
          

          上述方式一的實(shí)現(xiàn)比較簡(jiǎn)單,但是這種方式有一個(gè)缺陷(漏洞);大家請(qǐng)注意上面的過濾器對(duì)象是由注解自動(dòng)配置并創(chuàng)建的,這樣就是默認(rèn)值**“/*”**,所以過濾范圍是所有接口。

          基于方式一的漏洞問題做了如下的改動(dòng):

          // 實(shí)現(xiàn)Filter接口
          public class MyFilter implements Filter {
              
              // 銷毀過濾器時(shí)調(diào)用的方法(默認(rèn)不用實(shí)現(xiàn))
              @Override
          

          登錄過濾器怎么寫_使用過濾器實(shí)現(xiàn)用戶登錄控制_java 過濾器實(shí)現(xiàn)登錄

          public void destroy() { Filter.super.destroy(); } // 初始化方法(默認(rèn)不用實(shí)現(xiàn)該方法) @Override public void init(FilterConfig filterConfig) throws ServletException { Filter.super.init(filterConfig); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 請(qǐng)求接口前操作 // 調(diào)用接口方法前需要執(zhí)行的代碼 filterChain.doFilter(servletRequest,servletResponse); // 放行到下一個(gè)過濾器 // 請(qǐng)求接口后操作 // 調(diào)用接口方法后需要執(zhí)行的代碼 } }

          上述的實(shí)現(xiàn)與方式一基本相同,唯一不同的地方就是沒有通過@注解進(jìn)行注入容器。

          配置過濾器通過@Bean的方式:

          @Configuration
          public class MyFilterRegistration {
              @Bean
              public FilterRegistrationBean<MyFilter> registrationBean(){
                  // 創(chuàng)建FilterRegistrationBean,通過它配置過濾器
                  FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
                  registrationBean.setFilter(new MyFilter()); // 設(shè)置過濾器
                  registrationBean.addUrlPatterns("/device/*"); // 設(shè)置過濾器生效范圍
                  registrationBean.setName("myFilter"); // 過濾器名稱
                  registrationBean.setOrder(1); // 設(shè)置優(yōu)先級(jí)
                  return registrationBean;
              }
          }
          

          方式二是實(shí)現(xiàn)Filter接口,并通過自定義配置類的方式將自定義的Filter實(shí)現(xiàn)注入到Spring容器。

          通過@注解實(shí)現(xiàn):

          登錄過濾器怎么寫_java 過濾器實(shí)現(xiàn)登錄_使用過濾器實(shí)現(xiàn)用戶登錄控制

          // 實(shí)現(xiàn)Filter接口,通過WebFilter可以配置過濾范圍、name等參數(shù)
          @WebFilter(value = "/device/*",filterName = "myFilter",displayName = "thisIsFilter")
          public class MyFilter implements Filter {
              
              // 銷毀過濾器時(shí)調(diào)用的方法(默認(rèn)不用實(shí)現(xiàn))
              @Override
              public void destroy() {
                  Filter.super.destroy();
              }
              // 初始化方法(默認(rèn)不用實(shí)現(xiàn)該方法)
              @Override
              public void init(FilterConfig filterConfig) throws ServletException {
                  Filter.super.init(filterConfig);
              }
              @Override
              public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                  // 請(qǐng)求接口前操作
                  // 調(diào)用接口方法前需要執(zhí)行的代碼
          		filterChain.doFilter(servletRequest,servletResponse);  // 放行到下一個(gè)過濾器
                  // 請(qǐng)求接口后操作
                  // 調(diào)用接口方法后需要執(zhí)行的代碼
              }
          }
          

          注意點(diǎn):通過@實(shí)現(xiàn)的時(shí)候還需要做一件事,否則@不生效;

          @ServletComponentScan  // 如果不標(biāo)準(zhǔn)該注解方式三將不會(huì)生效
          public class DisplayCoreApplication {
              public static void main(String[] args) {
                  SpringApplication.run(DisplayCoreApplication.class, args);
              }
          }
          

          總結(jié):以上就是幾種實(shí)現(xiàn)過濾器的方式,個(gè)人比較推薦方式二,因?yàn)檫@樣可以將所有的自定義過濾器統(tǒng)一通過一個(gè)配置類注入到容器,后期查看時(shí)也是一目了然!當(dāng)然方式三更加的簡(jiǎn)潔,視情況而定吧。


          主站蜘蛛池模板: 亚洲欧洲∨国产一区二区三区| chinese国产一区二区| 成人毛片一区二区| 精品福利一区二区三| 国产一区二区三区不卡在线观看| 精品无码国产一区二区三区AV| 久久久不卡国产精品一区二区| 无码人妻aⅴ一区二区三区有奶水| 欧洲无码一区二区三区在线观看| 国产一区二区三区免费观在线 | 精品国产一区二区三区香蕉事| 久久99精品波多结衣一区| 99久久精品费精品国产一区二区| 冲田杏梨高清无一区二区| 国产伦精品一区二区三区免费迷| 亚洲av日韩综合一区二区三区 | 爆乳熟妇一区二区三区霸乳| 国产一区二区三区免费视频| 日韩一区二区三区在线| 国产福利日本一区二区三区| 亚洲色一区二区三区四区| 无码人妻一区二区三区免费 | 国产伦一区二区三区高清| 日韩精品一区二区三区不卡| 一区二区三区午夜| 果冻传媒一区二区天美传媒| 国产日韩AV免费无码一区二区三区| 亚洲一区二区三区乱码A| 亚洲A∨精品一区二区三区 | 日韩好片一区二区在线看| 肉色超薄丝袜脚交一区二区| 中文字幕一区一区三区| 亚洲欧洲专线一区| 国产成人精品一区二三区 | 午夜福利一区二区三区在线观看| 国产精品视频第一区二区三区| 日韩人妻无码一区二区三区99 | 内射女校花一区二区三区| 无码国产精品一区二区免费式芒果| 久久国产精品无码一区二区三区 | 国产一区麻豆剧传媒果冻精品|