iSayme

iSayme 查看完整档案

上海编辑  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

该说点什么呢?

个人动态

iSayme 关注了标签 · 2020-03-15

intellij-idea

IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等方面的功能可以说是超常的。IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

关注 1529

iSayme 关注了标签 · 2020-03-15

关注 915

iSayme 关注了标签 · 2020-03-15

java

Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

Java编程语言的风格十分接近 C++ 语言。继承了 C++ 语言面向对象技术的核心,Java舍弃了 C++ 语言中容易引起错误的指針,改以引用取代,同时卸载原 C++ 与原来运算符重载,也卸载多重继承特性,改用接口取代,增加垃圾回收器功能。在 Java SE 1.5 版本中引入了泛型编程、类型安全的枚举、不定长参数和自动装/拆箱特性。太阳微系统对 Java 语言的解释是:“Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言”。

版本历史

重要版本号版本代号发布日期
JDK 1.01996 年 1 月 23 日
JDK 1.11997 年 2 月 19 日
J2SE 1.2Playground1998 年 12 月 8 日
J2SE 1.3Kestrel2000 年 5 月 8 日
J2SE 1.4Merlin2002 年 2 月 6 日
J2SE 5.0 (1.5.0)Tiger2004 年 9 月 30 日
Java SE 6Mustang2006 年 11 月 11 日
Java SE 7Dolphin2011 年 7 月 28 日
Java SE 8JSR 3372014 年 3 月 18 日
最新发布的稳定版本:
Java Standard Edition 8 Update 11 (1.8.0_11) - (July 15, 2014)
Java Standard Edition 7 Update 65 (1.7.0_65) - (July 15, 2014)

更详细的版本更新查看 J2SE Code NamesJava version history 维基页面

新手帮助

不知道如何开始写你的第一个 Java 程序?查看 Oracle 的 Java 上手文档

在你遇到问题提问之前,可以先在站内搜索一下关键词,看是否已经存在你想提问的内容。

命名规范

Java 程序应遵循以下的 命名规则,以增加可读性,同时降低偶然误差的概率。遵循这些命名规范,可以让别人更容易理解你的代码。

  • 类型名(类,接口,枚举等)应以大写字母开始,同时大写化后续每个单词的首字母。例如:StringThreadLocaland NullPointerException。这就是著名的帕斯卡命名法。
  • 方法名 应该是驼峰式,即以小写字母开头,同时大写化后续每个单词的首字母。例如:indexOfprintStackTraceinterrupt
  • 字段名 同样是驼峰式,和方法名一样。
  • 常量表达式的名称static final 不可变对象)应该全大写,同时用下划线分隔每个单词。例如:YELLOWDO_NOTHING_ON_CLOSE。这个规范也适用于一个枚举类的值。然而,static final 引用的非不可变对象应该是驼峰式。

Hello World

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

编译并调用:

javac -d . HelloWorld.java
java -cp . HelloWorld

Java 的源代码会被编译成可被 Java 命令执行的中间形式(用于 Java 虚拟机的字节代码指令)。

可用的 IDE

学习资源

常见的问题

下面是一些 SegmentFault 上在 Java 方面经常被人问到的问题:

(待补充)

关注 135752

iSayme 赞了文章 · 2017-12-16

聊聊二维码登录

本文主要来研究一下二维码登录的相关场景和原理。

场景

主要的场景有如下几个:

  • app扫二维码登录pc版系统

比如微信web版,在手机端微信登录的前提下,扫二维码确认,自动登录网页版。这里的app可以分为两大类,一个是自有的app,一个是第三方的app。

自己的app自有认证体系,在登录前提下完成pc端的扫描登录。
第三方app扫描登录场景,比如使用手机端的微信APP扫描登录PC端系统,这种情况下,一般是利用微信的oauth体系,服务端完成自有账户体系与微信账号的绑定,然后实现PC端的自动登录
  • app扫二维码作为双因素验证

比如微信公众号平台,在账户密码登录PC端的情况下,再使用手机端微信登录的前提下,扫描二维码再次确认,登录网页版

  • Secure QR Login (SQRL)

完全使用二维码登录,替代用户密码。这个有SQRL协议及相关实现。

步骤

以下所有的都基于这个前提,就是手机app已经登录,自带有登录的凭证,然后要扫描登录pc端的系统

  • 打开pc端显示登录二维码(pc端未登录的前提下)
这个时候请求服务端生成一个登陆二维码
服务端生成二维码,该二维码包含了这个pc端的唯一标识,比如sessionId,或者是新生成一个uuid跟这个sessionId关联
  • pc端同时开启轮询(有长连接等其他实现,这里以轮询方式介绍)
获取二维码之后,pc端开启定时轮询,轮询二维码的状态,主要有如下状态:NEW,SCANED,CONFIRMED,REFUSED,EXPIRED
  • 手机端扫描二维码
手机端已经登录的情况下,扫描网页二维码,二维码状态变为已扫描,然后手机端跳转到确认页面
  • 手机端确认
手机端扫描二维码之后,点击确认,二维码状态变为确认
  • pc端跳转成功/二维码过期/拒绝
