网站 东莞长安,软件开发网站开发培训,剁椒怎么做制作方法,制作网页的代码html注#xff1a;本文中Tomcat#xff0c;代表所有的Serlvet容器#xff0c;由于Tomcat非常流行#xff0c;所以用这个读者更加熟悉。
一、过滤器是什么#xff0c;有什么用
你完成了项目编写#xff0c;把它发布到网络上运行#xff0c;此时#xff0c;外部主机可以访问…注本文中Tomcat代表所有的Serlvet容器由于Tomcat非常流行所以用这个读者更加熟悉。
一、过滤器是什么有什么用
你完成了项目编写把它发布到网络上运行此时外部主机可以访问它这时会出现一些问题。 【注记你的项目为WP】 第一主机A是个安全专家测试自己写的脚本在一分钟内向WP发送十万次请求这会使正常用户卡崩溃甚至无法使用。 第二用户B访问你的项目发现在不登录的情况下就能购买你商店中的商品。这会使你遭受一定损失。 你必须为自己设置安全防护。 早期对于第二个情况最朴素的方法是用户每次操作时都必须输入账号密码这样能保证系统安全。 然而这不仅使得用户体验很差还会使代码量变多变复杂这种非业务逻辑的代码会影响正常开发。 随着开发思想的迭代开发者把安全行为抽离业务逻辑形成一道屏障—“防火墙”。 当然这是一种类比在Servlet容器中一切外部主机访问项目都要经过“过滤器” 这就是我们今天的主角。 身份验证、权限控制经典的工具jwt就需要在过滤器中使用。【当然在代码逻辑中也不是不行】 过滤器的作用对象是外部主机所以它默认不影响正常代码逻辑【也可以让它影响】 由于过滤器是项目门户需要在项目启动前就布置好恰好和Servlet容器运行的时间段类似所以Servlet容器内置了过滤器功能。 比如常用的Tomcat服务器就默认使用WebMVCConfigurer类的过滤配置。
二、Filter接口和WebMVCConfigurer接口的介绍
Tomcat的所有过滤行为都基于Filter接口。 Filter接口在实际上定义了一个过滤器应该有的所有行为。 而我们常用于解决跨域问题的WebMVCConfigurer过滤配置属于另一个过滤器分支。 虽然它与Filter没有父子关系但我猜测在Filter的子实现类里一定组合了WebMVCConfigurer的实现类。 否则我们不应该能够使用WebMVCConfigurer解决跨域问题。 WebMVCConfigurer中定义了Web开发常用的跨域、页面跳转等过滤。 Filter定义了最重要的3个方法
doFilter最重要的方法真正的过滤逻辑init初始化过滤前的准备doDestroy销毁过滤器后会自动调用
三、过滤器的部署
开发前后端项目我们常常会遇到跨域问题今天我们从它入手详解它的原理并解决它。
第一浏览器跨域策略
跨域问题的原因为保证安全浏览器不允许不同应用层协议、不同IP地址、不同端口之间的应用程序直接通信。举例 http://IP地址:端口号/资源 和 ftp:或者https 之间协议不同不允许跨域访问1.1.23.4 和 2.1.4.1 之间IP地址不同不允许后端项目127.0.0.1:8080 和前端项目127.0.0.1:5143之间端口号不同不允许
表面上跨域问题由浏览器引起使用postman、jmeter访问时似乎不会有问题。 然而浏览器对跨域问题只有标记作用即标记是否跨域了真正的跨域解决方案内置在Tomcat容器中。
第二跨域的成因
既然跨域方案在Servlet容器中又因为使用SSM框架开发项目时使用WebMVCConfigurer实现类作为默认过滤器所以成因就是该实现类默认不允许跨域。
第三跨域解决
我选用的是使用WebFilter注解表示一个过滤器使这个过滤器拦截所有的请求架空WebMVCConfigurer实现类的权力然后在新过滤器中解决问题。 注此方法要做2件事
使用WebFilter注解过滤器类该过滤器类实现Filter接口
完成后就可以重写3个方法 代码为
// 拦截所有请求
WebFilter(urlPatterns /*)
public class FilterPermission implements Filter {// 初始化方法一般不用Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 放行函数filterChain.doFilter(servletRequest,servletResponse);}// 销毁函数Overridepublic void destroy() {Filter.super.destroy();}这样就能粗略地解决跨域问题当然也带来了一些安全问题在此不赘述。
四、结语
我是蚊子码农如有补充或者疑问欢迎在评论区留言。个人的知识体系可能没有那么完善希望各位多多指正谢谢大家。