-
2018-10-27 14:09:06
转载:https://blog.csdn.net/qq_29970551/article/details/80268042
Web浏览器兼容如何测试
如今, 市面上的浏览器种类越来越多,版本迭代频繁,同一web页面在不同浏览器上显示效果不尽相同,而用户对浏览器的选择也会有很大的差异。为了保证项目在这些浏览器上都能正常工作,针对不同的浏览器做兼容性测试是十分有必要的。
浏览器相关兼容性测试时的测试要点:
1. 测试Web页面在不同浏览器的界面是否一致:
a)界面是否正常加载;
b)界面的CSS样式是否显示完全;
c)文字图片的统一性;
d)排版是否整齐一致;
e)数据是否正确;
f)特效是否正常显示等;
2. 测试web页面在不同浏览器的易用性(易于使用)是否一致和正常:
a)界面中的所有控件是否能正常显示和使用;
b)提示信息是否正常和完整;
c)在不同分辨率下界面是否友好和正常显示;
d)窗口的最大化和最小化 是否能正常显示等;
3. 测试web页面在不同浏览器的功能是否正常运转:
a)登录注册功能,搜索功能,导航功能,添加修改删除功能,导入导出功能;
b)上传下载图片功能,下载文件功能;
c)地图功能,视频播放功能,音频播放功能;
d)系统数据计算功能,链接跳转功能;
4. 测试web页面在不同浏览器一些键位是否能正确运作:
a)返回键;
b)回车键;
c)刷新键;
d)空格键;
e)快捷键等;
5. 测试web页面在不同浏览器性能方面是否正常和一致:
a)连接速度是否一致;
b)在同一环境下的,压力和负载测试的结果是否一致等;
6. 测试web页面在不同浏览器安全性方面是否正常和一致:
a)数据传输是否加密;
b)是否加密形式储存等。
浏览器选择时考虑的因素:
1. 内核
浏览器最重要的核心是“渲染引擎”,我们习惯称之为“浏览器内核”。它负责对网页语法解释并渲染网页,渲染引擎决定了浏览器如何显示网页内容以及页面格式信息,不同的浏览器内核对网页的语法解释也有不同,因此同一网页在不同内核的浏览器里的渲染效果也可能不同。
主要内核有Trident、Webkit、Gecko、Blink,如下:
内核
浏览器
特点
优缺点
Trident
IE
该内核程序在1997年的IE4中首次被采用,是微软在Mosaic代码的基础之上修改而来的,并沿用到IE11,也被普遍称作”IE内核”特点非开源。
优点:兼容性好,CPU占用小,内存占用小。
缺点:该内核BUG很多,安全性问题没有得到解决。
Gecko
Firefox
Gecko的特点时代码完全公开,因此其开发程度很高,全世界的程序员都可以为其编写代码,增加功能。
优点:拓展性强,插件定制方便。
缺点:操作太过复杂,组件多后会很臃肿,组装件启动较慢。
Webkit
Safri
Webkit引擎包含WebCore排版引擎及JavaScriptCore解析引擎,它的特点在于源码结构清晰、渲染速度极快。
优点:在于高效稳定,且源码结构清晰,易于维护,网页浏览速度较快。
缺点:对于网页代码的容错性不高,也就是说对网页代码的兼容性较低,会使一些编写不标准的网页无法正确显示。
Blink
Chrome
Blink是一个由Google和Opera Software开发的浏览器排版引擎,这一渲染引擎是开源引擎WebKit中WebCore组件的一个分支,但渲染结果与Webkit存在一定的差异。
优点:不易崩溃速度快源码结构清晰,易于维护,比webkit更精简、更高效。
缺点:对于网页代码的容错性不高,系统资源占用较高。
2. 市场占有率
在选择需要测试的浏览器时,还需要参考浏览器的市场占有率。考虑到客户群体的使用情况,目前只参考国内的浏览器市场占有率,具体排行如下:
3. IE版本
单独考虑IE是因为它是windows的默认浏览器,市场占有率较高,低版本的IE并不是完全执行W3C标准,并且各版本的内核功能不同,控件数据显示也不同,因此web项目在不同版本的IE上会有很多的兼容性问题。
在IE各个版本中,IE6因为版本太低,市场占有率不高,所以不考虑;而IE10因为windows系统原因,市场占有率低,所以也不考虑。目前IE版本市场份额如下:
结合以上3个因素,做浏览器兼容性测试时,主要会用以下浏览器进行测试:
chrome、Firefox、Safari、IE四种内核浏览器
chrome、Firefox、Safari、IE7、IE8、IE9、IE11、搜狗、QQ、2345浏览器
更多相关内容 -
电脑上不了无线网,那个网络诊断说:启动web浏览器查看注册页,然后按照说明连接Internet.
2021-01-17 16:33:00调整服务的方法是: 开始→控制面板→管理工具→服务→Wireless Zero Configuration(无线配置服务)→启动类型→自动或手动→应用→启动→确定 ③在控制面板找到-网络连接-无线网络-属性里面的tcp/ip协议-中ip地址...展开全部
最主要是因为无线网卡驱动程序不匹配或者无线网络服务未开启。
一、32313133353236313431303231363533e58685e5aeb931333365643661电脑上不了无线网原因:
①无线网卡驱动程序不匹配,更新即可。无线网卡驱动没更新步骤:
右键计算机→属性→设备管理器→网络适配器→右击无线网卡的子目录→更新驱动程序
②无线网络服务未开启,开启即可。调整服务的方法是:
开始→控制面板→管理工具→服务→Wireless Zero Configuration(无线配置服务)→启动类型→自动或手动→应用→启动→确定
③在控制面板找到-网络连接-无线网络-属性里面的tcp/ip协议-中ip地址和DNS地址是不是自动获取,如果不是改为自动获取。
④使用断网诊断工具修复网络DNS的错误。
⑤如果还不行 使用操作系统自带的检测功能:右击无线网络连接进行相应的诊断操作解决。
二、电脑上不了无线网解决方法:
第一步:应检查无线网卡的驱动是否安装正确。右键点击我的电脑-属性-硬件-设备管理器,查看是否存在标有问号或叹号的网络设备,如果有则说明无线网卡驱动安装不正确。使用金山卫士的“硬件检测”功能对无线网卡型号进行检测,然后使用有网络的电脑下载相应的驱动程序拷贝到问题电脑进行安装。
第二步:打开金山卫士点击主界面上的“重装系统”按钮,打开下方的“硬件检测”功能,点击“网卡”,看到自己的本地网卡及无线网卡信息,记下无线网卡的型号,到有网络的电脑上搜索驱动进行下载,再到本地电脑进行安装即可。
如果驱动安装正确,那么笔记本无线网络连接不上的问题一般是无线网络上网设置不正确导致的。对照以下的情况调整笔记本无线上网设置即可。
-
基于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("保存失败"); } } } }
-
pgAdmin启动时浏览器页面一直转圈圈 无法正常打开页面
2021-01-26 18:16:00最近新安装了 postgres,同时安装了 pgAdmin 4,但是遇到了无法启动的问题。 问题描述: 打开 pgAdmin 4 ,弹出浏览器页面时一直处于转圈圈加载的页面 使用浏览器开发者工具检查,发现报错信息 Refused to execute ...
最近新安装了 postgres,同时安装了 pgAdmin 4,但是遇到了无法启动的问题。
问题描述:
打开 pgAdmin 4 ,弹出浏览器页面时一直处于转圈圈加载的页面
使用浏览器开发者工具检查,发现报错信息
Refused to execute script from 'http://127.0.0.1:54943/static/vendor/require/require.min.js?ver=42800' because its MIME type ('text/plain') is not executable, and strict MIME type checking is enabled.
Refused to execute script from 'http://127.0.0.1:54943/static/js/generated/vendor.main.js?ver=42800' because its MIME type ('text/plain') is not executable, and strict MIME type checking is enabled.
Refused to execute script from 'http://127.0.0.1:54943/static/js/generated/vendor.others.js?ver=42800' because its MIME type ('text/plain') is not executable, and strict MIME type checking is enabled.
Refused to execute script from 'http://127.0.0.1:54943/static/js/generated/pgadmin_commons.js?ver=42800' because its MIME type ('text/plain') is not executable, and strict MIME type checking is enabled.
解决方案:
从报错信息可以看出,浏览器没有将 require.min.js、vendor.main.js、vendor.others.js、pgadmin_commons.js 这几个文件解释为 JavaScript,所以无法执行这些脚本,他们的响应头里面 Content-Type 是 text/plain。可能是因为 注册表被破坏,把扩展名为 js 的文件类型注册为 ‘text/plain’
方法一:
打开注册表:
计算机\HKEY_CLASSES_ROOT\.js\
修改
Content Type
选项的配置,将 text/plain 修改为 text/javascript 或 application/javascript方法二:
修改
postgres 安装目录/pgAdmin 4/web
路径下的config.py
文件在文件末尾添加
import mimetypes mimetypes.add_type('application/javascript', '.js')
方法三:
修改
postgres 安装目录/pgAdmin 4/web
路径下的config.py
文件 第179行将 X_CONTENT_TYPE_OPTIONS = “nosniff” 修改为 X_CONTENT_TYPE_OPTIONS = ""
在方法二、三中,文本编辑器没有用管理员模式运行的话,无法直接保存对
config.py
文件的修改,可以考虑- 先用管理员模式运行文本编辑器,然后在编辑器里面打开该文件
- 将该文件复制到其他路径,修改后再替换回该目录
最后,在右下角托盘右击 pgAdmin 4 图标,shut down server,再重新打开 pgAdmin 4
-
linux部署web项目设置了8080端口,启动成功后浏览器访问无效的问题
2019-01-25 14:35:31最近自己搭了个springBoot的小项目玩,但是部署到linux后,日志显示启动成功,通过ip访问时却无法访问。最后将80端口映射到8080后就解决了该问题。肯定有人遇到这个问题的原因多样吧,但这里就记录一下自己关于这个... -
Web浏览器中的JavaScript
2019-01-10 22:46:40它表示Web浏览器的一个窗口或窗体,并且可以用标识符window来引用它。Window对象定义了一些属性,比如,指代Location对象的location属性,Location对象指定当前显示在窗口中的URL,并允许脚本往窗口里载入新的URL: ... -
通过Web页面启动本地应用程序
2019-06-02 17:55:36注册自己的协议 在window下需要将自己的协议添加至注册表中,下面以打开wps word为例 // 新建word.reg注册表文件(可以使用vscode进行编辑,安装reg插件来提供一些小提示) Windows Registry Editor Version 5.00... -
兼容所有浏览器的Web打印控件的设计方案
2018-11-22 19:08:38兼容所有浏览器的Web打印控件的设计方案 设计方案的简单实现网址:http://www.lc-simple.com/PrintTest/ 第一章:Web打印控件的原理 Web打印控件的工作的原理如下: 在需要打印的客户端电脑(操作系统... -
web端启动本地exe客户端
2020-07-20 17:35:411. 背景 项目中常用浏览器有Chrome和IE,对于web端启动本地exe客户端。早期,Chrome和IE都提供了ActiveXObject对象,以它的exec接口,只需传入本地exe客户端所在安装路径为参数便可启动客户端。现今,Chrome摒弃了该... -
您试图在此 Web 服务器上访问的 Web 应用程序当前不可用...请点击 Web 浏览器中的“刷新”按钮重试您的请求。
2017-02-24 15:23:24请点击 Web 浏览器中的“刷新”按钮重试您的请求。 管理员注意事项: 详述此特定请求失败原因的错误消息可在 Web 服务器的系统事件日志中找到。请检查此日志项以查明导致该错误发生的原因。 如图: 最近连着... -
使用web服务器写一个登陆注册的界面
2017-09-09 09:59:53搭建web应用 使用Webstorm搭建Node.js web应用 使用上述搭建好的web服务器写一个登陆注册的界面 -
WEB基础知识
2020-09-23 17:00:58WEB基础知识 什么是web web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务,为浏览者在... -
WEB 请求处理 一:浏览器 请求发起处理
2018-12-10 15:17:11最近,终于要把《WEB请求处理系列》提上日程了,一直答应小伙伴们给分享一套完整的WEB请求处理流程:从浏览器、Nginx、Servlet容器,最终到应用程序WEB请求的一个处理流程,前段时间由于其他工作事情的安排,一直未... -
windows全屏打开Google浏览器命令,支持bat批处理开机启动
2019-03-08 15:06:58–debug-on-start,如果程序包含基础/调试/debug_on_start_win.h,(仅限于Windows),该过程将自启动JIT系统注册的调试器,并会等待60秒钟,让调试器连接到自身并打一个断点。 –disable-breakpad,禁用崩溃... -
Web页面调用本地客户端程序并传参
2019-05-17 11:13:15好久没跟新博客了,今天跟新2019年的第一篇博客,最近在做项目,需求就是Web页面调用本地客户端程序并传参,传参是为了避免客户端再次输入账号密码,直接跳过登录。 翻了不少资料,总的来说好像都要操作注册表调用... -
启动Web Tours 服务
2016-09-25 22:48:523、打开浏览器,在地址栏输入http://127.0.0.1:1080/WebTours/ 可以自己注册(sign up now),然后用自己注册的账号登录,或者用默认账号密码 4、默认账号是jojo,密码是bean,登录之后的界面如下图所示 5、 -
常见六大Web安全问题
2021-11-26 17:36:41一、 XSS ...XSS 的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私 -
浏览器相关原理
2022-01-22 13:18:32浏览器相关原理XSS攻击 (跨站脚本攻击)存储型XSS反射型XSSDOM型XSS防范XSSCSRF攻击(跨站请求伪造) XSS攻击 (跨站脚本攻击) 基本概念: XSS即跨站脚本攻击,是一种代码注入攻击。 攻击者将恶意代码注入到目标... -
web浏览器无插件播放实时音视频技术---WebRTC2SIP(三)
2017-07-31 14:49:01This option is only useful if the RTCWeb Breaker module is enabled at the web browser side. Enabling video jitter buffer gives better quality and improve smoothness. No RTCP-NACK messages will be sent... -
本地服务注册远程nacos遇到的坑,浏览器可以访问nacos控制页面,但本地服务无法注册
2020-11-11 16:14:17我是将nacos部署到服务器上,然后将本地服务往远程nacos上注册,本地服务配置如下: spring: application: name: gateway1 profiles: active: dev cloud: nacos: config: server-addr: 远程IP:8848 file-... -
web网络安全防护方案
2022-02-07 10:42:45在Web信息系统高速发展的今天,Web信息系统的各种各样的安全问题已暴漏在我们面前。Web信息系统各种安全问题潜伏在Web系统中,Web系统的时时刻刻遭受各种攻击的安全威胁。这里就跟大家聊聊web网络安全防护方案。 ... -
JavaWeb小项目-简单Web登录注册界面
2020-09-14 16:44:42Java小项目-简单Web登录注册界面 为了完成一个作业弄的。 Java+servlet+Mysql 本次项目的原型作者是“WANGZIC” 这是它原项目的下载链接 原代码有一些问题,本项目作出了一些改动,值得一提的是漏洞很多,仅供新手... -
webcomponents
2021-05-31 05:11:52ngx-build-elements 示例 npm install npm run build npm start 细节: ... 浏览器应该加载custom-elements.bundle.js ,它注册自定义元素。 然后浏览器应该呈现自定义元素,因为它在index.html 。 -
[网络安全自学篇] 三十七.Web渗透提高班之hack the box在线靶场注册及入门知识
2020-01-09 19:05:33hack the box是一个在线渗透平台,模拟了真实环境且难度较大,而且用户注册该网站时需要绕过关卡并获取邀请码,涉及审查元素、base64解密、发送post请求等操作,挺有意思的。这是一篇基础性文章,将讲述注册过程、... -
web页面判断是否安装某app,从web启动app应用
2017-12-19 10:36:16web页面判断是否安装某app,从web启动app应用 ...客户端应用可以向操作系统注册一个 URL scheme,该 scheme 用于从浏览器或其他应用中启动本应用。通过指定的 URL 字段,可以让应用在被调起后直接打开某些特定 -
自定义协议从浏览器中启动本地应用程序
2017-12-19 11:00:245. 至此在大多数浏览器中,已经能够通过自定义的协议启动指定应用程序了. 6. 对于Chrome浏览器,若不能启动指定的应用,请查看如下几点 自定义协议后的参数不能太短,最好超过三个字符,并且最好不要用一些常用... -
WEB请求处理一:浏览器请求发起处理
2018-04-19 21:14:22https://www.jianshu.com/p/558455228c43最近,终于要把《WEB请求处理系列》提上日程了,一直答应小伙伴们给分享一套完整的WEB请求处理流程:从浏览器、Nginx、Servlet容器,最终到应用程序WEB请求的一个处理流程,... -
利用Java实现网页浏览器
2021-02-12 14:50:45它专用于基本的桌面服务,如在正确的编辑器里打开一个文件,新建一封 Email,或者把一个URL发送到默认的web浏览器。构建这些东西需要做很多的工作,但使用起来却非常容易。如果你想告诉操作系统打开一个Word文档,...