二维码状态变为确认之后,跳转自动登录,完成PC端登录态建立
如果app端拒绝这次请求,则二维码状态变为被拒绝,不再轮询
如果二维码状态在一定时间没有变化,则显示二维码过期,不再轮询

PC客户端

  • 请求登录二维码
  • 轮询二维码状态
  • 跳到到登陆后的页面

手机客户端

  • 扫描登录二维码
  • 确认登录

服务端

  • 生成登录二维码,绑定二维码与pc客户端
  • 处理二维码轮询
  • 处理手机端扫描二维码
  • 处理手机端确认二维码登录
  • 处理pc端自动登录

实现

PC端如何自动登录

这个问题相当于同一个帐号多设备同时登录的问题

在二维码被具有登录态的app端扫描确认之后,PC端如何完成自动登录。有如下几个方案:

  • session拷贝
其实就是在原来基于账号密码的登录鉴权逻辑基础上,新增支持无需账号密码的登录。也就相当于绕过了基于用户名密码,内部重新设置了一个登录态
如果是基于session的鉴权,相当于基于原有的一个已经鉴权的session,拷贝信息到另外一个新的session中,在server端关联
  • 复用已有token
如果是基于token的鉴权,一种方案就是复用token,让pc端也复用手机app端的token,这样的好处是原来基于token的鉴权逻辑都不用改
  • 仿照oauth授权颁发新token
整个过程其实有点像oauth,pc端是client,server端是资源和认证中心,手机端是具有登录态的用户。手机端扫描二维码,然后用户确认授权,server端给pc端颁发token,然后pc端就可以访问server端的资源了。这种就在原来的认证基础上支持另外一类oauth的token校验,貌似有点复杂
另外一个变形是新颁发token,但跟app端的token有个关联映射,最终鉴权的时候还去找原来授权的token去鉴权,这样的好处是原来的token失效,经过它授权的token也失效

二维码过期

一种是基于redis来做过期,一种是使用数据库,但是设置expired time来判断

安全问题

QRLJacking全称Quick Response Code Login Jacking,是session劫持的一种。

原理

具体是怎么劫持的呢,假设攻击者将web登录二维码伪装为公众号二维码,让用户去扫描,用户一不小心点击确认,攻击者的就可以登录用户的web系统,或者利用那个token/session去盗取用户的相关信息或做相关操作。

防范

  • 二维码超时机制

二维码增加超时机制之后,会增加攻击者攻击的难度,不过攻击者也可能利用脚本去自动刷新二维码

  • 确认机制

二维码扫描一定要有这个确认的页面,明确告知用户要做的操作,假设没有确认这个环节,那么是极其容易上当的。另外,二维码扫描确认之后,再往用户app或手机等发送登录提醒的通知,告知如果不是本人登录的,则建议用户立即修改密码

  • Sound-based Authentication

确认阶段改为双边语音确认,而不是简单的用户点击确认按钮。语音是根据用户id、二维码id等加密生成,在app端播放,然后pc端语音识别之后才能完成整个登录过程。这个可以有效防止远程攻击。同样的思路,改语音为one time password也行,增加了确认过程的复杂度,也就增加了攻击的难度。

小结

二维码扫描登录是个挺潮流的功能,这要求既有系统增加改造,也要求针对这种形式的登录带来潜在的攻击进行安全防范。

doc

查看原文

赞 96 收藏 504 评论 4

iSayme 回答了问题 · 2017-09-28

解决forEach Polyfill理解

关注 3 回答 3

iSayme 关注了用户 · 2017-07-20

Richardwei @quanzhanwei

关注 2

iSayme 关注了用户 · 2017-07-20

Richardwei @quanzhanwei

关注 2

iSayme 关注了问题 · 2016-07-15

求一个算法?0000000序列递增

举个栗子:0000000递增,格式是这样的:

0000001
0000002
0000003
.....递增到10
0000010
.....递增到100
0000100
.....递增到100000
0100000

模仿着@G_Koala_C的回答,写了php版的:

for ($i = 0; $i < 100; $i++) { 
    $zero = '';
    $k = 7-strlen($i);
    for ($j = $k; $j >0; $j--) { 
        $zero .= 0;
    }
    echo $zero.$i.'<br>';
}

clipboard.png

关注 18 回答 13

iSayme 回答了问题 · 2016-07-15

求一个算法?0000000序列递增

看我C语言的:

for (int i = 0; i < 10000000; i++) {
    printf("%07d\n", i);
}

补零后的长度其实也是可配的:

// 补零后长度, 注意printf的变化~
in len = 7;
for (int i = 0; i < 10000000; i++) {
    printf("%0*d\n", len, i);
}

关注 18 回答 13

iSayme 回答了问题 · 2015-10-09

解决C 语言字符串用数组和指针初始化为什么会有这样的区别?

数组的字符串内存属于, 所以是可读可写;
指针的字符串内存属于代码块, 只可读, 这个地址程序运行后一直存在且不变.

关注 5 回答 3

认证与成就

  • 获得 198 次点赞
  • 获得 14 枚徽章 获得 1 枚金徽章, 获得 7 枚银徽章, 获得 6 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2012-06-25
个人主页被 1.4k 人浏览