当前位置: 首页 > news >正文

正定县建设局网站网络推广有几种方法

正定县建设局网站,网络推广有几种方法,求网站老司机,深圳优化网站排名文章目录前言自定义过滤器并验证关于排除某些请求的方式创建测试接口请求测试验证异常过滤器的执行流程注意事项资料参考前言 在Java-web的开发领域,对于过滤器和拦截器用处还是很多,但两者的概念却极易混淆。 过滤器和拦截器都是采用AOP的核心思想&am…

文章目录

  • 前言
  • 自定义过滤器并验证
  • 关于排除某些请求的方式
  • 创建测试接口
  • 请求测试
  • 验证异常过滤器的执行流程
  • 注意事项
  • 资料参考

前言

在Java-web的开发领域,对于过滤器拦截器用处还是很多,但两者的概念却极易混淆。

过滤器拦截器都是采用AOP的核心思想,对具体的实现方法进行增强,都能拦截请求方法。

不同点过滤器拦截器
研发者由Servlet研发由SpringMVC研发
拦截对象拦截WEB请求拦截器不仅可以拦截请求,还能拦截普通方法。
执行顺序过滤器会比拦截器优先执行拦截器在过滤器之后执行,但使用比过滤器简单。
使用场景编码格式转化跨域解决xss攻击权限控制、日志打印、参数验证、回话信息等。

【资料参考】

  • 过滤器和拦截器的异同(小计)
  • springboot配置监听器、过滤器和拦截器

以实际生活中的栗子,作为各个名词的描述:

  • 过滤器 过滤器好比就是筛子,只有满足大小要求的颗粒,才能通过过滤器,不满足的则会筛出来。
  • 拦截器 拦截器就好比是一个门户,只能满足要求,才能进入

这两者本身上其实都差不多,只是在技术层面为了区别各个不同的原理和技术,才定义了不同的名词。

本篇博客不说拦截器,只说过滤器的使用和基本准则。

自定义过滤器并验证

创建Springboot项目,并创建两个自定义的过滤器,如下所示:

  • MyFilter1
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@Slf4j
@Order(1) // 数字越小  优先级越高
@WebFilter(filterName = "myFilter1",urlPatterns = {"/*"})
public class MyFilter1 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("####  MyFilter1 ==== init ####");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {log.info("####  MyFilter1 ==== doFilter ####");log.info("####  MyFilter1 ==== doFilter before ####");chain.doFilter(request,response);log.info("####  MyFilter1 ==== doFilter after ####");}@Overridepublic void destroy() {log.info("####  MyFilter1 ==== destroy ####");}
}
  • MyFilter2
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@Slf4j
@Order(2) // 数字越小  优先级越高
@WebFilter(filterName = "myFilter2",urlPatterns = {"/*"}) // urlPatterns 设置需要拦截过滤的请求,可以正则表达式,未指定时会拦截所有请求
public class MyFilter2 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("####  MyFilter2 ==== init ####");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {log.info("####  MyFilter2 ==== doFilter ####");log.info("####  MyFilter2 ==== doFilter before ####");String msg = request.getParameter("msg");if("err".equalsIgnoreCase(msg)){throw new RuntimeException("传递参数有误,验证过滤器....");}chain.doFilter(request,response);log.info("####  MyFilter2 ==== doFilter after ####");}@Overridepublic void destroy() {log.info("####  MyFilter2 ==== destroy ####");}
}

可以看到本次使用的是注解方式,除了新增这两个自定义的Filter之外,还需要在启动类上增加一个注解标识,否则自定义的过滤器并不会被加载,如下所示:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication
@ServletComponentScan // 扫描filter
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class,args);}
}

@ServletComponentScan // 扫描filter

在自定义的过滤器中,使用的@WebFilter注解方式,该注解中需要设定某些值,这些参数信息又有什么含义呢?

参数名含义
filterName给过滤器定义别名称,需要唯一区别。
urlPatterns过滤器针对的请求url路径,默认或者不配置时,是过滤所有的请求。此处可以写正则表达式。
initParams自定义过滤器初始化参数的数组,此参数可以通过自定义过滤器 init() 的入参FilterConfig对象的 getInitParameter() 方法获取;(由于过滤器没有直接排除自定义URL不拦截的设定,如果我们需要在自定义拦截的URL中排除部分不需要拦截的URL,可以通过将需要排除的URL放到initParams参数中再在doFilter方法中排除)

关于排除某些请求的方式

参考:SpringBoot自定义过滤器Filter使用详解

其中,有这么一个栗子,如下所示:

