整合營(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)潔,視情況而定吧。


          主站蜘蛛池模板: 亚洲AV成人一区二区三区在线看 | 精品免费久久久久国产一区| 波多野结衣中文字幕一区| 亚洲av无码一区二区三区天堂| 日韩精品一区二区午夜成人版| 久久青草国产精品一区| 国产乱码精品一区二区三区四川| 国产一区二区精品| 久久精品国产一区二区三区不卡| 亚洲熟女乱色一区二区三区| 亚洲sm另类一区二区三区| 少妇人妻精品一区二区三区| 大屁股熟女一区二区三区| 武侠古典一区二区三区中文| 中文字幕在线看视频一区二区三区| 狠狠做深爱婷婷综合一区| 国产一区美女视频| 无码人妻精品一区二区三区99不卡 | 亚洲AV美女一区二区三区| 亚洲国产精品乱码一区二区 | 香蕉久久一区二区不卡无毒影院| 亚洲av无码天堂一区二区三区| 精品国产AV无码一区二区三区 | 一区二区不卡视频在线观看| 成人毛片无码一区二区| 在线不卡一区二区三区日韩| 亚洲欧美日韩国产精品一区| 天堂一区二区三区精品| 亚洲视频一区在线| 色综合视频一区中文字幕| 精品福利一区二区三区免费视频 | 国内精品视频一区二区三区| 69久久精品无码一区二区| 色噜噜狠狠一区二区| 日韩一区二区免费视频| 精品乱人伦一区二区| 国产自产V一区二区三区C| 一区二区视频在线| 日韩精品一区二区午夜成人版| 中文字幕在线视频一区| 精品亚洲A∨无码一区二区三区|