精华内容
下载资源
问答
  • Windows 10(2020)的十大Web浏览器Google ChromeMozilla FirefoxMicrosoft Edge ChromiumOperaChromiumVivaldiTorch BrowserBrave BrowserMaxthon Cloud BrowserUC BrowserGoogle Chrome 整体网络浏览器首页格局支持...

    Windows 10(2020)的十大Web浏览器

    • Google Chrome
    • Mozilla Firefox
    • Microsoft Edge Chromium
    • Opera
    • Chromium
    • Vivaldi
    • Torch Browser
    • Brave Browser
    • Maxthon Cloud Browser
    • UC Browser
    1. Google Chrome 整体网络浏览器首页格局
    3ee567ee-5a0d-eb11-8da9-e4434bdf6706.png

    支持的平台: Windows,Linux,macOS,Android,iOS,Chrome OS

    Google于2009年首次推出Chrome时,由于它是当时最快的Web浏览器,因此迅速得到用户支持,人气快速上升。现在,Google Chrome拥有多个竞争对手,作为最常用的网络浏览器,尽管许多人指责免费的网络浏览器吞噬了所有RAM,但是Chrome在速度和效率方面保持标准。

    3fe567ee-5a0d-eb11-8da9-e4434bdf6706.png

    除了基本的浏览器功能(如书签管理,扩展程序,主题,隐身模式等)外,我们更喜欢Chrome的一件事是配置文件管理,该功能允许多个人使用同一浏览器,而无需合并他们的Internet历史记录,下载历史记录和其他内容等。

    Chrome还允许用户使用其WiFi网络将内容投射到支持Chromecast的设备上,借助VidStream之类的Chrome扩展程序,就像将本地存储的电影流式传输到Chromecast设备。

    40e567ee-5a0d-eb11-8da9-e4434bdf6706.png

    我觉得Chrome依然-成为2020年最佳Web浏览器应用程序之一,更多是因为跨设备支持,当然需要你已登录Google帐户,则网络浏览器可以轻松地跨设备同步Internet历史记录,标签,书签,密码等。

    展开全文
  • Wexond是个可扩展且以隐私为中心的Web浏览器,具有完全不同的用户体验,构建于Electron,TypeScript,React和styled-components上。 它旨在快速,私密,美观,可扩展和功能。
  • 开源最前线(ID:OpenSourceTop) 编译编译自:https://opensource.com/article/19/7/open-source-browsers微软闭源的IE称霸市场的情况下,开源Web浏览器走过了段漫长的发展路,多年来,IE一直是微软Windows操作...

    开源最前线(ID:OpenSourceTop) 编译

    编译自:https://opensource.com/article/19/7/open-source-browsers

    微软闭源的IE称霸市场的情况下,开源Web浏览器走过了一段漫长的发展之路,多年来,IE一直是微软Windows操作系统的默认浏览器,而Safari(也是闭源的)是MacOS的默认浏览器。

    Chrome和火狐这两种浏览器都非常有名,但并不是唯一可用的开源浏览器。本文介绍了七种开源浏览器,并总结了它们的特性,以及作为开发者你可以如何为他们做出贡献

    1、Brave

    这款开源浏览器旨在屏蔽除用户许可外的所有广告和网站跟踪器。Brendan Eich是JavaScript创始人,也是Mozilla基金会的联合创始人之一,他以CEO和联合创始人的身份领导这个项目。 

    Brave的优点:

    • 没有广告或网络跟踪器

    • 速度

    • 安全

    • Chromium扩展支持

    • Brave QA中进行Bug追踪

    Brave的缺点:

    • 支持内容创造者的“选择加入”微支付系统,但却没有一个清晰的路径(Github地址:https://github.com/brave)

    2、Chrome/Chromium

    毫无疑问,谷歌Chrome是使用最广泛的互联网浏览器,我记得谷歌推出Chrome的第一版本时,Mozilla Firefox则比Chrome要早得多,Chrome的第一个版本太慢、bug太多,当时我甚至认为它不会成功,然而,Chrome变得越来越好,最终还超过了Firefox的市场份额,Chrome是目前最流行的浏览器,它的简单和速度,使得它受到了很多人的喜爱。

    谷歌Chrome的优点:

    • 简单

    • 速度快

    • 包含大量有用的内置功能

    谷歌Chrome的缺点:

    • 占用内存大

    • Chrome(不是Chromium)有专有代码

    Chromium是Chrome浏览器背后的开源项目,遵循Berkeley Software Distribution (BSD)许可协议。因此,Chrome浏览器也有一些封闭的源代码。(贡献地址:https://chromium.googlesource.com/chromium/src/+/master/docs/contributing.md)

    3、Firefox

    虽然Chrome现在是最受欢迎的浏览器,但Mozilla Firefox才是开启整个开源web浏览器热潮的浏览器。在Mozilla Firefox之前,打败IE就是一件不可能的事,Firefox的诞生让这件事有了可能性。有趣的是,Firefox发布时,其联合创始人布莱克·罗斯(Blake Ross)只有19岁。

    Mozilla Firefox的优点:

    • 安全

    • 可以使用许多扩展

    • 在不同系统有着统一的用户体验

    Mozilla Firefox的缺点:

    • 占用内存大

    • HTML5兼容性问题

    Firefox的源代码遵循Mozilla Public License (MPL)许可协议(贡献地址:https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Introduction)

    4、Konqueror 

    Konqueror可能不是最知名的互联网浏览器,但后台也是十分强大的,它是一个由苹果(Apple)开发的浏览器引擎,然后是用于Safari和Chrome浏览器(后来Brave、Vivaldi和其他几个浏览器都使用了它),在微软的 Windows 系统下,也有零星使用,当然功能相对有限。Konqueror主要用于文件管理、浏览,以及网页浏览。目前,Konqueror由KDE自由软件社区维护。

    Konqueor的优点:

    • 许多Linux都预装了Konqueor

    • 快速和高效

    • 内置广告拦截器和弹出式拦截器

    • 可定制的URL快捷键

    • 文件管理器、网页浏览等功能

    Konqueror的缺点:

    • 主要在Linux中运行

    • 需要安装几个KDE库

    Konqueror的源代码按照 GPL 进行发布。(项目地址:https://kde.org/applications/internet/org.kde.konqueror/development)

    5、Lynx

    Lynx是一个独特的浏览器,是个纯文字网页浏览器,是在具有强调文字功能的终端上使用的。它也是目前仍在使用和开发中的最古老的Web浏览器。你可能会想,谁会用一个纯文字的网页浏览器,但是,它依然有人用,而且是一个大型社区维护的开源浏览器。

    Lynx的优点:

    • 非常轻量级的

    • 占用内存非常小

    • 非常安全

    • 支持DOS和Windows

    • 可用于测试和安全浏览

    Lynx最大的缺点就是纯文本,Lynx的源代码遵循GNU公共许可证(GPL)(项目地址:https://github.com/kurtchen/Lynx)

    6、Midori

    当你听到“Midori”,你可能会想到是一款鸡尾酒,不过这里提到的Midori是一个开源的轻量级浏览器,如果您想要一个简单而轻量级的浏览器,那么Midori可能是一个很有意思的选择。但是请注意,这个浏览器没有稳定的版本,而且众所周知它有相当多的bug。

    Midori的优点就是简单轻量级,缺点就是,到了现在仍然没有稳定版本,而且几乎没有扩展程序,源代码遵循GNU Lesser General Public License (LGPL)许可(Github地址:https://github.com/midori-browser/core)


    ●编号825,输入编号直达本文

    ●输入m获取文章目录

    推荐↓↓↓ 

    2400b19ece20e04db97ed7da3fd83bf7.png

    前端开发

    更多推荐25个技术类微信公众号

    涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。

    展开全文
  • web缓存之浏览器缓存

    2018-03-13 17:41:25
    web缓存之浏览器缓存浅析 什么是web缓存 所谓缓存就是再copy份数据的副本(可能是html页面,图片,文件),根据副本的存放位置不同,又可分为不同的缓存策略,比如浏览器缓存,就是将文件存储再客户端,再访问...

    web缓存之浏览器缓存浅析

    什么是web缓存

    所谓缓存就是再copy一份数据的副本(可能是html页面,图片,文件),根据副本的存放位置不同,又可分为不同的缓存策略,比如浏览器缓存,就是将文件存储再客户端,再访问相同的URL时首先检查副本是否时最新的,如果足够新的话,直接使用副本,不会再请求服务器,这样可以减少服务器请求数量,使用户获得更好的体验。

    浏览器缓存

    浏览器缓存,主要是HTTP协议定义的缓存,当然也有非HTTP协议的,比如html的meta标签。
    meta标签提供了很多的属性用来定义文档信息,同时也提供了修改HTTP传输的属性。

        <meta http-equiv='cache-control' content='no-cache'>
    

    当然这不是今天的重点,今天主要说的是HTTP协议定义的缓存机制。

    expires

    expires用来设置缓存的过期时间,是web服务器响应消息头字段,在响应HTTP请求时可以通知浏览器在过期时间以前,可以直接从浏览器的缓存中获取数据。

    cache-control

    相比于expires,cache-control的作用几乎和它是一样的,虽然都是指明资源的有限期,控制浏览器是否从浏览器缓存中拉取数据,但是在两者一起设置了的情况下,cache-control的优先级更高,同时选择性也更多。
    cache-control的值可以是
    1. max-age(单位S)
    设置缓存的最长有效时间,使用的是时间长短,例如说我设置max-age=60,也就是说在请求发出后的60秒内,浏览器再次请求时不会再请求服务器,而是从浏览器缓存中读取数据。
    2. s-maxage
    与max-age的唯一区别是,s-maxage仅仅应用于共享缓存。而不引用于用户代理的本地缓存,等针对单用户的缓存. 另外,s-maxage的优先级要高于max-age。
    3. public
    告知任何途径的缓存者,可以无条件的缓存该响应,该响应可以在被多用户共享。
    4. private
    只针对单个用户缓存响应。且可以具体指定某个字段,如private –“username”,则响应头中,名为username的标头内容,不会被共享缓存。
    5. no-cache
    这个貌似不是很好解释,那么先来列一下浏览器从服务端请求数据的基本步骤
    1.如果请求命中本地缓存则从本地缓存中获取一个对应资源的副本
    2.检查这个副本是否是最新的,是则直接返回,否则继续向服务器转发请求。
    3.服务器接收到请求,然后判断资源是否变更,是则返回新内容,否则返回304,未变更。
    4.客户端更新本地缓存。

    no-cache会强制跳过步骤2,也就是告诉浏览器,要原原本本的转发请求到服务器,等服务器确认最新了才可以使用。这样的话no-cache其实是允许浏览器缓存副本,但是总是会校验缓存是否最新,一旦确认最新,则可以使用缓存作为响应。
    6. no-store
    绝对被禁止缓存,每一次请求都要被发送到服务器然后重新来获取数据。
    7. only-if-cached
    告知浏览器,我希望内容来自缓存,我并不关心被缓存响应,是否是新鲜的。

    Last-modified

    在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间。
      客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过。
      如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,使用缓存数据。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

    ETag

    浏览器第一次发送请求时,服务器端会生成一段hash字符串,用来表示本次请求,下一次发送请求时会回传这个hash字符串到服务器端,服务器会进行校验,如果发现ETag没有变化,则会返回304。
    OK,虾面copy别人的两张图,很清晰的讲解了HTTP浏览器的缓存机制。
    第一次请求:
    clipboard.png
    再次请求:
    clipboard.png

    参考文章: http://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=402653154&idx=1&sn=dc0d70e0329887a0a6be0e8d1468ac99&scene=0#wechat_redirect

    展开全文
  • 基于JAVA的Web浏览器

    2020-07-25 20:28:31
    网页浏览器是个软件程序,用于与www建立联结,并与进行通信。它可以在www系统中根据链接确定信息资源的...本Web浏览器是采用JDIC项目提供的WebBrowser组件实现网页浏览,使用JavaSwing技术实现该浏览器的图形界面。

    摘要

    网页浏览器是一个软件程序,用于与www建立联结,并与之进行通信。它可以在www系统中根据链接确定信息资源的位置,并将用户感兴趣的信息资源取回来,对HTML文件进行解释,然后将文字图像显示出来,或者将多媒体信息还原出来。本Web浏览器是采用JDIC项目提供的WebBrowser组件实现网页浏览,使用JavaSwing技术实现该浏览器的图形界面。

    关键字

    JavaSwing; JDIC; Web 浏览器

    基于Java的Web浏览器设计:

    随着21世纪新时代的到来,网络越来越普及到各行各业。浏览器作为网络普及中的核心因素之一,它发展可以说是网络的发展的写照。浏览器技术的改进与更新,无疑是网络普及的重要推动力之一。本项目采用Java技术实现网页浏览器。Java 是-一个广泛使用的编程语言,它基于Java虚拟机技术,从而实现跨平台。它简单,面向对象,不依赖与机器的结构,具有可移植性,安全性,并且提供了并发的机制,具有很高的性能。其次,它最大限度的利用了网络,Java的小应用程序(applet) 。可在网络上传输而不受CPU和环境的限制,另外,Java还提供了丰富的类库,使程序设计者可以很方便地建立自己的系统。网页的显示以及导航操作是采用Java.net社团中的一个桌面开发组件项目JDIC项目提供的WebBrowser组件来实现。JDesktop In-tegrationComponents,或JDIC,是一个给Java开发人员提供通过交差平台API存取本地特性的包罗万象的项目。该项目由Sun的Desktop组启动,目的是让Java应用能更好地和它们所运行的桌面环境集成。为了能从开发人员那里得到想要的特性的快速反馈,他们将JDIC做成了开源项目。尽管目前没有计划,但JDIC团队正考虑把JDIC的特征加入Java核心类库的未来版本中去。JDIC包含很多功能组件,其中Web-Browser浏览器组件可以呈现网页内容,包括JavaScript, Flash 等都能正确显示,它也可以控制浏览器的后退,前进,刷新,停止和打印等操作。

    基于Java的Web浏览器模块

    基于Java的Web浏览器主要包括三个模块:菜单栏模块,工具栏模块,网页现实模块,状态栏模块。

    • 菜单栏模块:文件菜单,能进行日常的文件操作,打开网页文件,另存为文件。查看菜单,能查看访问网页的历史记录,查看网页源代码,刷新等网页导航操作。收藏菜单,能添加收藏夹,以及对收藏夹的管理。工具菜单,能对浏览器进行相关的配置设置:如主页的设置,搜索引擎的选择。
    • 工具栏模块:能对网页进行导航操作,如:后退,前进,刷新等操作。提供截图工具,能方便用户截取图片。具有搜索栏,方便用户进行快速的网页搜索。
    • 网页显示模块:网页采用标签标志的显示方式,用户能够方便地切换多个访问网页,能提供便捷的添加标签功能,提供用户的体验感,方便用户快速添加网页。

    相关技术

    JAVA GUI:
    GUI全称Graphical User Interfaces,意为图形用户户界面,又称为图形用户接口,GUI指的就是采用图形方式显示的计算机操作用户界面,打个比方吧,我们点击QQ图标,就会弹出一个QQ登陆界面的对话框。这个QQ图标就可以被称作图形化的用户界面。实现GUI编程的必不可少的三个条件是组件、事件、事件监听。
    组件就是一些基本的图形元素,包含有两类组件,一类是像我们经常用到的按钮、文本框、文本域、多选按钮、单选按钮等;另一类是我们经常说到的容器,比如说窗体、Panel等,它的作用主要是用来组织界面上的组件或者单元。
    事件是指组件触发的动作事件,java中不同的事件由不同的监听器处理,组件是事件源对象,而监听器主要用来接收来自事件源对象产生的动作事件,然后对其处理。
    监听过程: 当事件源对象产生某种事件时,先封装该事件的信息,然后向监听器传送此事件对象,监听器在接收到事件对象后,为了能让监听器检查组件是否发生了该事件,会向该事件源对象(即该组件)注册事件监听器,然后事件处理器会检查事件是否发生,如果发生了,那么激活事件处理器进行处理。
    在本程序设计中,组件起到了创造窗口,单选按钮,多选按钮,文本框的作用,为程序起到奠基作用。事件起到程序推动的作用,让程序事件发生,用来查找网页。监听器起到监听事件动作的作用,若事件发生,则运行该事件的动作,在本程序中有超链接事件监听起着能让程序与网络链接连接的功能,鼠标事件监听器起到接收鼠标动作的作用,动作监听器起到接收按钮等发出的动作,从而去实现它。

    JAVA I/O :
    数据流是指所有的数据通信通道;
    有两类流nputStream and OutputStream。Java中每一种流的基本功能依赖于它们InputStream用于ead,OutputStream用于write,读和写都是相对与内存说的,读就是从其他地方把数据拿进内存,写就是把数据从内存推出去这两个都是抽象类,不能直接使用。
    在本程序设计中,I/O起到了将数据信息传输到目的地,也可以将文件,网络,压缩包等进行输出。在遇到错误时能抛出异常,能进行文件的创建与删除,获取文件的信息,还能对文件信息起到缓存的作用。

    开发工具

    Eclipse java2018-12 (注意:版本不一样,会出问题,高的版本会对低版本的语法报错,因为高版本已经不适用低版本的语法了); Jdk1.8.0

    实例代码

    WebBroser类:网页浏览器的主类文件,生成网页浏览器的主题框架,并实现框架上各个组件的监听事件

    package 网页浏览器;
    import java.awt.datatransfer.Clipboard;//获得系统剪切板
    import java.awt.datatransfer.DataFlavor;//映射
    import java.awt.datatransfer.Transferable;//提供在应用程序之间和在应用程序内部传输数据的接口和类
    import java.awt.*;//提供用户界面原件
    import javax.swing.*;//提供按钮类
    import java.awt.event.*;//定义了许多不同类型的事件监听器类
    import javax.swing.event.*;//提供swing事件包
    import javax.swing.border.*;//提供围绕 Swing 组件绘制特殊边框的类和接口
    import java.io.*;//提供输入输出流
    import java.net.*;//提供支持联网的类
    import java.util.*;//提供实用方法和数据结构
    import javax.swing.filechooser.*;//包含 JFileChooser 组件使用的类和接口
    public class WebBrowser extends JFrame implements HyperlinkListener, ActionListener {
    	JToolBar bar = new JToolBar();// 建立工具栏用来显示地址栏
    	// 建立网页显示界面
    	JTextField jurl = new JTextField(55);//文本框大小
    	JEditorPane2 jEditorPane1 = new JEditorPane2();
    	JScrollPane scrollPane = new JScrollPane(jEditorPane1);//滚动条
    	JFileChooser chooser = new JFileChooser();
    	JFileChooser chooserl = new JFileChooser();//选择文件
    	String htmlSource;
    	JWindow window = new JWindow(WebBrowser.this);//使用指定的所有者框架创建窗口
    	JButton button2 = new JButton("窗口还原");
    	Toolkit toolkit = Toolkit.getDefaultToolkit();//获取默认工具包
    	JMenuBar jMenuBarl = new JMenuBar();// 建立菜单栏
    	JMenu fileMenu = new JMenu("文件(F)");// 建立菜单组
    	// 建立菜单项
    	JMenuItem saveAsitem = new JMenuItem("另存为(S)");
    	JMenuItem exitltem = new JMenuItem("退出(E)");
    	JMenu editMenu = new JMenu("编辑(E)");
    	JMenuItem backitem = new JMenuItem("后退(Z)");
    	JMenuItem forwarditem = new JMenuItem("前进(P)");
    	JMenu viewMenu = new JMenu("视图(v)");
    	JMenuItem fullscreenitem = new JMenuItem("全屏(U)");
    	JMenuItem sourceitem = new JMenuItem("查看源码(C)");
    	JMenuItem reloaditem = new JMenuItem("刷新(R)");
    	JToolBar toolBar = new JToolBar();// 建立工具栏
    	// 建立工具栏中的按钮组件
    	JButton picSave = new JButton("另存为");
    	JButton picBack = new JButton("后退");
    	JButton picForward = new JButton("前进");
    	JButton picView = new JButton("查看源代码");
    	JButton picFull = new JButton("全屏");
    	JButton picreloaditem = new JButton("刷新");
    	JButton picExit = new JButton("退出");
    	JLabel label = new JLabel("地址");
    	JButton button = new JButton("转向");
    	Box adress = Box.createHorizontalBox();
    	Box adressSource = Box.createHorizontalBox();//创建一个从左到右显示其组件
    	private ArrayList history = new ArrayList();// Arraylist对象,用来存放历史地址
    	private int historyindex;// 整型变量,表示历史地址的访问顺序
    	public WebBrowser() {
    		setTitle("网页浏览器");
    		setResizable(true);//是否可以调节窗口大小
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//使用System exit方法退出应用程序。仅在应用程序中使用
    		jEditorPane1.addHyperlinkListener(this);// 为jeditorpanel添加事件侦听
    		fileMenu.setMnemonic('F');// 为组件filemenu设置热键F
    		saveAsitem.setMnemonic('S');// 为“另存为”组件设置快捷键为ctrl+s
    	saveAsitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));//快捷键为S
    		exitltem.setMnemonic('E');
    	exitltem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_DOWN_MASK));//快捷键为E
    		// 将菜单项 saveAsitem加入到菜单栏fileMenu中
    		fileMenu.add(saveAsitem);
    		// 在菜单项中添加隔离
    		fileMenu.addSeparator();
    		fileMenu.add(exitltem);
    		backitem.setMnemonic('Z');
    	backitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_DOWN_MASK));//快捷键为Z
    		forwarditem.setMnemonic('P');
    	forwarditem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_DOWN_MASK));//快捷键为P
    		editMenu.setMnemonic('E');
    		editMenu.add(backitem);
    		editMenu.add(forwarditem);
    		viewMenu.setMnemonic('V');
    		fullscreenitem.setMnemonic('U');		fullscreenitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_DOWN_MASK));//快捷键为U
    		sourceitem.setMnemonic('C');
    	sourceitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK));//快捷键为C
    		reloaditem.setMnemonic('R');
    	reloaditem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_DOWN_MASK));//快捷键为R
    		Container contentPane = getContentPane();
    		scrollPane.setPreferredSize(new Dimension(200, 450));// 设置大小
    		contentPane.add(scrollPane, BorderLayout.SOUTH);//南
    		// 在工具栏中添加按钮组件
    		toolBar.add(picSave);
    		toolBar.addSeparator();
    		toolBar.add(picBack);
    		toolBar.add(picForward);
    		toolBar.addSeparator();
    		toolBar.add(picFull);
    		toolBar.add(picView);
    		toolBar.add(picreloaditem);
    		toolBar.addSeparator();
    		toolBar.add(picExit);
    		contentPane.add(bar, BorderLayout.CENTER);//网页栏显示位置
    		contentPane.add(toolBar, BorderLayout.NORTH);//工具栏位置(北)
    		viewMenu.add(fullscreenitem);
    		viewMenu.add(sourceitem);
    		viewMenu.add(reloaditem);
    		jMenuBarl.add(fileMenu);
    		jMenuBarl.add(editMenu);
    		jMenuBarl.add(viewMenu);
    		setJMenuBar(jMenuBarl);
    		adress.add(label);
    		adress.add(jurl);
    		adress.add(button);
    		bar.add(adress);
    		// 为组件添加事件监听
    		saveAsitem.addActionListener(this);
    		picSave.addActionListener(this);
    		exitltem.addActionListener(this);
    		picExit.addActionListener(this);
    		backitem.addActionListener(this);
    		picBack.addActionListener(this);
    		forwarditem.addActionListener(this);
    		picForward.addActionListener(this);
    		picFull.addActionListener(this);
    		fullscreenitem.addActionListener(this);
    		picreloaditem.addActionListener(this);
    		sourceitem.addActionListener(this);
    		picView.addActionListener(this);
    		reloaditem.addActionListener(this);
    		button.addActionListener(this);
    		jurl.addActionListener(this);
    	}
    	public void actionPerformed(ActionEvent e) {
    		String ur1="";
    		// 点击转向按钮
    		if(e.getSource()==button){
    			// 获得地址栏的内容
    			ur1=jurl.getText();
    			// ur1不为"",并且以"http://"开头
    			if (ur1.length()>0&&ur1.startsWith("http://")) {
    				try {
    					// JEditorPane组件显示ur1的内容链接
    					jEditorPane1.setPage(ur1);
    					// 将ur1的内容添加到 Arraylisthistory中
    					history.add(ur1);
    					// historyindex history对象的长度-1
    					historyindex=history.size()-1;
    					// 重新布局
    				jEditorPane1.setEditable(false); // 控件不能被编辑
    					jEditorPane1.revalidate();//对组件进行检验
    				} 
    				catch (Exception ex) {
    			// 如果链接显示失败,则弹出选择对话框“无法打开该搜索页”
    					JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该搜索页", "网页浏览器", JOptionPane.ERROR_MESSAGE);
    				}
    			}
    			// "url不为“”,并且不以“http://”开头
    			else if(ur1.length()>0&&!ur1.startsWith("http://")) {
    				// 在ur1前面添加 //"http://"
    				ur1="http://"+ur1;
    				try {
    					jEditorPane1.setPage(ur1);
    					history.add(ur1);
    					historyindex = history.size()-1;//返回此列表中的元素数
    					jEditorPane1.setEditable(false); //控件不能被编辑
    					jEditorPane1.revalidate();//对组件进行检验
    				}
    				catch (Exception ex){
    					JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该搜索页", "网页浏览器", JOptionPane.ERROR_MESSAGE);
    				}
    			}
    			// 没有输入ur1,即url为空
    			else if(ur1.length()==0){
    				JOptionPane.showMessageDialog(WebBrowser.this, "请输入链接地址", "网页浏览器", JOptionPane.ERROR_MESSAGE);
    			}
    		}
    		// 输入地址后点击回车
    		else if(e.getSource()==jurl){
    			ur1=jurl.getText();
    			if(ur1.length()>0&&ur1.startsWith("http://")) {
    				try{
    					jEditorPane1.setPage(ur1);
    					history.add(ur1);
    					historyindex=history.size()-1;//返回此列表中的元素数
    					jEditorPane1.setEditable(false); //控件不能被编辑
    					jEditorPane1.revalidate();//对组件进行检验
    					jurl.setMaximumSize(jurl.getPreferredSize());
    				} 
    				catch (Exception ex){
    					JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该搜索页", "网页浏览器", JOptionPane.ERROR_MESSAGE);
    				}
    			} 
    			else if (ur1.length()>0&&!ur1.startsWith("http://")){
    				ur1="http://"+ur1;
    				try {
    					jEditorPane1.setPage(ur1);
    					history.add(ur1);
    			historyindex=history.size()-1;//返回此列表中的元素数
    				jEditorPane1.setEditable(false); //控件不能被编辑
    					jEditorPane1.revalidate();//对组件进行检验
    				} 
    				catch (Exception ex){
    					JOptionPane.showMessageDialog(WebBrowser.this, "无法打开该搜索页", "网页浏览器", JOptionPane.ERROR_MESSAGE);
    				}
    			} 
    			else if (ur1.length()==0){
    				JOptionPane.showMessageDialog(WebBrowser.this, "请输入链接地址", "网页浏览器", JOptionPane.ERROR_MESSAGE);
    			}
    		}
    		// 另存为
    		else if (e.getSource()==picSave||e.getSource()==saveAsitem) {
    			ur1=jurl.getText().trim();//去掉字符串头和尾的空格
    			if(ur1.length()>0&&!ur1.startsWith("http://")) {
    				ur1="http://" + ur1;
    			}
    			if(!ur1.equals("")) {
    				// 保存文件
    				saveFile(ur1);
    			}
    			else {
    				JOptionPane.showMessageDialog(WebBrowser.this, "请输入链接地址 ", "网页浏览器", JOptionPane.ERROR_MESSAGE);
    			}
    		}
    		// 退出
    		else if(e.getSource()==exitltem||e.getSource()==picExit) {
    			System.exit(0);//若是1为异常终止
    		}
    		// 后退
    		else if (e.getSource()==backitem||e.getSource()==picBack) {
    			historyindex--;
    			if (historyindex<0)
    				historyindex=0;
    			ur1=jurl.getText();
    			try {
    				// 获得 history对象中本地址之前访问的地址
    				ur1=(String)history.get(historyindex);
    				jEditorPane1.setPage(ur1);
    				jurl.setText(ur1.toString());
    				jEditorPane1.setEditable(false); //控件不能被编辑
    				jEditorPane1.revalidate();//对组件进行检验
    			} 
    			catch (Exception ex) {
    			}
    		}
    		// 前进
    		else if (e.getSource()==forwarditem||e.getSource()==picForward){
    			historyindex++;
    			if (historyindex>=history.size())
    				historyindex=history.size()-1;
    			ur1=jurl.getText();
    			try {
    				// 获得 history对象中本地址之后访问的地址
    				ur1=(String)history.get(historyindex);
    				jEditorPane1.setPage(ur1);
    				jurl.setText(ur1.toString());
    				jEditorPane1.setEditable(false); //控件不能被编辑
    				jEditorPane1.revalidate();//对组件进行检验
    			} 
    			catch (Exception ex) {
    			}
    		}
    		// 全屏
    		else if (e.getSource()==fullscreenitem) {
    			boolean add_button2=true;// 获得屏幕大小
    		}
    		//查看原文件
    		else if(e.getSource()==sourceitem||e.getSource()==picView) {
    			ur1=jurl.getText().toString().trim();
    			if(ur1.length()>0&&!ur1.startsWith("http://")) {
    				ur1="http://"+ur1;
    		}
    			if(!ur1.equals("")) {
    				getHtmlSource(ur1);
    				ViewSourceFrame vsframe=new ViewSourceFrame(htmlSource);
    				vsframe.setBounds(0,0,800,500);
    				vsframe.setVisible(true);
    			}
    			else {
    				JOptionPane.showMessageDialog(WebBrowser.this, "请输入链接地址 ", "网页浏览器", JOptionPane.ERROR_MESSAGE);
    			}
    		}
    		else if(e.getSource()==reloaditem) {
    			ur1=jurl.getText();
    			if(ur1.length()>0&&ur1.startsWith("http://")) {
    				try {
    					jEditorPane1.setPage(ur1);
    					jEditorPane1.setEditable(false);//控件不能被编辑
    					jEditorPane1.revalidate();//对组件进行检验
    				}
    				catch(Exception ex) {
    			}
    			}
    			//刷新
    			else if(ur1.length()>0&&!ur1.startsWith("http://")) {
    				ur1="http://"+ur1;
    				try {
    					jEditorPane1.setPage(ur1);
    					jEditorPane1.revalidate();//对组件进行检验
    				}
    				catch(Exception ex) {
    				}
    				}
    			}
    	}
    	//保存文件
    void saveFile(final String ur1) {
    	final String linesep=System.getProperty("line.separator");//获得指定键指示的系统属性
    	chooserl.setCurrentDirectory(new File("."));//设置当前目录
    	chooserl.setDialogType(JFileChooser.SAVE_DIALOG);//设置此对话框的类型,指示JFileChooser支持Save文件操作的类型值
    	chooserl.setDialogTitle("另存为");//设置显示在JFileChooser窗口标题栏的字符串
    	if(chooserl.showSaveDialog(this)!=JFileChooser.APPROVE_OPTION)//弹出一个SaveFile文件选择器对话框,选择确认(yes,ok)后返回该值
    		return;
    	this.repaint();//重绘
    	Thread thread=new Thread() {
    		public void run(){
    			try {
    				java.net.URL source=new URL(ur1);
    				InputStream in=new BufferedInputStream(source.openStream());
    				BufferedReader br=new BufferedReader(new InputStreamReader(in));//起到缓存作用
    		File fileName=chooserl.getSelectedFile();//返回选中的文件
    		FileWriter out=new FileWriter(fileName);
    		BufferedWriter bw=new BufferedWriter(out);//起到缓存作用
    				String line;
    				while((line=br.readLine())!=null) {
    					bw.write(line);
    					bw.newLine();//写入一个分隔符
    				}
    				bw.flush();
    				bw.close();
    				out.close();
    				String dMessage=ur1+"已经被保存至"+linesep+fileName.getAbsolutePath();//返回抽象路径名的绝对路径名字符串
    			String dTitle="另存为";
    	int dType=JOptionPane.INFORMATION_MESSAGE;//用户选择项目		JOptionPane.showMessageDialog((Component)null,dMessage,dTitle,dType);//显示MessageDialog
    			}
    			catch(java.net.MalformedURLException muex) {
    	JOptionPane.showMessageDialog((Component)null,muex.toString(),"网页浏览器",JOptionPane.ERROR_MESSAGE);
    			}
    			catch(Exception ex) {				JOptionPane.showMessageDialog((Component)null,ex.toString(),"网页浏览器",JOptionPane.ERROR_MESSAGE);
    			}
    	}
    };
    thread.start();
    }
    //获取源
    void getHtmlSource(String ur1) {
    	String linesep,htmlLine;
    	linesep=System.getProperty("line.separator");
    	htmlSource="";
    	try {
    		java.net.URL source=new URL(ur1);
    		InputStream in=new BufferedInputStream(source.openStream());
    		BufferedReader br=new BufferedReader(new InputStreamReader(in));
    		while((htmlLine=br.readLine())!=null) {
    			htmlSource=htmlSource+htmlLine+linesep;
    		}
    		}
    	catch(java.net.MalformedURLException muex) {		JOptionPane.showMessageDialog(WebBrowser.this,muex.toString(),"网页浏览器",JOptionPane.ERROR_MESSAGE);
    	}
    	catch(Exception e) {
    	JOptionPane.showMessageDialog(WebBrowser.this,e.toString(),"网页浏览器",JOptionPane.ERROR_MESSAGE);
    	}
    }
    public void hyperlinkUpdate(HyperlinkEvent e)
    {
    	try {
    		if(e.getEventType()==HyperlinkEvent.EventType.ACTIVATED)
    			jEditorPane1.setPage(e.getURL());
    		jurl.setText(e.getURL().toString());
    		historyindex=history.size()-1;
    	}
    	catch(Exception ex) {
    		ex.printStackTrace(System.err);
    	}
    }
    public static void main(String[] args) {
    	try {		UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());//使用LookAndFeel对象设置当前的默认外设
    	}
    	catch(Exception e) 
    	{
    		}
    	WebBrowser webBrowser=new WebBrowser();
    	webBrowser.pack();
    	webBrowser.setVisible(true);
    	}
    class JEditorPane2 extends JEditorPane implements MouseListener{
    private static final long seriaersionUID=1L;//版本控制
    private JPopupMenu pop=null;//弹出菜单
    private JMenuItem copy=null,paste=null,cut=null;//三个功能菜单
    public JEditorPane2() {
    	super();
    	init();//通知此 applet 它已经被加载到系统中
    }
    private void init() {
    	this.addMouseListener(this);
    	pop=new JPopupMenu();
    	pop.add(copy=new JMenuItem("复制"));
    	pop.add(paste=new JMenuItem("粘贴"));
    	pop.add(cut=new JMenuItem("剪切"));
    	copy.setAccelerator(KeyStroke.getKeyStroke('C',InputEvent.CTRL_DOWN_MASK));
    	paste.setAccelerator(KeyStroke.getKeyStroke('V',InputEvent.CTRL_DOWN_MASK));
    	cut.setAccelerator(KeyStroke.getKeyStroke('X',InputEvent.CTRL_DOWN_MASK));
    	copy.addActionListener(new ActionListener(){
    		public void actionPerformed(ActionEvent e) {
    			action(e);
    		}
    	});
    	paste.addActionListener(new ActionListener() {
    		public void actionPerformed(ActionEvent e) {
    			action(e);
    		}
    	});
    	cut.addActionListener(new ActionListener() {
    		public void actionPerformed(ActionEvent e) {
    			action(e);
    		}
    	});
    	this.add(pop);
    }
    //菜单动作
    public void action(ActionEvent e) {
    	String str=e.getActionCommand();
    	if(str.equals(copy.getText())) {
    		this.copy();
    	}
    	else if(str.equals(paste.getText())){
    		this.paste();
    	}
    	else if(str.equals(cut.getText())) {
    		this.cut();
    	}
    }
    public JPopupMenu getPop() {
    	return pop;
    }
    public void setPop(JPopupMenu pop) {
    	this.pop=pop;
    }
    //剪切板中是否有文本数据可供粘贴
    public boolean isClipboardString() {
    	boolean b=false;
    	Clipboard clipboard=this.getToolkit().getSystemClipboard();
    	Transferable content=clipboard.getContents(this);
    	try {
    	if(content.getTransferData(DataFlavor.stringFlavor)instanceof String) {
    			b=true;
    		}
    	}
    	catch(Exception e) {
    }
    	return b;
    }
    //文本组件中是否具备复制的条件
    public boolean isCanCopy() {
    	boolean b=false;
    	int start=this.getSelectionStart();
    	int end=this.getSelectionEnd();
    	if(start!=end)
    		b=true;
    	return b;
    }
    public void mouseClicked(MouseEvent e) {
    	}
    public void mouseEntered(MouseEvent e) {
    	}
    public void mouseExited(MouseEvent e) {	
    }
    public void mousePressed(MouseEvent e) {
    	if(e.getButton()==MouseEvent.BUTTON3) {//鼠标右键
    		copy.setEnabled(isCanCopy());
    		paste.setEnabled(isClipboardString());
    		cut.setEnabled(isCanCopy());
    		pop.show(this,e.getX(),e.getY());
    	}
    }
    public void mouseReleasrd(MouseEvent e) {	
    }
    }
    }
    

    ViewSourceFrame类:实现网页浏览器源代码查看的主体框架,并提供了源代码的保存功能

    package 网页浏览器;
    import java.awt.datatransfer.Clipboard;//获得系统剪切板
    import java.awt.datatransfer.DataFlavor;//映射
    import java.awt.datatransfer.Transferable;//提供在应用程序之间和在应用程序内部传输数据的接口和类
    import java.awt.*;//提供用户界面原件
    import javax.swing.*;//提供按钮类
    import java.awt.event.*;//定义了许多不同类型的事件监听器类
    import javax.swing.event.*;//提供swing事件包
    import javax.swing.border.*;//提供围绕 Swing 组件绘制特殊边框的类和接口
    import javax.swing.filechooser.*;
    import java.io.*;//提供输入输出流
    import java.util.*;//提供实用方法和数据结构
    class ViewSourceFrame<jTextArea1> extends JFrame implements ActionListener{
    JPanel contentPane;
    JPanel panel1=new JPanel();
    JPanel panel2=new JPanel();
    Border border1;
    JButton closebutton=new JButton();
    JButton savebutton=new JButton();
    JScrollPane jScrollPanel=new JScrollPane();
    TextAreaMenu jTextArea1=new TextAreaMenu();
    String htmlSource;
    public ViewSourceFrame(String htmlSoure) {
    	this.htmlSource=htmlSource;
    	enableEvents(AWTEvent.ACTION_EVENT_MASK);
    	setSize(new Dimension(600,500));
    	setTitle("源代码");
    	setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    	contentPane=(JPanel)getContentPane();
    	contentPane.setLayout(new BorderLayout());
    	panel2.setLayout(new FlowLayout());
    	savebutton.setText("保存");
    	closebutton.setText("退出");
    	closebutton.addActionListener(this);
    	savebutton.addActionListener(this);
    	jScrollPanel.getViewport().add(jTextArea1,null);
    	border1=BorderFactory.createEmptyBorder(5,5,5,5);//创建一个框,框的头部为5像素,左为5像素,底部为5像素,右为5像素宽
    	panel1.setLayout(new BorderLayout());
    	panel1.setBorder(border1);
    	panel1.add(jScrollPanel,BorderLayout.CENTER);
    	contentPane.add(panel1,BorderLayout.CENTER);
    	panel2.add(savebutton);
    	panel2.add(closebutton);
    	contentPane.add(panel2,BorderLayout.SOUTH);
    	this.jTextArea1.setEditable(true);//这个函数的控件能被编辑
    	this.jTextArea1.setText(this.htmlSource);
    	this.jTextArea1.setCaretPosition(0);//观察文本的字段的功能显示
    }
    class TextAreaMenu extends JTextArea implements MouseListener{
    private static final long seriaerVsionUID=1L;
    private JPopupMenu pop=null;//弹出菜单
    private JMenuItem copy=null,paste=null,cut=null;//三个功能菜单
    public TextAreaMenu() {
    super();
    init();//通知此 applet 它已经被加载到系统中
    }
    private void init() {
    	this.addMouseListener(this);
    	pop=new JPopupMenu();
    	pop.add(copy=new JMenuItem("复制"));
    	pop.add(paste=new JMenuItem("粘贴"));
    	pop.add(cut=new JMenuItem("剪切"));
    	copy.setAccelerator(KeyStroke.getKeyStroke('C',InputEvent.CTRL_DOWN_MASK));
    	paste.setAccelerator(KeyStroke.getKeyStroke('V',InputEvent.CTRL_DOWN_MASK));
    	cut.setAccelerator(KeyStroke.getKeyStroke('X',InputEvent.CTRL_DOWN_MASK));
    	copy.addActionListener(new ActionListener() {
    		public void actionPerformed(ActionEvent e) {
    			action(e);
    		}
    	});
    	paste.addActionListener(new ActionListener() {
    		public void actionPerformed(ActionEvent e) {
    			action(e);
    		}
    	});
    	cut.addActionListener(new ActionListener() {
    		public void actionPerformed(ActionEvent e) {
    			action(e);
    		}
    	});
    	this.add(pop);
    }
    //菜单动作
    public void action(ActionEvent e) {
    	String str=e.getActionCommand();
    	if(str.equals(copy.getText())) {
    	this.copy();	//复制
    	}else if(str.equals(paste.getText())) {
    		this.paste();//粘贴
    	}else if(str.equals(paste.getText())) {
    		this.cut();//剪切
    	}
    	}
    public JPopupMenu getPop() {
    	return pop;
    }
    public void setPop(JPopupMenu pop) {
    	this.pop=pop;
    }
    //剪切板中是否有文本数据可供粘贴
    public boolean isClipboardString() {
    	boolean b=false;
    	Clipboard clipboard=this.getToolkit().getSystemClipboard();
    	Transferable content=clipboard.getContents(this);
    	try {
    		if(content.getTransferData(DataFlavor.stringFlavor)instanceof String) {
    			b=true;
    		}
    	}catch(Exception e) {		
    	}
    	return b;
    }
    //文本组件中是否具备复制的条件
    public boolean isCanCopy() {
    	boolean b=false;
    	int start=this.getSelectionStart();
    	int end=this.getSelectionEnd();
    	if(start!=end)
    		b=true;
    	return b;
    }
    public void mouseClicked(MouseEvent e) {	
    }
    public void mouseEntered(MouseEvent e) {	
    }
    public void mouseExited(MouseEvent e) {
    }
    public void mousePressed(MouseEvent e) {
    	if(e.getButton()==MouseEvent.BUTTON3) {//鼠标右键
    		copy.setEnabled(isCanCopy());
    		paste.setEnabled(isClipboardString());
    		cut.setEnabled(isCanCopy());
    		pop.show(this,e.getX(),e.getY());
    	}
    }
    public void mouseReleased(MouseEvent e) {
    }
    }
    public void actionPerformed(ActionEvent e) {
    	String url="";
    	if (e.getSource()==closebutton) {
    		dispose();
    	} else if(e.getSource()==savebutton) {
    		JFileChooser fc = new JFileChooser();
    		int returnVal = fc.showSaveDialog(ViewSourceFrame.this);
    		File saveFile = fc.getSelectedFile();
    		try {
    			FileWriter writeOut = new FileWriter(saveFile);
    			writeOut.write(jTextArea1.getText());
    			writeOut.close();
    		} catch (IOException ex) {
    			System.out.println("保存失败");
    		}
    	}
    }
    }
    
    展开全文
  • web安全之浏览器安全(二)

    万次阅读 2017-10-23 16:15:14
    同源策略这个如果是个程序员一定不会陌生,这个是浏览器最核心的也是最基本的安全功能,可以说web就是构建在同源策略的基础上,浏览器只是针对同源策略的种实现。 试想如果没有同源策略,A网站的js脚步可以在B...
  • 自定义WebView,命名ProgressWebView,该ProgressWebView的个特点,加载网页地址的时候,动态显示加载进度,和普通浏览器差不多,代码如下:public ProgressWebView(Context context, AttributeSet attrs) {super...
  • 基于MFC实现的WEB浏览器

    千次阅读 2019-07-03 08:07:00
    、系统设计1.1 总体设计本次课程设计所实现的 Web 浏览器首先要实现设计要求中的功能,要有友好的界面,能正常的浏览网页,能实现后退、前进、刷新等基本功能。此外,在要求的功能上,对 Web 浏览器的功能进行了...
  • Remote Browser 是个用于使用JavaScript以编程方式控制诸如Chrome和Firefox类的Web浏览器的库
  • Min是这些新型浏览器之一。 顾名思义(无论如何,对我来说都是这样),Min是一款极简主义的浏览器。 这并不意味着它有任何明显的缺陷,它的开源Apache 2.0许可证激起了我的兴趣。 但是闵值得一看吗? 让我们找出...
  • 摘要:当我们在做web开发特别是在调试js代码时,会经常使用的Google浏览器,这个时候就会碰到我们写的js代码不能及时生效的问题。这是因为我们所用的Google浏览器默认是有缓存的,但是有的时候缓存可能使我们调试中...
  • 三大浏览器内核之一,配合xulruner开发自己的浏览器,非常不错的东西。
  • 1. Web浏览器环境 HTML定义内容,CSS提供表现形式,JS为内容及表现形式增加行为。 JS的作用就是增强用户的浏览体验,使得信息的获取和传输更加容易,用户体验不应依赖于JS,但是JS可以作为这种体验的工具。 无...
  • 3 月 12 日,34 岁的英国科学家 Tim Berners-Lee 在他所在的欧洲核子研究组织提交了篇名为《关于信息化管理的建议》(英文是 Information Management:A Proposal)的文章,初步阐释了后来被称为 World Wide Web(后...
  • Java web基础之浏览器

    2015-04-22 20:16:27
    个网页,用户通过浏览器访问,浏览器个通用的软件,它只认识三样东西,css html 和 js(不是jsp),这些东西叫做前端。 其中html是从服务器上获取的,而无论是php jsp asp servlet...不管是什么,本质上...
  • WEB 安全是互联网时代重点关注的问题,也是产品设计中必须考虑的部分。作为个开发人员,有义务和责任打造安全可靠的 WEB 应用供用户使用,保证用户数据的机密性,完整性以及服务的可用性。 浏览器的同源策略 ...
  • 个由Opera Software开发的浏览器排版引擎,该内核在2003年的Opera7中首次被使用,该款引擎的特点就是渲染速度的优化达到了极致,也是目前公认网页浏览速度最快的浏览器内核。 Webkit : 苹果公司自己的内核,...
  • 所谓缓存就是再copy份数据的副本(可能是html页面,图片,文件),根据副本的存放位置不同,又可分为不同的缓存策略,比如浏览器缓存,就是将文件存储再客户端,再访问相同的URL时首先检查副本是否时最新的,如果...
  • web前端之浏览器: 知识汇总 、URL到页面 **准备阶段: ** 输入URL,Enter进入查找 浏览器在本地查找host文件,匹配对应的IP; 找到返回浏览器并缓存 没有,则进入路由查找; 找到返回浏览器并缓存 再没有,...
  • web浏览器发送请求Get,Post

    万次阅读 2007-02-02 11:08:00
    Get是所有web请求默认的方法,get请求将所有表单数据打成包,附到请求的url后面,浏览器将其作为url放在HTTP报头中,从浏览器缓存中可以查到请求串内容,但因把要传递的数据附加在url后面,传递数据量受限。...
  • Web前端开发之浏览器

    2017-03-08 15:07:51
    1:常用浏览器内核:IE、safari、Google chrome、Firefox。开发中只需适配这几个内核就够了。 2:浏览器作用:a:渲染网页文件 b:响应用户...3:浏览器会保存已浏览网页的文件,所以第二次比第次打开网页的速度更快。
  • 对WEB应用及WEB浏览器的一些思考

    千次阅读 2012-07-03 00:03:54
    面对当今纷繁的web技术,各种... 与桌面应用程序的不同处在于,web应用只需要浏览器即可运行。但是在个新技术层出不穷、浏览器百家争鸣的时代,各浏览器互不兼容的问题往往让开发人员和用户甚为恼火。一些技
  • Web前端性能优化 优化浏览器访问
  • 思路: 主流三款浏览器,Chrome,Firefox,IE。调用封装的方法,通过传入对应的浏览器的名字,打开对应的浏览器 实现方法: ...// 设置个全局属性webdriver.chrome.driver ,让脚本认识到chrome驱动...
  • 白帽子讲web安全 浏览器安全

    千次阅读 2019-02-27 17:28:00
    白帽子讲web安全 浏览器安全 (一些内容属于个人理解,如有错误请不吝指正) 同源策略 概念 所谓同源,一般是指域名、协议、端口相同。一般来说,只有同源的页面可以互相读取彼此的数据,或者改变彼此在浏览器中的...
  • 在我们与浏览器交互当中,难免会遇到打开浏览器新窗口的存在,那么我们如何来进行新窗口的切换呢? 方法有两种 方式:  打开新窗口,获取所有窗口  handles = driver.window_handles  切换新窗口  driver....
  • 浏览器池是个小巧但功能强大且可扩展的库,它使您仅需很少的配置和单个函数调用就可以无缝地同时控制多个无头浏览器。 目前,它支持 , ,并且可以使用插件轻松扩展。 我们所以创建浏览器池,是因为我们经常...
  • web前端常识之浏览器原理 、HTTP协议定义 URL的组成 例如:http://www.alimama.com/membersvc/index.htm。它的含义如下: http://:代表超文本传输协议,通知baidu.com服务器显示Web页,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,457
精华内容 5,382
关键字:

web浏览器之一