@WebFilter(filterName = "testFilter", urlPatterns = "/*", initParams = @WebInitParam(name = "noFilterUrl", value = "/test")) // 给定初始化参数
public class TestFilter implements Filter {private List<String> noFilterUrls; @Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 从过滤器配置中获取initParams参数String noFilterUrl = filterConfig.getInitParameter("noFilterUrl");// 将排除的URL放入成员变量noFilterUrls中if (StringUtils.isNotBlank(noFilterUrl)) {noFilterUrls = new ArrayList<>(Arrays.asList(noFilterUrl.split(",")));}}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {// 过滤器配置的  urlPatterns  为 /* 表示过滤所有的请求// 有请求进来时,会先进入到过滤器中,此时则获取请求的uri地址String url = ((HttpServletRequest)servletRequest).getRequestURI();Boolean flag = false;if (!CollectionUtils.isEmpty(noFilterUrls)) {for (String noFilterUrl : noFilterUrls) {// 如果请求的地址中包含有 initParams 传递的参数值,则不继续向下执行if (url.contains(noFilterUrl)) {flag = true;break;}}}if (!flag) {......	//过滤请求响应逻辑} // 继续向下执行,调用该方法filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}
}

感叹这个作者的奇妙思维方式!

创建测试接口

回归正题,创建上面两个自定义的过滤器之后,还需要创建一个测试接口,如下所示:

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test1")
@Api(tags = "测试控制器  1")
@Slf4j
public class TestController {@PostMapping("/demo1")@ApiOperation("demo1")public String demo1(){log.info("请求被调用了!!!!!");return "demo 1 .....";}
}

启动项目观察控制台打印。
在这里插入图片描述

这里的顺序是加在时的顺序,并不是@Order(int) 设定的原因!

请求测试

清空控制台的日志信息,请求测试接口,观察控制台日志输出情况,如下所示:
在这里插入图片描述
在这里插入图片描述

通过调用自定义过滤器filter的日志打印,可以很清楚的了解到请求的执行过程。如下所示:
在这里插入图片描述
由最开始的客户端请求–》MyFilter1–》MyFilter2–》指定的controller–》MyFilter2–》MyFilter1–》客户端。闭环操作。

这里为什么是MyFilter1MyFilter2之前,根本原因就是定义filter时,设定了@Order(1)给定了优先级。

数字越小,优先级越高!

验证异常过滤器的执行流程

MyFilter2中,给定了请求参数 msg=err时抛出异常。

出现异常了,后面的filter还会继续执行不?接下来再次进行请求测试:
在这里插入图片描述
查看控制台,观察日志信息,如下所示:
在这里插入图片描述
在执行到MyFilter1MyFilter2后,由于MyFilter1中抛出了异常,还没有执行对应的chain.doFilter(request,response);后续的链路,所以日志在此处戛然而止!

出现异常后,并不会继续执行后续的filter!

注意事项

自定义的Filter类上,不要添加 @Component 注解,不然会导致程序启动报错,启动不成功
在这里插入图片描述

资料参考

SpringBoot自定义过滤器Filter使用详解

这个大佬博客中给出了第二种方式,但总感觉哪里有问题,关于第二种方式的配置操作,可以参考下列资料:

springboot 自定义过滤器

http://www.hkea.cn/news/956119/

相关文章:

  • 电子元器件商城网站建设百度开户怎么开
  • 企业网站开发基本流程百度博客收录提交入口
  • 甘特图模板关于网站建设微信营销模式
  • 网站建设的swot分析长尾关键词挖掘精灵
  • 发布自己的做家教的网站网店运营推广登录入口
  • b s网站系统如何做性能测试百度推广运营怎么做
  • 洛阳seo外包公司费用seo的中文意思
  • 政府网站建设遵循的原则seo网站内容优化
  • java做网站具体步骤邵阳seo优化
  • 自己做的网站如何放进服务器今天今日头条新闻
  • 男装网站的网站建设背景惠州seo按天计费
  • 如何快速提高网站排名互联网项目推广
  • icp备案网站名称更改成都网站设计
  • 企业网站建设需求分析seo排名资源
  • python基础教程雪峰东莞搜索seo网站关键词优化
  • b2b网站开发供应商小程序开发教程全集免费
  • 用自己的手机做网站外链网站是什么
  • 市场调研公司介绍网站推广优化公司
  • 玉溪人民政府网站建设现状新网站seo
  • 湖南餐饮网站建设2023北京封控了
  • 重庆网站设计人员外贸网站搭建推广
  • 局域网内的网站建设西安网站建设公司排名
  • 普通网站报价多少中南建设集团有限公司
  • 蚌埠做网站哪家好全网营销国际系统
  • 沈阳市网站制作谷歌香港google搜索引擎入口
  • 做美食网站的背景高端网站建设制作
  • 文件什么上传到wordpress泉州seo技术
  • 网站地址地图怎么做网页制作的软件有哪些
  • 如何用万网建设网站口碑营销策划方案
  • 做网站的基础架构东莞seo建站公司