论您是SEO,营销人员还是Web开发人员,通常都可能需要更改浏览器的用户代理以测试其他内容。
例如,您正在运行特定于MAC-OS的活动。要确定您的广告系列是否正常运行并且未针对Linux用户,更改浏览器的用户代理可以帮助您进行测试。
对于Web开发人员来说,更改用户代理几乎是日常工作,以测试网站在不同浏览器和设备上的行为。
用户代理是HTTP请求标头字符串,用于标识连接到服务器的浏览器,应用程序或操作系统。
浏览器不仅具有用户代理,还具有机器人,搜寻器(例如搜索引擎Googlebot,Google AdSense等)。
在这里,我们将学习如何更改浏览器的用户代理。
该过程称为用户代理欺骗。
是的,当浏览器或任何客户端发送与他们不同的用户代理HTTP标头并对其进行伪造(称为欺骗)时。
虽然该术语可能令人震惊,但这不是危险的活动,不会给您造成任何问题。(因此,您可以随意欺骗用户代理。)
由于Microsoft Edge 现在使用Chromium,因此Chrome和Edge的设置相同。
另外,您可以在Windows上使用CTR + Shift + I,在Mac 上使用Cmd + Opt + J。
单击右上角的三个垂直点。
如果所需的用户代理不存在,则可以在列表下方的字段中输入所需的任何字符串。
例如,您可以在自定义字段中输入以下内容(Googlebot的用户代理)。
Mozilla / 5.0(兼容; Googlebot / 2.1; + http://www.google.com/bot.html)
当网页显示的内容与Googlebot和网站访问者的内容不同时,这对于SEO专业人员识别网站上是否存在伪装很有用。
另外,您也可以使用Chrome扩展程序User-Agent Switcher and Manager。
就是说,当浏览器实际上可以执行我想要的操作时,我尽量不要使用浏览器扩展。这是为了避免大量的加载项使浏览器过载。
此外,扩展程序有时会意外破坏网站。
尽管您可能认为所访问的网站存在问题,但根本原因可能是您使用的附加组件之一。
转到“ 高级”, 然后选中菜单栏中的“显示开发”菜单。
您可以再次从预定义列表中选择,也可以通过选择“其他…”输入自定义用户代理字符串。
在Firefox中,可以通过浏览器的内置设置来更改用户代理。
但是,它不像在Chrome或Safari上那样易于使用。
使用浏览器的内置功能确实很痛苦。
相反,我们将使用名为User-Agent Switcher的Firefox附加组件。
安装插件后,您将在右上角看到一个图标。
您可以选择预定义的用户代理之一,也可以通过单击下面的笔图标输入自定义用户代理。
您可以使用的另一个扩展是User-Agent Switcher and Manager。
用户代理很容易被欺骗,任何人都可以使用这些简单的技巧对其进行更改。
此功能对于在各种设备上测试Web应用程序非常有用,尤其是当针对移动设备或平板电脑设备使用不同的HTML时。
一个人不需要拥有许多物理设备就可以进行测试。
此功能对SEO专业人员很有用,例如,识别与Google网站站长指南相抵触的伪装问题或对外观有所不同(取决于设备)的网站进行审核。
最近,在进行开发的过程中,发现之前的一个写法,类似如下
以我的理解,@Configuration 加 @Bean 会创建一个 userName 不为 null 的 UserManager 对象,而 @Component 也会创建一个 userName 为 null 的 UserManager 对象
那么我们在其他对象中注入 UserManager 对象时,到底注入的是哪个对象?
因为项目已经上线了很长一段时间了,所以这种写法没有编译报错,运行也没有出问题
后面去找同事了解下,实际是想让
生效,而实际也确实是它生效了
那么问题来了: Spring 容器中到底有几个 UserManager 类型的对象?
项目中用的 Spring Boot 版本是: 2.0.3.RELEASE
对象的 scope 是默认值,也就是 singleton
验证方式有很多,可以 debug 跟源码,看看 Spring 容器中到底有几个 UserManager 对象,也可以直接从 UserManager 构造方法下手,看看哪几个构造方法被调用,等等
我们从构造方法下手,看看 UserManager 到底实例化了几次
只有有参构造方法被调用了,无参构造方法岿然不动(根本没被调用)
如果想了解的更深一点,可以读读鄙人的:Spring 的循环依赖,源码详细分析 → 真的非要三级缓存吗
既然 UserManager 构造方法只被调用了一次,那么前面的问题: 到底注入的是哪个对象
答案也就清晰了,没得选了呀,只能是 @Configuration 加 @Bean 创建的 userName 不为 null 的 UserManager 对象
问题又来了:为什么不是 @Component 创建的 userName 为 null 的 UserManager 对象?
@Configuration 与 @Component 关系很紧密
所以 @Configuration 能够被 component scan
在spring-boot-2.0.3源码篇 - @Configuration、Condition与@Conditional中讲到了 @Configuration 的实现原理
其中 ConfigurationClassPostProcessor 与 @Configuration 息息相关,其类继承结构图如下:
它实现了 BeanFactoryPostProcessor 接口和 PriorityOrdered 接口,关于 BeanFactoryPostProcessor ,可以看看鄙人的Spring拓展接口之BeanFactoryPostProcessor,占位符与敏感信息解密原理
那么我们从 AbstractApplicationContext 的 refresh 方法调用的 invokeBeanFactoryPostProcessors(beanFactory) 开始,来跟下源码
此时完成了 com.lee.qsl 包下的 component scan , com.lee.qsl 包及子包下的 UserConfig 、 UserController 和 UserManager 都被扫描出来
注意,此刻 @Bean 的处理还未开始, UserManager 是通过 @Component 而被扫描出来的;此时 Spring 容器中 beanDefinitionMap 中的 UserManager 是这样的
接下来一步很重要,与我们想要的答案息息相关
循环递归处理 UserConfig 、 UserController 和 UserManager ,把它们都封装成 ConfigurationClass ,递归扫描 BeanDefinition
循环完之后,我们来看看 configClasses
UserConfig bean 定义信息中 beanMethods 中有一个元素 [BeanMethod:name=userManager,declaringClass=com.lee.qsl.config.UserConfig]
然后我们接着往下走,来仔细看看答案出现的环节
是不是有什么发现? @Component 修饰的 UserManager 定义直接被覆盖成了 @Configuration + @Bean 修饰的 UserManager 定义
Bean 定义类型也由 ScannedGenericBeanDefinition 替换成了 ConfigurationClassBeanDefinition
后续通过 BeanDefinition 创建实例的时候,创建的自然就是 @Configuration + @Bean 修饰的 UserManager ,也就是会反射调用 UserManager 的有参构造方法
自此,答案也就清楚了
Spring 其实给出了提示
View Code
只是日志级别是 info ,太不显眼了
可能 Spring 团队意识到了 info 级别太不显眼的问题,或者说意识到了直接覆盖的处理方式不太合理
所以在 Spring 5.1.2.RELEASE (Spring Boot 则是 2.1.0.RELEASE )做出了优化处理
我们来具体看看
启动直接报错,Spring 也给出了提示
View Code
我们来跟下源码,主要看看与 Spring 5.0.7.RELEASE 的区别
新增了配置项 allowBeanDefinitionOverriding 来控制是否允许 BeanDefinition 覆盖,默认情况下是不允许的
我们可以在配置文件中配置: spring.main.allow-bean-definition-overriding=true ,允许 BeanDefinition 覆盖
这种处理方式是更优的,将选择权交给开发人员,而不是自己偷偷的处理,已达到开发者想要的效果
Spring 5.0.7.RELEASE ( Spring Boot 2.0.3.RELEASE ) 支持 @Configuration + @Bean 与 @Component 同时作用于同一个类
启动时会给 info 级别的日志提示,同时会将 @Configuration + @Bean 修饰的 BeanDefinition 覆盖掉 @Component 修饰的 BeanDefinition
也许 Spring 团队意识到了上述处理不太合适,于是在 Spring 5.1.2.RELEASE 做出了优化处理
增加了配置项: allowBeanDefinitionOverriding ,将主动权交给了开发者,由开发者自己决定是否允许覆盖
原文链接:https://www.cnblogs.com/youzhibing/p/15354706.html
击“PLC发烧友”,一起涨知识!
EasyBuilder Pro 主要是组态编写威纶通触摸屏画面设计并和实际威纶通触摸屏通讯连接软件,可使用以太网或 USB 线来下载于 EasyBuilder Pro 组态画面。
1 下载步骤
第一步:(打开浏览器,在网址地址栏写入http://www.jcpeixun.com/进入技成官网—点击下载中心)
第二步:(进入https://bbs.jcpeixun.com/thread-11948-1-1.html找到威纶通触摸屏软件点击第六个即可下载)
友情温馨提醒:下载要注意的是必须要登录技成会员账号才能获取下载地址进行下载哦!
2安装步骤
第一步:(在桌面找到下载好的安装包,当然可能你们下载到其它存储地方,我这里以桌面来讲解,方法都一样的。)
第二步:(解压下载好的安装包文件)
第三步:(解压好后,打开文件夹鼠标选中setup安装执行文件并鼠标右击以管理员身份运行)
第四步:(安装语言选择中文(简体)后点击确定)
第五步:(直接点击下一步)
第六步:(选择我接受协议,点击下一步)
第七步:(默认安装路径C盘(系统盘),至少需要1.5G的安装硬盘空间)
第八步:(直接点击下一步)
第九步:(这里要注意了,一定要勾选(创建桌面图标)换句说就是桌面快捷方式,不勾选到时候安装好桌面会找不到快捷方式哦!然后点击下一步)
第十步:(这里可以看到前几步设置的一些参数信息,点击安装)
第十一步:(进入安装过程,耐心等待即可)
第十二步:(安装到这一步的时候提示是否要安装驱动,点击始终安装此驱动程序软件)
第十三步:(安装完成,点击完成即可)。
第十四步:(安装完成后,在桌面会出现Utility Manager快捷方式)
第十五步:(鼠标双击打开Utility Manager快捷方式,进入软件启动对话框,鼠标点击EasyBuilder Pro进入软件界面)
来源:PLC发烧友,作者:技成培训网-徐陈爽。
*请认真填写需求信息,我们会在24小时内与您取得联系。