精华内容
下载资源
问答
  • 基于Spring springMVC mybatis三种开源框架,构建java web应用
  • 用AngularJS开发下一代Web应用(中文)高清完整版PDF

    万次下载 热门讨论 2013-11-27 13:26:23
    完整英文版在这里:http://download.csdn.net/detail/zhouruitao/6548305, 此部分是中文版的,免费提供。
  • 如何用纯 Python 写 Web 应用

    千次阅读 多人点赞 2020-01-20 14:45:52
    王树义读完需要16分钟速读仅需 6 分钟不用学前端编程,你就能用 Python 简单高效写出漂亮的交互式 Web 应用,将你的数据分析成果立即展示给团队和客户。1 痛点从我开始折腾数...

    王树义

    读完需要

    16

    分钟

    速读仅需 6 分钟

    不用学前端编程,你就能用 Python 简单高效写出漂亮的交互式 Web 应用,将你的数据分析成果立即展示给团队和客户。

    1

       

    痛点

    从我开始折腾数据分析工具的那一天,就没有想明白一件事儿——我打算把数据分析的成果做成一个 Web 应用,为什么这么难?

    我需要的核心功能,无非是在网页上接收用户输入,然后做分析处理,把分析结果反馈给用户,完事儿。

    可是这谈何容易?

    很多人都会微笑着告诉你,想做 Web 应用?这得学前端编程, HTML + Javascript 了解一下吧!

    什么?你还需要在后台做数据分析?那你就得学 Web 框架了。

    你说喜欢 Python ?那就学个 Django 或者 Flask 好了。

    我也不是没有看过 Django 和 Flask 的教程,还曾经付费学习过。光是 Django 配置环境,就够写一章出来。

    作为学习的中间成果,我还写了这篇《如何用 Python 做 Web 开发?——Django 环境配置》分享给你。

    真正让我痛苦的,不是 Web 框架的操作有多么琐碎,而是教程里的案例,为什么都那么奇怪?

    几乎所有的教程,都指向一个目标:

    来,我教你做一个 blog 出来!

    我用你教?!

    我要是想用 blog ,可以直接注册一个免费的啊!为什么我要自己开发个 blog 出来?

    为什么你就不能告诉我,该怎么把我目前的数据分析结果,迅速挪到 Web 页面上,跟用户实时交互?

    虽然二者的结果,都是做一个 Web 应用出来。但是,它们关注的焦点,需要的功能,能一样吗?

    但是人家写书和做教程的人,就是不疾不徐,坚持一定要教会你,如何做一个 blog 出来……

    你不学,又能怎么办呢?你难道想只凭 Python 脚本,就做一个 Web 应用出来?

    还真别说,最近,这个事儿从幻想,变成了现实。

    2

       

    样例

    这不,我就用纯 Python 脚本写了个 Web 应用。

    我编写的代码里,没有一丝半毫的 Web 框架,Javascript,甚至是 HTML 。

    这玩意儿能用吗?

    你自己来试试看。

    请你打开浏览器,输入以下链接:

    https://helloworld-streamlit.herokuapp.com/

    你会看到下面的初始化界面。

    初始化完毕之后,页面会分成左右两栏。左面是两个下拉候选框,分别让你指定需要分析的数据范围。

    上面一个,是事件类型;

    下面一个,是事件发生归属地。

    如果你看过《如何用 Python 和循环神经网络预测严重交通拥堵?》,应该对这个数据集很熟悉。

    只不过,当时我们更注重的,是用循环神经网络搭建了一个严重拥堵事件预测模型。

    而今天,我们是要进行探索性数据分析,也就是根据我们感兴趣的目标,对数据进行整理操作,然后可视化显示。

    选定之后,你会看到右侧提示两个信息:

    • 你筛选之后,数据框包含行数;

    • 在层叠地图上的可视化结果。

    怎么样?

    麻雀虽小,五脏俱全。

    虽然咱们这个 Web 应用很简单,不过交互分析该有的功能和流程,基本上都涵盖了。

    你可能会问:

    王老师,编这么一个应用出来,不简单吧?

    让我带你到幕后,看看是不是很复杂。

    3

       

    幕后

    我把这个应用的全部源代码,都为你存储到了 Github 上。请你访问这个网址获取。

    可以看到,一共包含了 4 个文件。

    有意思的是,其中 3 个,包括:

    • Procfile

    • setup.sh

    • requirements.txt

    都只是部署到远程服务器时,需要用到的配置文件而已。

    也就是说,只有最后一个 helloworld.py 是主角,它包含了实现咱们全部交互式数据分析功能的 Python 脚本文件。

    这代码,少说也得有几百行吧?

    别担心,打开来看看:

    上面这张截图,就已经包含了实现交互数据分析功能的全部代码。

    神奇吧?

    4

       

    解读

    这么短的代码,为什么能有如此强大的功能?

    这是因为它背后使用的一个软件包,叫做 streamlit 。

    它是干什么用的?

    一言以蔽之,给你赋能,让你能够不去操心什么前端后端。只写 Python ,只关注功能,你就能写出一个交互式 Web 应用出来。

    当然,既然最后是 Web 应用,那么实际上前后端的功能都是齐备的。

    只不过,这些交由 Streamlit 来帮你费心操办。你根本不用管。

    5

       

    爆发

    为什么会有人做了这么一款神器出来?

    原因很简单,咱们前面提到的痛点,是大伙儿都有的。

    咱们这些麻瓜(Muggle),遇到痛点只能忍着。

    但是真正的魔法师(优秀程序员),是忍不了的。

    在这段来自 PyData LA 2019 的视频里,Streamlit 的 CEO Adrien Treuille 谈及了他在数据智能企业中,长期遭遇的痛点。

    最大的痛点,就是数据科学家训练好机器学习模型后,需要验证效果,和用户反馈沟通。

    但是,做机器学习的工程师本身,并不掌握这一整套的工具栈。

    所以,就得在把全部的数据分析和模型训练工作完成后,把这东西移交给一个工具制作团队。

    人家做完以后,就告诉数据科学团队说,做好了。但是注意,现在处于需求冻结阶段。这个应用你们可以随便用,只是别乱改。改坏了我们管不了。因为最近两个月,我们还得给其他若干数据分析团队做 app 。大概几个月以后,我们又能回来帮助你们了……

    Adrien Treuille 很敏锐地捕捉到了这个长期痛点,于是在 2018 年, 创立了 streamlit 。

    目标很简单,给数据科学团队提供简单的工具,让他们使用已经掌握的 Python 编程技能,就能直接做 Web 应用。

    什么“等上两三个月不许改”?!你们自己慢慢儿玩儿去吧,我们想怎么改,就怎么改!

    至于做出来的东西嘛,可以是这样的:

    6

       

    资源

    看到这里,是不是心动了?也打算学习一下 Streamlit ?

    没问题,我前面给你提供的样例,就在 github 上,你可以直接查看源码。

    注意因为数据比较大,有接近 300 MB,github 免费空间放不下,所以我存到了云盘上。微信公众号后台回复“dfw”,就能看到下载链接。

    如果你希望重现这个小应用,并且一步步学习掌握 Streamlit 的基础知识和技能,我也已经为你写好了一份手把手的教程。

    它不仅教你如何设置环境,安装工具,写作代码,甚至连如何免费部署到 heroku 平台,让用户使用,都毫无保留地教给了你。

    那篇文章,我用于参加少数派年度征文活动,所以就不能全文展示在这里了。文末我会给你相关链接。

    读完以后,如果你觉得有收获,欢迎在少数派平台上帮我点个赞。

    7

       

    思考

    尝试过之后,你应该不难发现,Streamlit 给你带来了什么。

    如果你学过 Javascript 和 Flask, Django 等 Web 应用开发技术,Streamlit 可以加快你的 Web 应用开发与测试进程。

    如果你还没有学过上述技术, Streamlit 可以给你赋能,让你一下子有了把数据分析结果变成产品的能力。

    给你讲点儿更激进的。

    有人已经希望能用它替代掉 Flask 用于产品发布了。

    还有人说,将来写技术文档,也应该充分使用 Streamlit 。

    甚至,还把它比作了数据科学界的 iPhone 。

    这里,它是借喻 iPhone 开启智能手机时代,说明 Streamlit 的划时代性。

    我不希望你也变得如此激进。

    因为这里提到的每一种功用,现在还都有非常专业的工具做的更好,而且新的工具也在不断涌现。

    例如说,我们在多个教程中一直使用 Jupyter Notebook 。

    现在凭借 Voila 扩展的加持,你也可以很轻松地把 Jupyter Notebook 变成 Web app ,而且可以免费运行在 mybinder 上面

    但是,你可以看到,一个新的工具,以一种简单,而不是更繁复的办法,解决一个功能痛点,是一件多么令人欣喜的事儿。

    看了这篇文章,可能会给你一种误解,似乎 JavaScript 为代表的前端编程技术,再也不需要学了。

    其实不是这样的。

    可以想象,开发门槛降低以后,将来会有更多的人使用 Python 来做 Web 应用。

    用 Streamlit 这样的方法,他们只是开发出了一个原型。

    要是想打造精品,就必须精细调控很多细节。

    这时候, 如果你精通 Javascript ,那你潜在的合作对象一下子就多了起来,你掌握的这门技术,也就有了更大的价值。

    还记得吗?我不止一次给你强调过,比起一个工具自身的能力来,协作网络更重要。忘了的话,记得复习《学 Python ,能提升你的竞争力吗?》。

    这就好像印刷术的发明,不是让会写字这件事儿变得失去价值,而是全社会都增大了对好作品的渴求。深刻的思考,加上有效的文字表达,会让你生存得更好。

    当然,如果你不希望精通写作技艺,只是想做一个抄书匠糊口。那么印刷术就可能会替代你的工作,结果就不那么美妙了。

    8

       

    小结

    这篇文章,我为你介绍了 Streamlit 这款有趣的工具。希望你读过之后,掌握了以下知识点:

    • 借助 Streamlit ,你可以用纯 Python 编制 Web 应用;

    • 学 Web 设计依然很有前途,因为你的潜在合作群体正在迅速扩大;

    • 不要惹魔法师(优秀程序员)。他们的痛点需求会转化成无尽的战斗力,兴许会直接替掉你的日常工作。

    9

       

    福利

    在教程中,你已经看到了,为了部署你的应用到 Heroku 等平台,你需要告诉服务端,安装哪些 Python 依赖软件包,也就是制作一个 requirements.txt

    在咱们这篇教程中,requirements.txt 比较简单,就像是这个样子:

    可以看到,除了软件包名称,你还需要指定其版本,以避免不同版本之间不兼容,或者运行结果出现差别。

    然而,如果你的程序里面,需要引入很多软件包和模块,如果手动一条条书写这种软件包依赖设定,就是一件非常繁琐而头痛的事儿。

    我在知识星球里面,写了一篇教程,分享给你如何自动化生成它。

    作为福利,我送你一张知识星球“玉树芝兰”免费体验卡。数量有限,先到先得。3 天以内,你都可以阅读到这篇教程,以及本星球近期推送的其他内容。

    10

       

    链接

    你可以点击“阅读原文”,查看我放在少数派平台上的这份教程。看完后别忘了点赞哦。

    感觉有用的话,请点“在看”,并且把它转发给你身边有需要的朋友。

    赞赏就是力量。

    由于微信公众号外部链接的限制,文中的部分链接可能无法正确打开。如有需要,请点击文末的“阅读原文”按钮,访问可以正常显示外链的版本。

    订阅我的微信公众号“玉树芝兰”,第一时间免费收到文章更新。别忘了加星标,以免错过新推送提示。

    如果你对 Python 与数据科学感兴趣,希望能与其他热爱学习的小伙伴一起讨论切磋,答疑解惑,欢迎加入知识星球。

    11

       

    延伸阅读

    你可能也会对以下话题感兴趣。点击链接就可以查看。

    题图:Photo by Luke Chesser on Unsplash

    展开全文
  • 如何使用Flutter开发web应用

    万次阅读 2019-06-21 22:48:53
    端的流程,至于实际的应用场景大家可以根据自己的需要自行开发。 开发环境配置 Flutter 1.5 及更高的版本才支持 Web 端部署,这主要指的是将 Dart 编译为 JavaScript ,所以,必须要确保我们本地的 Flutter SDK ...

    前言:Flutter系列的文章我应该会持续更新,从User Interface(UI)到数据相关(文件、数据库、网络)再到Flutter进阶(平台特定代码编写、测试、插件开发等),欢迎感兴趣的读者持续关注(可以扫描左边栏二维码或者搜索”IT工匠“关注微信公众号/头条号(微信公众号和头条号同名),会同步推送)。

    众所周知Google对于Flutter的期望是全平台统一UI开发,号称要做一套**“一份代码、全平台部署”**的UI框架,这一点在移动端已经很成熟了,国内有很多成功的案例,典型的像阿里的闲鱼客户端,但是Flutter所声称的桌面端和Web端的相关案例还很少,之前我写过一篇文章介绍如何将Flutter代码部署成为桌面端程序,那么本文就该介绍如何将Flutter部署为Web应用了。

    本文将会以一个实例来带大家一步一步探寻如何将Flutter应用程序部署到web端,我们先来看一下最终的效果:

    image-20190621195055828

    可以看到,就是一个简单的登录界面,没有太复杂的逻辑,旨在帮助大家走通Flutter部署到Web端的流程,至于实际的应用场景大家可以根据自己的需要自行开发。

    开发环境配置

    Flutter 1.5及更高的版本才支持Web端部署,这主要指的是将Dart编译为JavaScript,所以,必须要确保我们本地的Flutter SDK的版本在v1.5.4以上,建议直接使用命令flutter upgrade更新到最新版即可。

    安装flutter_web编译工具

    要想将Flutter代码编译为Web端可部署的应用程序,必须安装flutter_web,这是一个Flutter官方为我们开发并维护的编译工具,直接使用以下命令安装即可:

    flutter pub global activate webdev
    

    安装完成后,需要配置环境变量,直接将$HOME/.pub-cache/bin加入到你的环境变量中即可,由于电脑不同的操作系统配置环境变量的方式不同,这里就不一一展开赘述了,以mac操作系统为例:

    cd
    vim .bash_profile
    

    然后添加一行:

     export PATH="$PATH":"$HOME/Flutter/flutter/.pub-cache/bin"
    

    退出并保存,使用如下命令使其生效:

    source .bash_profile
    

    至此,我们的开发环境就搭建好了,可以看出,只要我们本地的Flutter环境配置的没有问题,配置Flutter for web只是多装了一个flutter_web编译工具而已,非常简单。

    创建项目

    区别于普通的Flutter项目,由于Flutterweb的支持目前还没有完全完成,相当于是一个供大家尝鲜的作品,所以创建Flutter for web项目和普通Flutter项目不一样,这里建议大家使用idea,我这里也以idea为例进行说明:

    创建Dart项目,而不是Flutter项目

    直接在Idea中新建项目,如下图所示:

    image-20190621200652154

    注意三点:

    1. 选择Dart项目,而不是新建Flutter项目
    2. 正确设置自己dart sdk的位置
    3. 选择Generate sample content中的Flutter Web App选项

    创建完成后我们的项目就默认支持部署到Web了,在Idea中应该可以直接点击运行按钮进行运行,或者可以在Idea的终端中输入:

    webdev serve
    

    进行运行,初次编译可能会下一些本项目所依赖的包,需要一分多钟,后面编译会快很多,编译完成后会弹出一个浏览器的窗口(注意,这里建议使用Chrome浏览器,其他浏览器笔者没有测试过,按照官方的说法,目前支持最好的应该是Chrome浏览器)如下图:

    image-20190621202310684

    我们来看看项目结构:

    image-20190621202725911

    可以看到,大体的项目结构了普通的Flutter项目差不多,知识多了一个web文件夹,下面是一些和web相关的文件和资源,后面我会具体讲其用处。

    编写代码

    创建好项目之后,我们就可以着手代码的编写了,这里不再详细叙述代码怎么写,和普通Flutter编写代码的规则是一模一样的,这里我在lib文件夹下新建了一个pages文件夹,然后新建了login_page.dart文件,编写登录界面的代码,完成后代码如下:

    import 'package:flutter_web/material.dart';
    
    class LoginPage extends StatefulWidget {
      @override
      State<StatefulWidget> createState() => new _LoginState();
    }
    
    class _LoginState extends State<LoginPage> {
      static final GlobalKey<ScaffoldState> _scaffoldKey =
          new GlobalKey<ScaffoldState>();
    
      final TextEditingController _phoneController = new TextEditingController();
      final TextEditingController _passwordController = new TextEditingController();
    
      bool _correctPhone = true;
      bool _correctPassword = true;
    
      bool showProgress = false;
    
      void _checkInput() {
        if (_phoneController.text.isNotEmpty) {
          _correctPhone = true;
        } else {
          _correctPhone = false;
        }
        if (_passwordController.text.isNotEmpty) {
          _correctPassword = true;
        } else {
          _correctPassword = false;
        }
        setState(() {});
      }
    
      _handleSubmitted(int flag) async {
        /**
         * flag=0:管理员登录
         * flag=1:用户登录
         */
        _checkInput();
        if (!_correctPassword || !_correctPhone) {
          return;
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
            key: _scaffoldKey,
            resizeToAvoidBottomPadding: false,
            body: new Stack(children: <Widget>[
              new Container(
                decoration: new BoxDecoration(
                    image: new DecorationImage(
                        image: new AssetImage('images/bg.jpeg'),
                        fit: BoxFit.cover)),
              ),
              new GestureDetector(
                onTap: () {
                  FocusScope.of(context).requestFocus(new FocusNode());
                },
              ),
              _buildLogInWidgets(),
            ]));
      }
    
      _buildLogInWidgets() {
        Color mainColor = Colors.black;
        return new Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly, //垂直方向对其方式
          crossAxisAlignment: CrossAxisAlignment.start, //水平方向对其方式
    
          children: <Widget>[
            Center(
              child: new Container(
                child: Center(
                  child: new CircleAvatar(
                      backgroundImage: AssetImage("images/iron_man_icon.png")),
                ),
              ),
            ),
            new Center(
              child: new Container(
                width: MediaQuery.of(context).size.width * 0.5,
                child: new Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: <Widget>[
                      new Container(
                        padding: const EdgeInsets.only(top: 32.0),
                        child: new TextField(
                          style: TextStyle(color: Colors.black),
                          cursorColor: mainColor,
                          controller: _phoneController,
                          keyboardType: TextInputType.text,
                          decoration: new InputDecoration(
                            hintText: '用户名',
                            hintStyle: TextStyle(color: mainColor),
                            errorText: _correctPhone ? null : '用户名不可为空!',
                            errorStyle: TextStyle(color: Colors.teal),
                            icon: new Icon(Icons.people, color: mainColor),
                            focusedBorder: UnderlineInputBorder(
                                borderSide: BorderSide(color: mainColor)),
                            enabledBorder: UnderlineInputBorder(
                                borderSide: BorderSide(color: mainColor)),
                            errorBorder: UnderlineInputBorder(
                                borderSide: BorderSide(color: mainColor)),
                          ),
                          onSubmitted: (value) {
                            _checkInput();
                          },
                        ),
                      ),
                      new Container(
                        padding: const EdgeInsets.only(top: 32.0),
                        child: new TextField(
                          style: TextStyle(color: Colors.black),
                          cursorColor: mainColor,
                          controller: _passwordController,
                          obscureText: true,
                          keyboardType: TextInputType.text,
                          decoration: new InputDecoration(
                            hintText: '密码',
                            hintStyle: TextStyle(color: mainColor),
                            errorText: _correctPassword ? null : '密码不可为空!',
                            errorStyle: TextStyle(color: Colors.teal),
                            icon: new Icon(Icons.lock_outline, color: mainColor),
                            focusedBorder: UnderlineInputBorder(
                                borderSide: BorderSide(color: mainColor)),
                            enabledBorder: UnderlineInputBorder(
                                borderSide: BorderSide(color: mainColor)),
                            errorBorder: UnderlineInputBorder(
                                borderSide: BorderSide(color: mainColor)),
                          ),
                          onSubmitted: (value) {
                            _checkInput();
                          },
                        ),
                      )
                    ]),
              ),
            ),
            new Center(
                child: new Column(
              children: <Widget>[
                new Container(
                  width: MediaQuery.of(context).size.width * 0.2,
                  child: new Material(
                    child: new FlatButton(
                      child: new Container(
                        child: new Center(
                            child: new Text(
                          "登录",
                          textScaleFactor: 1.5,
                          style: new TextStyle(
                              color: Colors.white, fontFamily: "Roboto"),
                        )),
                      ),
                      onPressed: () {
                        _handleSubmitted(0);
                      },
                    ),
                    color: Colors.teal,
                    borderRadius: BorderRadius.circular(10.0),
                    elevation: 5.0,
                  ),
                ),
                new Center(
                    child: Container(
                  margin: EdgeInsets.only(top: 20),
                  child: new FlatButton(
                    child: new Text("没有帐户? 注册",
                        style: new TextStyle(color: Colors.teal)),
                  ),
                )),
              ],
            )),
          ],
        );
      }
    }
    
    

    可以看到,代码和普通Flutter代码是一样的,只是需要注意以下几点:

    包的使用

    细心的同学可能会发现,我们这里导入的包是:

    import 'package:flutter_web/material.dart';
    

    而普通Flutter项目导入的是:

    import 'package:flutter/material.dart';
    

    原则就是原来的 package:flutter 改为 package:flutter_web ,原来的 dart:ui 改为 package:flutter_web_ui/ui.dart,当然,这些你只需要知道就好了,实际生产的时候直接快捷键按下,编辑器会自动帮我们导入正确的包。

    资源的使用

    我们之前使用资源文件(比如图片)的方式是在根目录下新建一个资源文件夹,然后将资源文件放在资源文件夹下,然后在pubspec.yaml文件中进行文件路径的声明,然后就可以使用了,在Flutter for web中,我们需要将原来的资源文件夹从之前的项目根目录迁移到web文件夹下,就像这样:

    image-20190621203620933

    然后就可以正常使用了,这也是迄今为止我发现的Flutter for web和普通Flutter项目的不同之处了。

    编写完布局文件后我们将main.dart稍作修改,引入我们的LoginPage

    import 'package:flutter_web/material.dart';
    import 'package:flutter_web_demo/pages/login_page.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page22'),
        );
      }
    }
    
    class MyHomePage extends StatelessWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            body: LoginPage());
      }
    }
    
    

    然后我们就可以运行起来看效果了:

    image-20190621195055828

    和开篇的效果图一样,不再赘述。

    总结

    本文我们通过一个简单的实例带大家走了一遍Flutterweb端部署的流程,可以看到,目前FlutterWeb上的部署已经没有任何压力了,只是由于生态还不完整,很多库和包还不能用,所以目前还无法投入商用软件中,希望Flutter可以发展的越来越完善。同时,结合笔者个人的开发经验,建议大家开发Flutter项目时一定不要怕麻烦,多用像mvp这类的项目结构,这样可以大大提高开发效率。

    关于Flutter for web的更多资料,可以参考Flutter官方的仓库:https://github.com/flutter/flutter_web

    展开全文
  • Web应用的测试内容

    千次阅读 2018-11-01 16:25:49
     链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的...

    功能测试

    1、链接测试
      链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的页面是否存在;最后,保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。
      链接测试可以自动进行,现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成,也就是说,在整个Web应用系统的所有页面开发完成之后进行链接测试。
      2、表单测试
      当用户给Web应用系统管理员提交信息时,就需要使用表单操作,例如用户注册、登陆、信息提交等。在这种情况下,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等。如果使用了默认值,还要检验默认值的正确性。如果表单只能接受指定的某些值,则也要进行测试。例如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。
      3、Cookies测试
      Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。
      如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。
      4、设计语言测试
      Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如Java、JavaScript、 ActiveX、VBScript或Perl等也要进行验证。
      5、数据库测试
      在Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。
      在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。

    2
    性能测试

    1、连接速度测试
      用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。
      另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面。
      2、负载测试
      负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?
      3、压力测试
      负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。
      进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。
      压力测试的区域包括表单、登陆和其他信息传输页面等。

    3
    可用性测试

    1、导航测试
      导航描述了用户在一个页面内操作的方式,在不同的用户接口控制之间,例如按钮、对话框、列表和窗口等;或在不同的连接页面之间。通过考虑下列问题,可以决定一个Web应用系统是否易于导航:导航是否直观?Web系统的主要部分是否可通过主页存取?Web系统是否需要站点地图、搜索引擎或其他的导航帮助?
      在一个页面上放太多的信息往往起到与预期相反的效果。Web应用系统的用户趋向于目的驱动,很快地扫描一个Web应用系统,看是否有满足自己需要的信息,如果没有,就会很快地离开。很少有用户愿意花时间去熟悉Web应用系统的结构,因此,Web应用系统导航帮助要尽可能地准确。
      导航的另一个重要方面是Web应用系统的页面结构、导航、菜单、连接的风格是否一致。确保用户凭直觉就知道Web应用系统里面是否还有内容,内容在什么地方。
      Web应用系统的层次一旦决定,就要着手测试用户导航功能,让最终用户参与这种测试,效果将更加明显。
      2、图形测试
      在Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有:
      (1)要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间。Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面。
      (2)验证所有页面字体的风格是否一致。
      (3)背景颜色应该与字体颜色和前景颜色相搭配。
      (4)图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩。
      3、内容测试
      内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。
      信息的正确性是指信息是可靠的还是误传的。例如,在商品价格列表中,错误的价格可能引起财政问题甚至导致法律纠纷;信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行,例如使用Microsoft Word的”拼音与语法检查”功能;信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的信息列表或入口,也就是一般Web站点中的所谓”相关文章列表”。
      4、整体界面测试
      整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致?
      对整体界面的测试过程,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。
      对所有的可用性测试来说,都需要有外部人员(与Web应用系统开发没有联系或联系很少的人员)的参与,最好是最终用户的参与。

    4
    客户端兼容性测试

    1、平台测试
      市场上有很多不同的操作系统类型,最常见的有Windows、Unix、Macintosh、Linux等。Web应用系统的最终用户究竟使用哪一种操作系统,取决于用户系统的配置。这样,就可能会发生兼容性问题,同一个应用可能在某些操作系统下能正常运行,但在另外的操作系统下可能会运行失败。
      因此,在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试。
      2、浏览器测试
      浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、JavaScript、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如,ActiveX是Microsoft的产品,是为Internet Explorer而设计的,JavaScript是Netscape的产品,Java是Sun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。
      测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。

    5
    安全性测试

    Web应用系统的安全性测试区域主要有:
      (1)现在的Web应用系统基本采用先注册,后登陆的方式。因此,必须测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而直接浏览某个页面等。
      (2)Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。
      (3)为了保证Web应用系统的安全性,日志文件是至关重要的。需要测试相关信息是否写进了日志文件、是否可追踪。
      (4)当使用了安全套接字时,还要测试加密是否正确,检查信息的完整性。
      (5)服务器端的脚本常常构成安全漏洞,这些漏洞又常常被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。

    展开全文
  • 采用Serverless架构搭建Web应用

    千次阅读 2017-08-04 16:38:14
    本文会向你介绍一种新的可能,一种无服务器的方案来搭建Web应用。使用这个方案大部分运维方面的问题就不需要你自己操心了,而且也省去运行服务器的费用。本文从无服务的优势与限制两方面带您初识Serverless设计。  ...

    本文会向你介绍一种新的可能,一种无服务器的方案来搭建Web应用。使用这个方案大部分运维方面的问题就不需要你自己操心了,而且也省去运行服务器的费用。本文从无服务的优势与限制两方面带您初识Serverless设计。

      在传统Web应用中,服务器是系统不可缺少的组成部分。尽管有时候服务器的前面还有负载均衡器或者专用Web服务器,但完成大部分工作的还是应用服务器。它完成一个应用所有的必要功能,包括存储用户数据、进行安全认证、控制流程等。应用的页面大部分仅仅只是为后端提供界面而已,尽管也会涉及一些控制导航的功能。使用这种许多人称之为多层架构的传统方式,系统一般会由浏览器、应用服务器和多个后端服务构成(见下图)。
          图片描述
      使用Serverless(无服)的方式,可以移除所有这些层次架构,达到更直接的实现。与其仅仅把网页客户端当作应用服务器的界面展示,不如构建一个单页Web应用在浏览器中实现应用逻辑。这意味着你只需要一个简单的静态网页服务器,所有的交互都只不过是应用内容的传输而已,浏览器就像是一个应用容器。这样,最终的设计就是移除传统Web应用架构中所有的中间层次,允许浏览器直接连接到它所需要的服务上。
      使用Facebook、Google和Twitter之类的OAuth 2.0身份认证服务商提供的服务,无须保存用户密码就可以创建用户身份。如果要存储数据,你可以在浏览器端直接使用Amazon DynamoDB之类的服务。在浏览器中无法执行的函数都可以使用Amazon Lambda微服务或者其他专门的Web服务来处理。除了能够简化架构,这种切换到Web服务作为后端的方式,还能让应用获得这些服务与生俱来的可用性和可扩展性优势。
      你可能会好奇到底发生了什么,使这种方式成为可能。为什么现在在一个Web应用中,中间层的应用服务器变得可有可无呢?答案是,自从2015年以来,类似Amazon这样的云服务提供商开始对外提供服务的API,这使得无服务器的方式成为可能,Amazon本身也为如何使用他们的工具和基础设施提供了最好的示范。
      基于Web标准搭建一个单页Web应用,而不是使用服务器端Web框架来完成,我们可以快速应用一些新兴技术。例如,我们不再需要将应用的数据模型绑定到任何一个对象层级或者数据同步机制上,因而能更方便地集成不同服务。既然我们所有的工作都倚赖于Web,就不必拘泥于以前搭建Web应用的成见,可以用目前最新的技术来搭建应用(见下图)。
       图片描述

    无服设计的好处

      如果你在寻找一种快速搭建低成本Web应用的方法,无服Web应用很可能就是一个解决方案。不需要花费时间和精力了解传统Web应用技术栈的各个层级,采用这种方式你能更专注于实现业务功能,有人会为你操心运行维护和可扩展性的问题。接下来让我们深入探讨无服设计的好处,帮助你在考虑下一个项目中是否使用这种方式时做出更明智的决定。

    1. 零服务器

      无服设计最明显的好处就是不需要维护服务器(不管是物理的还是虚拟的)。你不需要担心打安全补丁、监控CPU和内存使用情况、回滚日志、磁盘空间不足或者其他在维护自有服务器时经常碰到的运维问题。和大多数平台即服务(PaaS)方式一样,无服设计能让你专注于应用开发,而无须担心基础设施的问题。

    2. 易扩展

      这种设计方式的另一大好处是,你可以依靠云服务供应商来扩展自己的应用。在做水平扩容时,不需要忙不颠地在几个负载均衡应用服务器之间保持数据的一致性,你可以直接连接Web服务,而它们已经解决了数据一致性的问题。这意味着不管你的应用有几个用户、几百个用户,还是几十万个用户,只需要修改Amazon Web Services控制台的一些设置就可以保证完美的运行。

    3. 高可用

      另外,使用这种设计能轻松实现高可用性。你不必为了升级而关闭应用服务器,或者为了实现“热”部署而扩建基础设施。不再会有服务的重启或者部署包在服务器间的拷贝。最妙的是,Amazon有一群训练有素的员工7×24小时守护着你的基础设施,一旦发现问题随时能够响应。

    4. 低成本

      这些服务的成本可以非常低。使用无服的方式以及利用Amazon的免费套餐(Free Tier),一个月支付几美分就可以运行你的应用。一旦超过了免费额度,其费用经常也是随着你的用户量线性增长的(考虑费用最高的情况)。我们在这本书里构建的应用就算扩展到100万的用户,一天也只需要花费一杯咖啡的钱。

    5. (微)服务友好

      这种方式可以轻松适应微服务或者其他的面向服务架构。你可以在系统中引入特定的服务以实现自定义身份认证、验证或者异步数据处理。如果有必要,你甚至可以重新引入应用服务器,渐进式地重构应用。反之,如果一开始就使用一个中间层来控制所有的安全证书,就很难切换到需要认证的Web服务上。这些应用服务器没办法像无服应用一样,在应用层管理身份信息。

    6. 代码更少

      在传统Web应用里,一些操作(比如导航)在Web客户端和服务器端都需要执行,造成了代码的重复。有时候,这种重复工作并不明显,尤其当服务器代码是用不同的语言写时。而在无服应用中,应用逻辑都移到了客户端,很容易保证应用内不再有重复的代码。将应用逻辑代码放在一个位置(以及用一种语言实现)帮助我们解决了这个问题。
      此外,无服的方式更便于构建和排错,因为系统的组成部分变得更少了。Web应用天生就是分布式的,也就是说,正如CAP理论所述 ,它们在同一个网络的节点间传递消息(一般是以请求和响应的形式),限制它们的是实现方式。
      有些应用会比其他应用更分散(more distributed)。一个系统越分散,就越难排错。移除应用中的中间层能减少其分散的程度。在我们这个简单的应用中,如果一个客户端需要从一个数据库中获取数据,就会直接连接数据库,而不是通过中间层连接。这就意味着系统中的网络节点更少,也意味着如果出现问题,需要定位的地方更少。
      如上所述,构建一个无服应用的理由有很多。学完本书,你就会明白为什么这种方式如此强大。了解了无服应用的这些优点,我们再来看看它有哪些限制。

    无服设计的限制

      尽管无服架构有许多优点,但它也不是适用于所有类型的应用。为了享受这种设计带来的益处,你必须接受一系列的限制。如果你的应用不能适应这些限制,那么它很可能不是最合适的构建方式。所以在搭建应用之前,让我们一起看看这些限制。

    1. 供应商锁定

      首先最大的限制就是你使用的Web服务必须支持第三方身份认证服务商,这样在云服务提供商的选择上就受到了限制。所以如果使用无服的方式,你就会依赖于第三方服务,供应商锁定也就成了一个问题。构建一个基于其他公司服务的系统,意味着这个应用的命运和供应商公司的命运绑在了一起。如果供应商公司被收购、破产或者改变商业模式,你的应用不下大力气修改就很难在其他地方运行。所以,评估服务提供商的业务目标和长期稳定性与技术选型是同样重要的。

    2. 奇怪的日志

      所有运维关注的事情,比如应用日志,在你使用无服设计之后会呈现新的形态。当你把所有请求都通过一台服务器路由时,记录下所有信息以查看用户正在做什么是非常简单的事情。没有了这种中心化设计,日志的记录必须由每个支撑应用的不同Web服务来实现。这些日志格式跟大部分应用服务器日志都不同,记录的数据也很可能是你不熟悉的。

    3. 不一样的安全模型

      对于无服应用,有些常见的安全隐患不复存在,但你将会遇到一些不熟悉的新问题。比如,为了安全而验证用户数据,结果不能在浏览器中安全地实现。你需要假设有些恶意用户可能会在浏览器中劫持证书而使用该证书授权的Web服务。使用无服的方式,意味着你不能把浏览器中的应用验证逻辑和安全验证逻辑放在一起,必须分开实现。
      Amazon提供的许多Web服务都能验证请求。然而,对于有些应用来说,很难只用Web服务提供的工具来实现充分的有效性约束。比如,在浏览器中直接编写文本时,你不可能放心地将写入的数据编码后存到数据库中,保证不会有跨站脚本攻击发生。因为攻击者不使用应用就能直接将这个数据添加到数据库。
      这种情况下,你有(至少)两个选择。第一,可以假设某些用户可编辑的表可能包含未经验证的数据,然后针对性地设计系统的其他部分。比如,用户只能写入他们自己可读取的数据,这是可行的方式。第二,可以将某些写操作委托给自定义Web服务,比如可以使用Lambda函数来进行验证,并且以一种安全的方式写入数据。我们将会在第6章的“使用Lambda构建微服务”中详细介绍。

    4. 不一样的身份模型

      外部身份管理是我们这本书构建的应用中的一个独特功能。使用Web服务来管理身份信息有很多好处,但对你来说这种机制可能有点陌生。与将用户信息和其他数据保存在一起的传统方式不同,这些用户资料会保存在一个独立访问的数据存储服务中。如果使用这种方式构建无服应用,一些在数据库中处理用户数据的方法(比如用一个ID关联一张User表)就没办法实现。

    5. 失去控制

      此外,将所有请求路由到统一的中间层可以实现某种程度的控制,这在某些情况下是非常有用的。比如,拒绝访问攻击和其他一些攻击有时候可以在应用服务器上进行阻截。对你而言,放弃对身份认证的直接控制可能想一想都觉得可怕。我们后面在第7章会用一整章来专门探讨这些安全问题。

    6. 规模与成本的关系

      最后,你需要了解这些服务的开销。虽然能够自动扩展应用这一点非常厉害,但易于扩展同时也意味着花钱更容易。你需要了解这些服务的定价策略以及当用户增加时这些价格的变化。
      既然你已经了解了无服Web应用的代价,我们可以开启这本教程,探索一下无服Web应用是如何实现的。在教程中,你可能会发现这种设计方式为你开发的Web应用带来的其他好处和限制。一旦知晓了无服应用的全貌,就可以判断下一个项目是否适合这种方式了。
      本文选自《Serverless架构:无服务器单页应用开发》,点此链接可在博文视点官网查看此书。
                   图片描述
    想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                       图片描述

    展开全文
  • 一、Web应用服务器   Web服务器是运行及发布Web应用的大容器,只有将开发的Web项目放到该容器中,才能使网络中的所有用户通过浏览器进行访问。常用的有BEA WebLogic服务器、IBM WebSphere应用服务器、Tomcat...
  • Web应用程序  (1)什么是Web应用程序  应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏览 器端/服务器端应用程序,这类应用程序一般借助浏览器来运行。 ...
  • 不过别慌,蓝桥云课快马加鞭地推出了“第十三届蓝桥杯( Web 应用开发)线上模拟赛”,欢迎蓝桥杯参赛选手们踊跃参与进来~当然啦,如果你也对 web 应用开发感兴趣,也可以积极加入挑战~ (PS:第十三届蓝桥杯(Web ...
  • Web应用程序安全性测试指南

    千次阅读 2020-05-19 17:30:00
    由于存储在Web应用程序中的数据量巨大,并且Web上的事务数量增加,因此,对Web应用程序进行适当的安全测试正变得越来越重要。在本文中,我们将详细了解网站安全测试中使用的关键术语及其测试...
  • Web应用框架汇总

    千次阅读 2018-03-05 14:23:17
    Web应用框架(Web application framework)是一种开发框架,用来支持动态网站、网络应用程序及网络服务的开发。其类型有基于请求的和基于组件的两种框架,Web应用框架有助于减轻网页开发时共通性活动的工作负荷,...
  • Web应用程序测试工具Top20

    千次阅读 2018-07-31 20:18:19
    Web应用程序测试工具可提高可靠性,缩短周转时间并提高ROI。 它们是各种类型的工具,可以协助从需求捕获到测试管理等各种Web测试活动。以下是包含主要功能和下载链接的顶级Web测试工具的精选列表。 下面介绍了一些...
  • 【软件测试大赛Web应用省赛】跳坑记录

    千次阅读 多人点赞 2020-11-08 20:40:59
    【软件测试大赛Web应用省赛】跳坑记录 本文写在预赛通过的基础上,默认后来者已经接触过web应用测试,并有一定的基础知识。 本文写于2020.11.8省赛结束,希望这些坑以后不会再有人跳进去。 【前排提示】没学过前端...
  • 主流的Web应用程序平台

    千次阅读 2017-09-06 20:15:40
    主流的Web应用程序平台 动态网站应用程序平台的搭建需要使用Web服务器发布网页,而Web服务器软件又需要安装在操作系统上,并且动态网站都需要使用脚本语言对服务器端进行编程,所以也要在同一个服务器中为Web服务器...
  • web应用程序的部署

    千次阅读 2017-06-03 14:35:25
    一、配置任意目录下的web应用程序 一个Web容器可以运行多个web应用程序,每个web应用程序都有一个唯一的上下文根。对于Tomcat来说,%CATALINA_HOME(安装路径)%\webapps目录下的每一个子目录都是一个独立的Web应用...
  • 常用Web应用服务器

    千次阅读 2017-12-07 11:37:45
    常用Web应用服务器有: nginx、Apache、Tomcat、JBoss、WebSphere、WebLogic、Resin、Glassfish nginx介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由...
  • Web网站和Web应用程序的区别

    千次阅读 2019-05-22 11:01:42
    Web应用程序 新建后 具体区别 1、添加“一般处理程序” Web网站建立的一般处理程序没有“命名空间” Web应用程序建立的一般处理程序有“命名空间” 为什么网站不需要命名空间?   命名空间就是为了区分类同名的...
  • JAVA WEB应用目录

    千次阅读 2018-11-20 08:09:21
    部署启动应用 Tomcat目录 首先,官方下载 tomcat 安装包,解压。得到下面的目录 bin 目录是tomcat启动和关闭目录。startup.bat启动tomcat 、shutdown.bat关闭tomcat webapps 目录存放着我们的网页文件,自带...
  • 最近关于渐进式Web应用有好多讨论,有一些人还在质疑渐进式Web应用是否就是移动端未来。 但在这篇文章中我并不会将渐进式APP和原生的APP进行比较,但有一点是可以肯定的,这两种APP的目标都是使用户体验变得更好。...
  • Web应用指纹检测

    千次阅读 2017-09-06 17:29:03
    0×01 Web 应用技术概览 1.1 架构 大多数 web 应用可以粗略划分为三个组件(component)。 1、客户端, 大多数情况下是浏览器。 2、服务端, Web 服务器接收客户端的HTTP请求并进行响应。另外,有时候 Web服务器只转发...
  • javaweb站点根目录和web应用根目录应用场景

    千次阅读 多人点赞 2019-02-23 18:05:11
    什么叫Web站点的根路径,什么叫Web应用的根路径,在对它们的 "/"应用场景中,到底是代表站点路径还是web应用路径开始路径, 恐怕是很多人在web开发时候经常被搞混的的问题。现在简单解答如下:  问题:...
  • web应用存在的10大安全问题

    千次阅读 2018-11-04 22:00:27
    1 在web应用程序中是什么导致安全性问题呢?一般有以下几个原因 1、复杂应用系统代码量大、开发人员多、难免出现疏忽 2、系统屡次升级、人员频繁变更,导致代码不一致 3、历史遗留系统、试运行系统等多个Web系统...
  • Web应用体系结构

    千次阅读 2017-06-03 22:33:32
    简单介绍Web应用的体系结构
  • web应用打包成桌面可执行程序

    万次阅读 2017-12-09 17:18:04
    本教程旨在帮助开发人员把web应用程序打包成一个可执行的桌面应用程序,并生成一个安装包setup.exe,直接安装到本地电脑,方便用户使用。 1、背景 开发web项目时,大多数选择主流的chrome等浏览器作为开发调试工具...
  • 实验概述 越来越多的公司出于对成本和效率的考量,将业务部署在网站上。主机和网络的漏洞,给...阿里云推出的Web应用防火墙服务,正是为了有效阻止类似的非法访问,降低网络风险。本实验提供了一台开通了DNS云解析功能
  • 从一个简单的web应用开始

    千次阅读 2018-07-15 18:35:41
    使用IDEA创建一个maven项目2、调整maven配置搭建web项目框架1、转为Java web项目
  • 漏洞修复:web应用服务器版本信息泄露方案一:建立错误机制,不要把真实的错误反馈给访问者方案二:Tomcat服务器隐藏版本信息 Web服务器未能正确处理异常请求导致Web服务器版本信息泄露,攻击者收集到服务器信息后...
  • SpringBoot入门,快速搭建简单Web应用环境

    万次阅读 多人点赞 2018-07-20 09:38:01
    1.基本环境(自行下载安装) JDK:1.8 ...使用idea创建Springboot应用非常简单,废话不多说,搞起。 打开idea,点击新建项目: 选择Spring Initializr,点击next: 上面的信息可自行修改...
  • 一、Web应用程序简介 1、网络应用程序开发体系结构: 1)C/S体系结构:Client/Server的缩写,即客户端/服务器端结构 举例:QQ 英雄联盟 word、excel不是,因为不需要联网、登录 2)B/S体系结构:Browser/Server的...
  • 什么是云盾Web应用防火墙? 云盾Web应用防火墙(Web Application Firewall, 简称 WAF)基于云安全大数据能力实现,通过防御SQL注入、XSS跨站脚本、常见Web服务器插件漏洞、木马上传、非授权核心资源访问等OWASP常见...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,111,018
精华内容 844,407
关键字:

web应用