Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
論您是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小時內與您取得聯系。