精华内容
下载资源
问答
  • 什么是web服务_什么是Web服务?

    千次阅读 2020-07-28 07:09:46
    什么是web服务 什么是Web服务? (What are Web Services?) Web Services are client and server applications that communicate over the World Wide Web's (WWW) Hypertext Transfer Protocol (HTTP). As ...

    什么是web服务

    Web Services are client and server applications that communicate over the World Wide Web's (WWW) Hypertext Transfer Protocol (HTTP). As described by the World Wide Web Consortium (W3C), web services provide a standard means of interoperating between software applications running on a variety of platforms and frameworks.

    Web服务是通过万维网( WWW )超文本传输​​协议( HTTP )进行通信的客户端和服务器应用程序。 如万维网联盟(W3C)所述,Web服务提供了在各种平台和框架上运行的软件应用程序之间进行互操作的标准方法。

    Web Services can be looked as a code on demand. Just like we call functions and methods, web services can be looked upon as calling a function or method over the internet using some sort of protocols and some agreements.

    Web服务可以看作是按需代码 。 就像我们调用函数和方法一样,Web服务可以看作是使用某种协议和某些协议通过Internet调用函数或方法。

    A web service is a function or method which we can call by sending an HTTP request to a URL, with arguments and the service returns the result back as response.

    Web服务是一种函数或方法,可以通过将HTTP请求发送到带有参数的URL来调用该函数或方法,然后该服务将结果作为响应返回。

    The biggest advantage of the web services is that it is platform independent.

    Web服务的最大优点是它与平台无关。

    Introduction to Web Services

    Consider the above figure, We can see that the application written in Java can interact with PHP and .net platforms through the web service. Therefore, it is completely platform independent. A web service exposed in the PHP can be consumed by any platform be it java, .net or PHP. This capability of the web service is making it so popular. Therefore, a web service is a language independent way of communication.

    考虑上图,我们可以看到用Java编写的应用程序可以通过Web服务与PHP和.net平台进行交互。 因此,它是完全独立于平台的。 PHP公开的Web服务可以被任何平台使用,无论是Java,.net还是PHP。 Web服务的这种功能使其变得如此流行。 因此,Web服务是一种独立于语言的通信方式。

    Now let us look at one of the most common use case where web services are being used extensively.

    现在,让我们看一下广泛使用Web服务的最常见用例之一。

    Consider the figure below, suppose I have made a new cool application but I do not want to maintain the data of the users, who login to my application, but we want only authenticated users to use the application.

    考虑下图,假设我已经制作了一个很酷的应用程序,但是我不想维护登录到我的应用程序的用户的数据,但是我们只希望经过身份验证的用户才能使用该应用程序。

    So what should we do? One option is, we can use the web services exposed by some other third party application, to authenticate our incoming users. You must have seen this in many applications, in form of - Sign up using Facebook, Google or other third party apps. Many Websites/Apps use Facebook and Google data, using their web services, to authenticate users.

    那我们该怎么办? 一种选择是,我们可以使用某些其他第三方应用程序公开的Web服务来验证传入的用户。 你必须在许多应用中已经看到了这一点,在形式- 注册使用Facebook, 谷歌或其他第三方应用。 许多网站/应用程序通过其Web服务使用Facebook和Google数据来验证用户身份。

    Therefore, we do not have to maintain any data of the users to authenticate, rather we can now fully concentrate on the content of our application.

    因此,我们不必维护用户的任何数据即可进行身份验证,而现在我们可以完全专注于应用程序的内容。

    The flow of the authentication process will be like this:

    身份验证过程的流程将如下所示:

    1. User logs into our Application.

      用户登录到我们的应用程序。

    2. We show them two options - either sign in using Facebook or Google.

      我们向他们展示了两个选项-使用Facebook或Google登录。

    3. Enter the Username and Password.

      输入用户名和密码。

    4. The application will now pass the Username and Password to Google or Facebook server using http request.

      该应用程序现在将使用http请求将用户名和密码传递给Google或Facebook服务器。

    5. The request/response can be in any format. It could be a json/xml or any other media type.

      请求/响应可以是任何格式。 它可以是json / xml或任何其他媒体类型。

    6. Now if the request is ok, Google or Facebook server will send us the response and accordingly we will authenticate our users to login into the application.

      现在,如果请求正常,Google或Facebook服务器将向我们发送响应,并相应地我们将对用户进行身份验证以登录到该应用程序。

    The third party apps, who expose their APIs must provide a proper documentation of all the requests and responses. Checkout this link for the PayPal API to get some idea how documentation is done - https://developer.paypal.com/docs/api/identity/

    公开其API的第三方应用程序必须提供所有请求和响应的正确文档。 查看此PayPal API链接以了解如何完成文档制作-https: //developer.paypal.com/docs/api/identity/

    Introduction

    翻译自: https://www.studytonight.com/rest-web-service/introduction

    什么是web服务

    展开全文
  • 什么是web框架


      我们常用的web前端框架其实简单称呼叫web框架,现阶段web前端技术成熟,从视觉体验到用户体验都是比较好的,这也是从简单到复杂的web前端框架技术实现的,在国内前端技术开发人员也是非常的多,市面上的前端框架可以说是眼花缭乱,这里写这篇文章就是让你在使用不同的前端框架的时候能够明确的知道自己的选择。


    Web前端框架工作原理:

      在我们讨论框架之前,我们需要理解 Web 如何“工作”的。为此,我们将深入挖掘你在浏览器里输入一个 URL 按下 Enter 之后都发生了什么。在你的浏览器中打开一个新的标签,浏览http://www.uileader.com。我们讨论为了显示这个页面,浏览器都做了什么事情(不关心 DNS 查询)。

    Web 服务器

      每个页面都以 HTML 的形式传送到你的浏览器中,HTML 是一种浏览器用来描述页面内容和结构的语言。那些负责发送 HTML 到浏览器的应用称之为“Web 服务器”,会让你迷惑的是,这些应用运行的机器通常也叫做 web 服务器。

      然而,最重要的是要理解,到最后所有的 web 应用要做的事情就是发送 HTML 到浏览器。不管应用的逻辑多么复杂,最终的结果总是将 HTML 发送到浏览器(我故意将应用可以响应像 JSON 或者 CSS 等不同类型的数据忽略掉,因为在概念上是相同的)。

    HTTP

      浏览器从 web 服务器(或者叫应用服务器)上使用 HTTP 协议下载网站,HTTP 协议是基于一种 请求-响应(request-response)模型的。客户端(你的浏览器)从运行在物理机器上的 web 应用请求数据,web 应用反过来对你的浏览器请求进行响应。

      重要的一点是,要记住通信总是由客户端(你的浏览器)发起的,服务器(也就是 web 服务器)没有办法创建一个链接,发送没有经过请求的数据给你的浏览器。如果你从 web 服务器上接收到数据,一定是因为你的浏览器显示地发送了请求。

    HTTP Methods

      在 HTTP 协议中,每条报文都关联方法(method 或者 verb),不同的 HTTP 方法对应客户端可以发送的逻辑上不同类型的请求,反过来也代表了客户端的不同意图。例如,请求一个 web 页面的 HTML,与提交一个表单在逻辑上是不同的,所以这两种行为就需要使用不同的方法。

    HTTP GET

    GET 方法就像其听起来的那样,从 web 服务器上 get(请求)数据。GET 请求是到目前位置最常见的一种 HTTP 请求,在一次 GET 请求过程中,web 应用对请求页面的 HTML 进行响应之外,就不需要做任何事情了。特别的,web 应用在 GET 请求的结果中,不应该改变应用的状态(比如,不能基于 GET 请求创建一个新帐号)。正是因为这个原因,GET 请求通常认为是“安全”的,因为他们不会导致应用的改变。

    HTTP POST

      显然,除了简单的查看页面之外,应该还有更多与网站进行交互的操作。我们也能够向应用发送数据,例如通过表单。为了达到这样的目的,就需要一种不同类型的请求方法:POSTPOST 请求通常携带由用户输入的数据,web 应用收到之后会产生一些行为。通过在表单里输入你的信息登录一个网站,就是 POST 表单的数据给 web 应用的。

      不同于 GET 请求,POST 请求通常会导致应用状态的改变。在我们的例子中,当表单 POST 之后,一个新的账户被创建。不同于 GET 请求,POST 请求不总是生成一个新的 HTML 页面发送到客户端,而是客户端使用响应的响应码(response code)来决定对应用的操作是否成功。

    HTTTP Response Codes

      通常来说,web 服务器返回 200 的响应码,意思是,“我已经完成了你要求我做的事情,一切都正常”。响应码总是一个三位数字的代号,web 应用在每个响应的同时都发送一个这样的代号,表明给定的请求的结果。响应码 200 字面意思是“OK”,是响应一个 GET 请求大多情况下都使用的代号。然而对于 POST 请求, 可能会有 204(“No Content”)发送回来,意思是“一切都正常,但是我不准备向你显示任何东西”。

    Web 应用

      你可以仅仅使用 HTTP GET POST 做很多事情。一个应用程序负责去接收一个 HTTP 请求,同时给以 HTTP 响应,通常包含了请求页面的 HTMLPOST 请求会引起 web 应用做出一些行为,可能是往数据库中添加一条记录这样的。还有很多其它的 HTTP 方法,但是我们目前只关注 GET POST

      那么最简单的 web 应用是什么样的呢?我们可以写一个应用,让它一直监听 80 端口(著名的 HTTP 端口,几乎所有 HTTP 都发送到这个端口上)。一旦它接收到等待的客户端发送的请求连接,然后它就会回复一些简单的 HTML

      下面是程序的代码:

    import socketHOST = ''PORT = 80listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)listen_socket.bind((HOST, PORT))listen_socket.listen(1)connection, address = listen_socket.accept()request = connection.recv(1024)connection.sendall(b"""HTTP/1.1 200 OKContent-type: text/html

    <html>    <body>        <h1>Hello, World!</h1>    </body></html>""")connection.close()

      (如果上面的代码不工作,试着将 PORT 改为类似 8080 这样的端口。)

      这个代码接收简单的链接和简单的请求,不管请求的 URL 是什么,它都会响应 HTTP 200(所以,这不是一个真正意义上的 web 服务器)。Content-type:text/html 行代码的是 header 字段,header 用来提供请求或者响应的元信息。这样,我们就告诉了客户端接下来的数据是 HTML

    请求的剖析

      如果看一下测试上面程序的 HTTP 请求,你会发现它和 HTTP 响应非常类似。第一行<HTTP Method> <URL> <HTTP version>,在这个例子中是 GET / HTTP/1.0。第一行之后就是一些类似Accept: */* 这样的头(意思是我们希望在响应中接收任何内容)。

      我们响应和请求有着类似的第一行,格式是<HTTP version> <HTTP Status-code> <Status-code Reason Phrase>,在外面的例子中是HTTP/1.1 200 OK 。接下来是头部,与请求的头部有着相同的格式。最后是响应的实际包含的内容。注意,这会被解释为一个字符串或者二进制文件, Content-type 头告诉客户端怎样去解释响应。

      解决路由和模板两大问题

      围绕建立 web 应用的所有问题中,两个问题尤其突出:

    1.我们如何将请求的 URL 映射到处理它的代码上?

    2.我们怎样动态地构造请求的 HTML 返回给客户端,HTML 中带有计算得到的值或者从数据库中取出来的信息?

      每个 web 框架都以某种方法来解决这些问题,也有很多不同的解决方案。用例子来说明更容易理解,所以我将针对这些问题讨论 Django Flask 的解决方案。但是,首先我们还需要简单讨论一下 MVC

    Django 中的 MVC

    Django 充分利用 MVC 设计模式。 MVC,也就是 Model-View-Controller (模型-视图-控制器),是一种将应用的不同功能从逻辑上划分开。models 代表的是类似数据库表的资源(与 Python 中用 class 来对真实世界目标建模使用的方法大体相同)。controls 包括应用的业务逻辑,对 models 进行操作。为了动态生成代表页面的 HTML,需要 views 给出所有要动态生成页面的 HTML 的信息。

      在 Django 中有点让人困惑的是,controllers 被称做 views,而 views 被称为 templates。除了名字上的有点奇怪,Django 很好地实现了 MVC 的体系架构。

    Django 中的路由

      路由是处理请求 URL 到负责生成相关的 HTML 的代码之间映射的过程。在简单的情形下,所有的请求都是有相同的代码来处理(就像我们之前的例子那样)。变得稍微复杂一点,每个 URL 对应一个 view function 。举例来说,如果请求 www.foo.com/bar 这样的 URL,调用 handler_bar() 这样的函数来产生响应。我们可以建立这样的映射表,枚举出我们应用支持的所有 URL 与它们相关的函数。

      然而,当 URL 中包含有用的数据,例如资源的 ID(像这样 www.foo.com/users/3/) ,那么这种方法将变得非常臃肿。我们如何将 URL 映射到一个 view 函数,同时如何利用我们想显示 ID 3 的用户?

    Django 的答案是,将 URL 正则表达式映射到可以带参数的 view 函数。例如,我假设匹配^/users/(?P<id>\d+)/$ URL 调用 display_user(id) 这样的函数,这儿参数 id 是正则表达式中匹配的 id。这种方法,任何 /users/<some_number>/ 这样的 URL 都会映射到 display_user 函数。这些正则表达式可以非常复杂,包含关键字和参数。

    Flask 中的路由

    Flask 采取了一点不同的方法。将一个函数和请求的 URL 关联起来的标准方法是通过使用 route() 装饰器。下面是 Flask 代码,在功能上和上面正则表达式方法相同:

    @app.route('/users/<id:int>/')

    def display_user(id):

    # ...

      就像你看到的这样,装饰器使用几乎最简单的正则表达式的形式来将 URL 映射到参数。通过传递给route() URL 中包含的 <name:type> 指令,可以提取到参数。路由像 /info/about_us.html 这样的静态 URL,可以像你预想的这样 @app.route('/info/about_us.html') 处理。

    通过 Templates 产生 HTML

      继续上面的例子,一旦我们有合适的代码映射到正确的 URL,我们如何动态生成 HTML?对于 Django Flask,答案都是通过 HTML Templating

    HTML Templating 和使用 str.format() 类似:需要动态输出值的地方使用占位符填充,这些占位符后来通过 str.format() 函数用参数替换掉。想象一下,整个 web 页面就是一个字符串,用括号标明动态数据的位置,最后再调用 str.format() Django 模板和 Flask 使用的模板引擎 Jinja2 都使用的是这种方法。

      然而,不是所有的模板引擎都能相同的功能。Django 支持在模板里基本的编程,而 Jinja2 只能让你执行特定的代码(不是真正意义上的代码,但也差不多)。Jinja2 可以缓存渲染之后的模板,让接下来具有相同参数的请求可以直接从缓存中返回结果,而不是用再次花大力气渲染。

    数据库交互

    Django 有着“功能齐全”的设计哲学,其中包含了一个 ORM(Object Realational Mapper,对象关系映射)ORM 的目的有两方面:一是将 Python class 与数据库表建立映射,而是剥离出不同数据库引擎直接的差异。没人喜欢 ORM,因为在不同的域之间映射永远不完美,然而这还在承受范围之内。Django 是功能齐全的,而 Flask 是一个微框架,不包括 ORM,尽管它对 SQLAlchemy 兼容性非常好,SQLAlchemy Django ORM 的最大也是唯一的竞争对手。

      内嵌 ORM Django 有能力创建一个功能丰富的 CRUD 应用,从服务器端角度来看,CRUDCreateRead Update Delete)应用非常适合使用 web 框架技术。Django Flask-SQLchemy 可以直接对每个 model 进行不同的 CRUD 操作。

     总结:

      到现在为止,web前端框架的目的应该非常清晰了:向程序员隐藏了处理 HTTP 请求和响应相关的基础代码。至于隐藏多少这取决于不同的框架,Django Flask 走向了两个极端:Django 包括了每种情形,几乎成了它致命的一点;Flask 立足于“微框架”,仅仅实现 web 应用需要的最小功能,其它的不常用的 web 框架任务交由第三方库来完成。

      但是最后要记住的是,Python web 框架都以相同的方式工作的:它们接收 HTTP 请求,分派代码,产生 HTML,创建带有内容的 HTTP 响应。事实上,所有主流的服务器端框架都以这种方式工作的( JavaScript 框架除外)。但愿了解了这些框架的目的,你能够在不同的框架之间选择适合你应用的框架进行开发。

    展开全文
  • web登录用户名密码加密

    万次阅读 2016-03-04 10:07:39
    之前一直没关注过web应用登录密码加密的问题,这两天用appscan扫描应用,最严重的问题就是这个了,提示我明文发送密码。这个的确很不安全,以前也大概想过,但是没有具体研究过,都不了了之,这次借这个机会,终于...

              阿里云低价服务器1折特惠,优惠爽翻天,点我立即低价购买

    之前一直没关注过web应用登录密码加密的问题,这两天用appscan扫描应用,最严重的问题就是这个了,提示我明文发送密码。这个的确很不安全,以前也大概想过,但是没有具体研究过,都不了了之,这次借这个机会,终于搞定了这个问题。

    首先,有不少帖子说在客户端用js对密码进行md5摘要,然后提交给登录处理的url。这种做法无非是自欺欺人,就算别人抓包抓不到你原始密码,用这个md5后的密码一样可以模拟登录系统,无非稍微安全了一点点,也就是直接通过登录页没法直接输入用户名密码来登录,但是人家的手段你知道有啥呢?用程序模拟登陆也不是什么太难的事情。

    https当然也是个选择,但是对于一般应用来说,还需要生成密钥之类的,还需要拿去给那些认证机构签名,麻烦不说,银子是必须的。如果说让用户安装证书,应用系统还可以,网站就不太现实了,毕竟不是所有用户都有那么高的计算机操作水平,就算有,人家一用感觉这么麻烦,也不见得去操作。

    这次专心搜索了1个小时,还是觉得非对称加密比较靠谱,有一些RSA加密的文章值得借鉴。这里向这些文章作者致敬,我参考可不只一篇文章,因为问题多多的。废话到此结束,说说我的处理方式吧。

    加密解密的流程:

     a)在login.jsp中,加入一段java代码,生成公钥和私钥,私钥对象保存在session中;公钥中,我把Exponent, modulus放到request的attribute中,并在页面上输出给js加密函数,用于密码加密。使用security.js的功能加密

    [javascript] view plain copy
     
     CODE_ico.pnguploading.4e448015.gif转存失败重新上传取消在CODE上查看代码片ico_fork.svguploading.4e448015.gif转存失败重新上传取消派生到我的代码片
    1. var key = new RSAUtils.getKeyPair("${publicKeyExponent}""""${publicKeyModulus}");  
    2.   
    3.        var reversedPwd = password.split("").reverse().join("");//js里面是反序的字符串,不知道为啥  
    4.        var encrypedPwd = RSAUtils.encryptedString(key,reversedPwd);  

     

     

     

    b)在点击提交按钮时,调用登陆js函数。这个函数是用ajax方式将用户名,密码提交给登陆处理url的。在提交之前,先利用a步骤中的公钥Exponent,和modulus,对密码进行加密,然后再发送给服务器端。

    c)在登陆处理url中,(我是login.action),从session中取得私钥对象,对密码进行解密。随后的步骤都一样了,到库里去查询之类的,不细说了。

    下面说说我处理的步骤和遇到的主要问题。

     

    1.只能使用RSA这种非对称加密,才能让密码破解成为仅仅“理论上”的可能。所以决定使用这种加密方式。

    2.寻找合适的客户端javascript加密代码。这个我是不太懂了,只能去找。最后找到了security.js。网上有些文章用的3个文件,BigInt.js,RSA.js还有个啥来着,Barrett.js这3个来实现,开始我用了。但是和服务端配合不了(我自己的问题),结果后来找到这个security.js,实际上是把这个3个js都封装到1个里面了,而且最后修改时间是2010年,比较新,就用这个吧。那3个js文件应该也是能用的。

    3.在服务器端生成公钥和私钥,这个本来想对简单,代码可参考的很多。但是我遇到的问题不少,解密的时候总是出错。

       问题一:在login.jsp中,公钥的Exponent,和modulus输出格式问题

           开始总是什么:长度过大,必须以0开始之类的异常。我想到很可能是js加密和纯java加密那些地方不同导致的。后来发现,原来是我公钥的Exponent,和modulus输出直接用的toString()方法,实际上应该用toString(16),用16进制输出,因为在security.js中,那个

    RSAUtils.getKeyPair(publicKeyExponent, "", ${publicKeyModulus);方法内部,明显是从16进制进行转换的。改完后应该是这样:

         

    [java] view plain copy
     
     CODE_ico.pnguploading.4e448015.gif转存失败重新上传取消在CODE上查看代码片ico_fork.svguploading.4e448015.gif转存失败重新上传取消派生到我的代码片
    1. String publicKeyExponent = publicKey.getPublicExponent().toString(16);//16进制  
    2.     String publicKeyModulus = publicKey.getModulus().toString(16);//16进制  
    3.     request.setAttribute("publicKeyExponent", publicKeyExponent);  
    4.     request.setAttribute("publicKeyModulus", publicKeyModulus);  

     

     问题二:有个什么Padding之类的异常,是RSA算法中前面补齐的问题,原因时js和java默认的RSA算法不一致。

         经过分析,用RSA其他的provider可以解决此问题,于是在生成密码对的代码中,使用了

      

    [java] view plain copy
     
     CODE_ico.pnguploading.4e448015.gif转存失败重新上传取消在CODE上查看代码片ico_fork.svguploading.4e448015.gif转存失败重新上传取消派生到我的代码片
    1. KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"new org.bouncycastle.jce.provider.BouncyCastleProvider());    

     

    这个的补齐方式和js的就一致了。

    问题三:provider的认证问题

      刚用上,感觉能通过了,但是马上就是一个异常:jce cannot authenticate the provider bc。意思好理解,就是没经过认证。怎么让他通过呢,结果我在运行应用服务器的javahome\jre\lib\security\java.security文件中添加了如下代码:

     

    [java] view plain copy
     
     CODE_ico.pnguploading.4e448015.gif转存失败重新上传取消在CODE上查看代码片ico_fork.svguploading.4e448015.gif转存失败重新上传取消派生到我的代码片
    1. security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider  

    11是序号,顺着它原来的加就可以了。
    感觉上ok了,启动一下看看,还是那个问题。这个问题是我在jboss-eap-6.2上出现的。其他的应用服务器可能比较简单些(比如直接放到服务器的lib下)。

     

    于是查jboss的资料,终于找到了,说是在jboss中,不能让这个provider的jar包在应用的lib下,需要使用全局的jar包。如果使用maven,那必须让这个包的scope是provided;(反正别让BouncyCastle这个jar包打入到war里面就可以)。需要在eap6.2下进行配置:

    在jboss_home/modules下建立目录org\bouncycastle\main,在main目录中,放入bcprov-jdk16-1.46.jar,并加入module的配置文件module.xml,内容如下:

     

    [html] view plain copy
     
     CODE_ico.pnguploading.4e448015.gif转存失败重新上传取消在CODE上查看代码片ico_fork.svguploading.4e448015.gif转存失败重新上传取消派生到我的代码片
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <module xmlns="urn:jboss:module:1.1" name="org.bouncycastle">  
    3.     <resources>  
    4.         <resource-root path="bcprov-jdk16-1.46.jar"/>  
    5.     </resources>  
    6.     <dependencies>  
    7.         <module name="javax.api" slot="main" export="true"/>  
    8.     </dependencies>  
    9. </module>  

    还需要在web应用的META-INF\MANIFEST.MF中加入Dependencies: org.bouncycastle

     

    我是maven工程,需要配置pom:

     

    [html] view plain copy
     
     CODE_ico.pnguploading.4e448015.gif转存失败重新上传取消在CODE上查看代码片ico_fork.svguploading.4e448015.gif转存失败重新上传取消派生到我的代码片
    1. <plugin>  
    2.             <artifactId>maven-war-plugin</artifactId>  
    3.             <version>${version.war.plugin}</version>  
    4.             <configuration>  
    5.                <!-- Java EE 6 doesn't require web.xml, Maven needs to catch up! -->  
    6.                <failOnMissingWebXml>true</failOnMissingWebXml>  
    7.                <version>3.0</version>  
    8.                <archive>  
    9.                     <manifestEntries>  
    10.                     <Dependencies>org.bouncycastle</Dependencies>  
    11.                     </manifestEntries>  
    12.                 </archive>  
    13.             </configuration>  
    14.               
    15.          </plugin>  


    主要是archive节点的配置,这样打包后MANIFEST.MF的内容就会变了

     

    不能传附件可咋整呢?贴代码吧:

    login.jsp

     

    [javascript] view plain copy
     
     CODE_ico.pnguploading.4e448015.gif转存失败重新上传取消在CODE上查看代码片ico_fork.svguploading.4e448015.gif转存失败重新上传取消派生到我的代码片
    1. <script src="js/lib/security.js" type="text/javascript"></script>  
    2. <script type="text/javascript">  
    3.     <%  
    4.         HashMap<String, Object> map = RSAUtils.getKeys();    
    5.         //生成公钥和私钥    
    6.         RSAPublicKey publicKey = (RSAPublicKey) map.get("public");    
    7.         RSAPrivateKey privateKey = (RSAPrivateKey) map.get("private");  
    8.           
    9.         session.setAttribute("privateKey", privateKey);//私钥保存在session中,用于解密  
    10.           
    11.         //公钥信息保存在页面,用于加密  
    12.         String publicKeyExponent = publicKey.getPublicExponent().toString(16);  
    13.         String publicKeyModulus = publicKey.getModulus().toString(16);  
    14.         request.setAttribute("publicKeyExponent", publicKeyExponent);  
    15.         request.setAttribute("publicKeyModulus", publicKeyModulus);  
    16.     %>  
    17.     function login() {  
    18.        //登录  
    19.        var username = $("#txtUsername").val();  
    20.        var password = $("#txtPassword").val();  
    21.        var randCode = $("#txtRandCode").val();  
    22.        var rememberMeObj = document.getElementById("cbRememberMe");  
    23.        var rem = rememberMeObj.checked ? "1" : "";  
    24.   
    25.          
    26.        RSAUtils.setMaxDigits(200);  
    27.        //setMaxDigits(256);  
    28.        var key = new RSAUtils.getKeyPair("${publicKeyExponent}""""${publicKeyModulus}");  
    29.   
    30.        var encrypedPwd = RSAUtils.encryptedString(key,password);  
    31.        $.post("login.action", { username: username, password: encrypedPwd, randcode: randCode, rememberme: rem }, function (jsonData) {  
    32.            //请求完成  
    33.            //如果为true,证明该用户已经下载过,显示已下载提示,否则直接下载  
    34.            if (jsonData.success == true) {  
    35.                //登录成功  
    36.                window.location.href = 'index.jsp';  
    37.            } else {  
    38.                //提示错误信息divErrors  
    39.                var ettText = "";  
    40.                if (username == "") {  
    41.                    ettText="用户名不能为空";  
    42.                }  
    43.                else if (password == "") {  
    44.                    ettText="密码不能为空";  
    45.                }  
    46.                else if (randCode == "") {  
    47.                    ettText="验证码不能为空";  
    48.                }  
    49.                else {  
    50.                    ettText=jsonData.msg;  
    51.                }  
    52.                alert(ettText);  
    53.            }  
    54.        });  
    55.     }</script>  

    login.action

     

     

    [java] view plain copy
     
     CODE_ico.pnguploading.4e448015.gif转存失败重新上传取消在CODE上查看代码片ico_fork.svguploading.4e448015.gif转存失败重新上传取消派生到我的代码片
    1. RSAPrivateKey privateKey = (RSAPrivateKey)request.getSession().getAttribute("privateKey");  
    2. String descrypedPwd = RSAUtils.decryptByPrivateKey(password, privateKey); //解密后的密码,password是提交过来的密码  

     


    RSAUtils.java

     

     

     

    [java] view plain copy
     
     CODE_ico.pnguploading.4e448015.gif转存失败重新上传取消在CODE上查看代码片ico_fork.svguploading.4e448015.gif转存失败重新上传取消派生到我的代码片
    1. package com.myapp.util;  
    2. import java.math.BigInteger;    
    3. import java.security.KeyFactory;    
    4. import java.security.KeyPair;    
    5. import java.security.KeyPairGenerator;    
    6. import java.security.NoSuchAlgorithmException;    
    7. import java.security.interfaces.RSAPrivateKey;    
    8. import java.security.interfaces.RSAPublicKey;    
    9. import java.security.spec.RSAPrivateKeySpec;    
    10. import java.security.spec.RSAPublicKeySpec;    
    11. import java.util.HashMap;   
    12. import javax.crypto.Cipher;   
    13.   
    14. public class RSAUtils {  
    15.     /**  
    16.      * 生成公钥和私钥  
    17.      * @throws NoSuchAlgorithmException   
    18.      *  
    19.      */    
    20.     public static HashMap<String, Object> getKeys() throws NoSuchAlgorithmException{    
    21.         HashMap<String, Object> map = new HashMap<String, Object>();    
    22.         KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"new org.bouncycastle.jce.provider.BouncyCastleProvider());    
    23.         keyPairGen.initialize(1024);    
    24.         KeyPair keyPair = keyPairGen.generateKeyPair();    
    25.         RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();    
    26.         RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();    
    27.         map.put("public", publicKey);    
    28.         map.put("private", privateKey);    
    29.         return map;    
    30.     }    
    31.     /**  
    32.      * 使用模和指数生成RSA公钥  
    33.      *   
    34.      *   
    35.      * @param modulus  
    36.      *            模  
    37.      * @param exponent  
    38.      *            指数  
    39.      * @return  
    40.      */    
    41.     public static RSAPublicKey getPublicKey(String modulus, String exponent) {    
    42.         try {    
    43.             BigInteger b1 = new BigInteger(modulus);    
    44.             BigInteger b2 = new BigInteger(exponent);    
    45.             KeyFactory keyFactory = KeyFactory.getInstance("RSA"new org.bouncycastle.jce.provider.BouncyCastleProvider());    
    46.             RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);    
    47.             return (RSAPublicKey) keyFactory.generatePublic(keySpec);    
    48.         } catch (Exception e) {    
    49.             e.printStackTrace();    
    50.             return null;    
    51.         }    
    52.     }    
    53.     
    54.     /**  
    55.      * 使用模和指数生成RSA私钥  
    56.       
    57.      * /None/NoPadding】  
    58.      *   
    59.      * @param modulus  
    60.      *            模  
    61.      * @param exponent  
    62.      *            指数  
    63.      * @return  
    64.      */    
    65.     public static RSAPrivateKey getPrivateKey(String modulus, String exponent) {    
    66.         try {    
    67.             BigInteger b1 = new BigInteger(modulus);    
    68.             BigInteger b2 = new BigInteger(exponent);    
    69.             KeyFactory keyFactory = KeyFactory.getInstance("RSA"new org.bouncycastle.jce.provider.BouncyCastleProvider());    
    70.             RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(b1, b2);    
    71.             return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);    
    72.         } catch (Exception e) {    
    73.             e.printStackTrace();    
    74.             return null;    
    75.         }    
    76.     }    
    77.     
    78.     /**  
    79.      * 公钥加密  
    80.      *   
    81.      * @param data  
    82.      * @param publicKey  
    83.      * @return  
    84.      * @throws Exception  
    85.      */    
    86.     public static String encryptByPublicKey(String data, RSAPublicKey publicKey)    
    87.             throws Exception {    
    88.         Cipher cipher = Cipher.getInstance("RSA"new org.bouncycastle.jce.provider.BouncyCastleProvider());    
    89.         cipher.init(Cipher.ENCRYPT_MODE, publicKey);    
    90.         // 模长    
    91.         int key_len = publicKey.getModulus().bitLength() / 8;    
    92.         // 加密数据长度 <= 模长-11    
    93.         String[] datas = splitString(data, key_len - 11);    
    94.         String mi = "";    
    95.         //如果明文长度大于模长-11则要分组加密    
    96.         for (String s : datas) {    
    97.             mi += bcd2Str(cipher.doFinal(s.getBytes()));    
    98.         }    
    99.         return mi;    
    100.     }    
    101.     
    102.     /**  
    103.      * 私钥解密  
    104.      *   
    105.      * @param data  
    106.      * @param privateKey  
    107.      * @return  
    108.      * @throws Exception  
    109.      */    
    110.     public static String decryptByPrivateKey(String data, RSAPrivateKey privateKey)    
    111.             throws Exception {    
    112.         Cipher cipher = Cipher.getInstance("RSA"new org.bouncycastle.jce.provider.BouncyCastleProvider());    
    113.         cipher.init(Cipher.DECRYPT_MODE, privateKey);    
    114.         //模长    
    115.         int key_len = privateKey.getModulus().bitLength() / 8;    
    116.         byte[] bytes = data.getBytes();    
    117.         byte[] bcd = ASCII_To_BCD(bytes, bytes.length);    
    118.         //System.err.println(bcd.length);    
    119.         //如果密文长度大于模长则要分组解密    
    120.         String ming = "";    
    121.         byte[][] arrays = splitArray(bcd, key_len);    
    122.         for(byte[] arr : arrays){    
    123.             ming += new String(cipher.doFinal(arr));    
    124.         }    
    125.         return ming;    
    126.     }    
    127.     /**  
    128.      * ASCII码转BCD码  
    129.      *   
    130.      */    
    131.     public static byte[] ASCII_To_BCD(byte[] ascii, int asc_len) {    
    132.         byte[] bcd = new byte[asc_len / 2];    
    133.         int j = 0;    
    134.         for (int i = 0; i < (asc_len + 1) / 2; i++) {    
    135.             bcd[i] = asc_to_bcd(ascii[j++]);    
    136.             bcd[i] = (byte) (((j >= asc_len) ? 0x00 : asc_to_bcd(ascii[j++])) + (bcd[i] << 4));    
    137.         }    
    138.         return bcd;    
    139.     }    
    140.     public static byte asc_to_bcd(byte asc) {    
    141.         byte bcd;    
    142.     
    143.         if ((asc >= '0') && (asc <= '9'))    
    144.             bcd = (byte) (asc - '0');    
    145.         else if ((asc >= 'A') && (asc <= 'F'))    
    146.             bcd = (byte) (asc - 'A' + 10);    
    147.         else if ((asc >= 'a') && (asc <= 'f'))    
    148.             bcd = (byte) (asc - 'a' + 10);    
    149.         else    
    150.             bcd = (byte) (asc - 48);    
    151.         return bcd;    
    152.     }    
    153.     /**  
    154.      * BCD转字符串  
    155.      */    
    156.     public static String bcd2Str(byte[] bytes) {    
    157.         char temp[] = new char[bytes.length * 2], val;    
    158.     
    159.         for (int i = 0; i < bytes.length; i++) {    
    160.             val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f);    
    161.             temp[i * 2] = (char) (val > 9 ? val + 'A' - 10 : val + '0');    
    162.     
    163.             val = (char) (bytes[i] & 0x0f);    
    164.             temp[i * 2 + 1] = (char) (val > 9 ? val + 'A' - 10 : val + '0');    
    165.         }    
    166.         return new String(temp);    
    167.     }    
    168.     /**  
    169.      * 拆分字符串  
    170.      */    
    171.     public static String[] splitString(String string, int len) {    
    172.         int x = string.length() / len;    
    173.         int y = string.length() % len;    
    174.         int z = 0;    
    175.         if (y != 0) {    
    176.             z = 1;    
    177.         }    
    178.         String[] strings = new String[x + z];    
    179.         String str = "";    
    180.         for (int i=0; i<x+z; i++) {    
    181.             if (i==x+z-1 && y!=0) {    
    182.                 str = string.substring(i*len, i*len+y);    
    183.             }else{    
    184.                 str = string.substring(i*len, i*len+len);    
    185.             }    
    186.             strings[i] = str;    
    187.         }    
    188.         return strings;    
    189.     }    
    190.     /**  
    191.      *拆分数组   
    192.      */    
    193.     public static byte[][] splitArray(byte[] data,int len){    
    194.         int x = data.length / len;    
    195.         int y = data.length % len;    
    196.         int z = 0;    
    197.         if(y!=0){    
    198.             z = 1;    
    199.         }    
    200.         byte[][] arrays = new byte[x+z][];    
    201.         byte[] arr;    
    202.         for(int i=0; i<x+z; i++){    
    203.             arr = new byte[len];    
    204.             if(i==x+z-1 && y!=0){    
    205.                 System.arraycopy(data, i*len, arr, 0, y);    
    206.             }else{    
    207.                 System.arraycopy(data, i*len, arr, 0, len);    
    208.             }    
    209.             arrays[i] = arr;    
    210.         }    
    211.         return arrays;    
    212.     }  
    213.     public static void main(String[] args) throws Exception{  
    214.         HashMap<String, Object> map = getKeys();    
    215.         //生成公钥和私钥    
    216.         RSAPublicKey publicKey = (RSAPublicKey) map.get("public");    
    217.         RSAPrivateKey privateKey = (RSAPrivateKey) map.get("private");    
    218.             
    219.         //模    
    220.         String modulus = publicKey.getModulus().toString();    
    221.         System.out.println("pubkey modulus="+modulus);  
    222.         //公钥指数    
    223.         String public_exponent = publicKey.getPublicExponent().toString();  
    224.         System.out.println("pubkey exponent="+public_exponent);  
    225.         //私钥指数    
    226.         String private_exponent = privateKey.getPrivateExponent().toString();    
    227.         System.out.println("private exponent="+private_exponent);  
    228.         //明文    
    229.         String ming = "111";    
    230.         //使用模和指数生成公钥和私钥    
    231.         RSAPublicKey pubKey = RSAUtils.getPublicKey(modulus, public_exponent);    
    232.         RSAPrivateKey priKey = RSAUtils.getPrivateKey(modulus, private_exponent);    
    233.         //加密后的密文    
    234.         String mi = RSAUtils.encryptByPublicKey(ming, pubKey);    
    235.         System.err.println("mi="+mi);    
    236.         //解密后的明文    
    237.         String ming2 = RSAUtils.decryptByPrivateKey(mi, priKey);    
    238.         System.err.println("ming2="+ming2);    
    239.     }  
    240. }  

    ---------------------------------------------------------------------------------------------------------------------------------------- 

    如果您认为本教程质量不错,读后觉得收获很大,预期工资能蹭蹭蹭的往上涨,那么不妨小额赞助我一下,让我有动力继续写出高质量的教程。 
       ----------------------------------------------------------------------------------------------------------------------------------------                                                           

     

    最后,那个js的RSA实现我是在如下链接下载的:

     

    http://www.oschina.net/code/snippet_1611_4789

    展开全文
  • Web 安全登录

    千次阅读 2016-05-15 01:22:09
    基本解决方案绝大多数Web应用里面都有用户登录的功能。由于HTTP(S)协议的特点,服务器没有办法锁定客户端,因为客户端对服务器发送HTTP(S)请求的时候,往往没有携带自身的信息,于是服务器想确认客户端的身份是...

    基本解决方案

    绝大多数Web应用里面都有用户登录的功能。

    由于HTTP(S)协议的特点,服务器没有办法锁定客户端,因为客户端对服务器发送HTTP(S)请求的时候,往往没有携带自身的信息,于是服务器想确认客户端的身份是有心无力的。

    于是出现了在HTTP(S)报头中附带Cookie的一种做法,来帮助服务器识别客户端:

    Created with Raphaël 2.1.0客户端客户端服务器服务器没有携带Cookie初次访问你这厮没有Cookie?我给你生成一个响应并要求客户端存储给定Cookie有了Cookie携带Cookie访问一些需要登录才能查看的资源查表发现这个Cookie没有与任何用户的联系说明还没登录!提示需要登录的响应登录携带Cookie、用户凭证发送登录请求记下了这个Cookie与XXX的暂时的联系登录成功!有了登记后的Cookie携带Cookie访问一些需要登录才能查看的资源查了之前维护的联系表,确认这个Cookie对应的用户是XXX正确回复资源。

    这就是Web应用处理用户登录的解决方案。

    Cookie是储存在用户的浏览器中的,通常还会带有一个域名:这个Cookie是哪个网站要求设置的

    比如百度设定Cookie就有存储在www.baidu.com这个域名中,当你访问这个域名的时候,浏览器就会自动在HTTP(S)的请求报头中附上对应的Cookie,避免了不同网站之间Cookie的命名空间冲突。

    安全与性能

    现在问题来了,怎么在Cookie中存储一些信息比较好呢?

    不妨先给出几个分析:

    • Cookie 不宜过大。
      由于Cookie会附到每一次HTTP(S)请求中,若Cookie过多,会明显增重网络I/O的负担。
    • Cookie 不宜可读
      由于Cookie在客户端本地可以很方便地被JavaScript修改,若Cookie可读,那么也很容易被恶意用户篡改(伪造)
    • Cookie 不宜与用户信息有关
      如果Cookie的生成与用户的信息有关,即便Cookie加密到不可读,一旦算法被识破,就有一定几率被反推伪造,或者泄漏个人信息,有隐患。

    由此我们可以有这样一个解决方案:

    1. 当用户访问时,随机生成一个足够强的Hash值作为Cookie,跟用户信息无关、且不可读、不易伪造。
    2. 在后端服务器维护一个以上述Hash值作为索引的集合。
    3. 在上述集合中缓存用户的个人信息。
    4. 当用户访问需要验证身份的资源时,服务器从集合中取出对应的Cookie,并检查缓存中的个人信息来确认身份。
    5. 当用户修改了个人信息时,更新缓存。

    这个Hash值就相当于一个口令,通常我们称它为Session ID(会话ID)。意思就是维护一个客户端与服务器之间的会话,用一个足够离散的Hash值来防止撞表,通常来说,一个站点同时有效的会话数不超过其用户数的20%,而若Hash值的字符集是64,长度为40,Hash值有6440=2240=1.81074 种可能,撞表成功的期望代价很高,可以认为是安全的。

    万一这个人运气很好,撞表成功了,这意味着他能伪装成某个用户了,这跟暴力破解密码的行为是一致的,但这个SessionID是临时性的,随时可能失效,至少不会造成密码泄露(当然你不能在你的数据库中明文存储用户的密码或者提供API查询密码),当用户选择登出或者Session过期的时候,这个SessionID就会失效,撞表的结果就失去了意义。

    关于中间人攻击,一般的做法是加密Cookie,最好使用HTTPS整个加密,这个不属于本文讨论范畴。

    另外,这个Session ID确实足够短又足够好用,既不会给网络I/O造成什么严重的负担,也足够服务器来识别用户的身份。

    困难的地方在于,设计一个安全的Hash算法是不容易的,没有足够好的数学功底就不要自己写Hash了。直接用现成的算法即可。除此之外,管理Session集合的内存也是不容易的,要正确地增删改Session对象,及时地释放空间……这其实是一个数据结构问题,考虑到查询性能等种种原因,也用别人已经开发好的比较好。

    成熟的解决方案

    Java Servlet 有 JSessionID 的设置,PHP也有PHPSessionID,NodeJS比较开放,Express有一个插件叫做express-session 可以解决这个问题。

    网上学 Session 的资料很多,在此不一一列举,只是想说明为什么要这样实现登录功能。怎么做是安全高效的以及为什么。

    展开全文
  • Web 组件是什么

    千次阅读 2018-05-07 17:25:00
    Web 组件是什么 一、总结 这篇下面的内容多看 1、组件化的目的:高内聚,低耦合,便于多人同时开发 2、各种前端框架(前端组件化)让写前端不要太简单: 3、组件编程最最最最简单实例: 1 &lt;link rel...
  • web登录密码

    千次阅读 2017-03-28 09:09:59
    互联网时代,安全是永恒的主题,威胁无处不在,哪怕是在企业内网。   APDPlat充分考虑到了安全的问题:   首先,在浏览器中对用户密码加入复杂字符({用户信息})之后进行加密(Secure Hash ...其次,
  • 【观点】物联网与大数据将助推工业应用的崛起,你认同么? CSDN日报20170703——...web.xml中出现default是什么意思? 2014-02-11 11:48 24630人阅读 评论(0) 收藏 举报 分类: spring(23)
  • java后端开发(一):基本认知之web开发是什么

    千次阅读 多人点赞 2018-08-05 13:22:10
    数据库设计学完后,接着来了解一下到底什么是web开发,在脑海中形成宏观的感受。本文主要讲述web开发的相关背景知识
  • 什么是web框架

    千次阅读 2017-09-11 14:37:44
    Web 应用框架,或者简单的说是“Web 框架”,其实是建立 web 应用的一种方式。从简单的博客系统到复杂的富 AJAX 应用,web 上每个页面都是通过写代码来生成的。我发现很多人都热衷于学习 web 框架技术,例如 Flask ...
  • 通过WEB网管登录

    2014-07-25 02:23:00
    6.1通过WEB网管登录简介 S5100-SI/EI系列以太网交换机提供内置的WEB Server,用户可以通过WEB网管终端(PC)登录到交换机上,利用内置的WEB Server以WEB方式直观地管理和维护以太网交换机。 交换机和WEB网管终端...
  • 用户登录注册流程图 老版: 新版: 登陆界面 注册界面 登陆成功界面 LoginServlet import java.io.IOException;...import javax.servlet.annotation.WebServlet; import javax.servle...
  • 什么是 Web 框架?

    千次阅读 2014-03-06 13:02:15
    我发现很多人都热衷于学习 web 框架技术,例如 Flask 或这 Django 之类的,但是很多人并不理解什么是 web 框架,或者它们是如何工作的。这篇文章中,我将探索反复被忽略的 web 框架基础的话题。阅读完这篇文章,你
  • 什么是 web 框架?

    千次阅读 2018-04-22 11:46:42
    什么是 web 框架? Web 应用框架,或者简单的说是“Web 框架”,其实是建立 web 应用的一种方式。从简单的博客系统到复杂的富 AJAX 应用,web 上每个页面都是通过写代码来生成的。我发现很多人都热衷于学习 web ...
  • Web上的用户登录功能安全

    万次阅读 多人点赞 2016-07-07 10:04:14
    Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能。下面 的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关系...
  • 什么是Web认证

    千次阅读 2010-08-19 16:32:00
    简而言之,web认证就是一个确认对方身份的过程。Web认证最典型的方式是通过用户名和密码。   Web认证有多种方式   A. Http协议内建的认证方法    1. ...
  • java web登录RSA加密

    千次阅读 2017-03-25 17:50:17
    之前一直没关注过web应用登录密码加密的问题,这两天用appscan扫描应用,最严重的问题就是这个了,提示我明文发送密码。这个的确很不安全,以前也大概想过,但是没有具体研究过,都不了了之,这次借这个机会,终于...
  • 我的java web登录RSA加密

    万次阅读 热门讨论 2014-11-26 14:38:18
    之前一直没关注过web应用登录密码加密的问题,这两天用appscan扫描应用,最严重的问题就是这个了,提示我明文发送密码。这个的确很不安全,以前也大概想过,但是没有具体研究过,都不了了之,这次借这个机会,终于...
  • 您是否对Web感兴趣但是不知道什么是Web呢? 您是否觉得“网络黑客”很神秘? 您是否不清楚Internet和Web有什么区别? 如果您有凡此种种问题,这个系列文章就是为您写的。不需要任何预备知识,只需要跟着小编进行探索...
  • 公司办公用的是AD域环境,每个人用域帐号登录到PC上。 不知道PHP有什么方法能实现: 域用户登录到自己的机器后,打开web页面,不用再输入帐号密码就已经实现登录了,并且在web页面上输出该域名账号。 非域用户打开...
  • 实现Web上的用户登录功能

    千次阅读 2018-11-27 13:02:40
    Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能。下面的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关系...
  • 微信微博抖音web授权登录

    千次阅读 2020-01-09 14:46:00
    1.微信授权登录 申请微信公众号获取appid配置重定向地址 跳转链接 https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + encodeURIComponent(redirect_uri) + "&...
  • 测试----什么是web测试

    千次阅读 2019-06-27 21:08:05
    什么是web测试 web测试就是针对于B/S架构的系统,一般指浏览器访问服务器,比如打开淘宝购买东西就是web测试。 web测试包含的内容 功能测试 1.连接测试 试所有链接是否按指示链接到了该链接的页面 测试所链接的页面...
  • 这个会话指的就是 session对象单点登录的核心技术原理:就是用户浏览器对各个集成在一起的web应用程序的会话session是一致性同步的
  • web爬虫之登录google paly 商店

    千次阅读 2015-06-30 10:33:27
    我们先打开Google play 首页 ,点击右上角“登陆...那么,我觉得最方便而又是最常用的方法就是:火狐浏览器--web开发者工具--网络  火狐浏览器-web开发者工具-网络 现在我们知道了google play登陆是要提交14个参数的
  • 最近在研究网站的开发,其中遇到一个问题就是同一账号重复登录。要求是同一账号只能一个地方登录,重复...1.在用户表加一列或单独建一张关联表,用于记录当前登录的sessionId,每次登录这一列值都要做修改。2.用户...
  • Web.xml详解

    万次阅读 多人点赞 2015-01-28 13:48:53
    这篇文章主要是综合网上关于web.xml的一些介绍,希望对大家有所帮助,也欢迎大家一起讨论。 ---题记 1.web.xml加载过程(步骤) 首先简单讲一下,web.xml的加载过程。当启动一个WEB项目时,容器包括(JBoss、...
  • 这是一个令人悲伤的故事: ajax 的 dataType:"json", 写成了data :“json”, 尼玛 在前端页面打断点截图如下;  改正过后可以获取json中的数据了;...session会话中json 数据传递什么都没...
  • Web单点登录和客户/服务器单点登录

    千次阅读 2007-05-19 16:18:00
    单点登录(Single Sign-onSSO,),也称...单点登录的实质就是安全上下文(Security Context)或凭证(Credential)在多个应用系统之间的传递或共享。 单点登录的分类方法很多,在这里我们按照服务端的实现方式分为:
  • 通常我们做一个Web应用程序的时候都需要登录登录就要输入用户名和登录密码,并且,用户名和登录密码都是明文传输的,这样就有可能在中途被别人拦截,尤其是在网吧等场合。 我们来看一个新闻:《八成网站登录口令...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,841
精华内容 26,336
热门标签
关键字:

web登录是什么意思