分类:Java / Jsp

单点登录原理与简单实现, 单点登录的三种实现方式

单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例如像阿里巴巴这样的网站,在网站的背后是成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉。实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效性,因此要点也就以下两个: 存储信任 验证信任 如果一个系统做到了开头所讲的效果,也就算单点登录,单点登录有不同的实现方式,本文就罗列我开发中所遇见过的实现方式。 以Cookie作为凭证媒介 最简单的单点登录实现方式,是使用cookie作为媒介,存放用户凭证。 用户登录父应用之后,应用返回一个加密的cookie,当用户访问子应用的时候,携带上这个cookie,授权应用解密cookie并进行校验,校验通过则登录当前用户。 不难发现以上方式把信任存储在客户端的Cookie中,这种方式很容易令人质疑: Cookie不安全 不能跨域实现免登 对于第一个问题,通过加密Cookie可以保证安全性,当然这是在源代码不泄露的前提下。如果Cookie的加密算法泄露,攻击者通过伪造Cookie则可以伪造特定用户身份,这是很危险的。 对于第二个问题,更是硬伤。 通过JSONP实现 对于跨域问题,可以使用JSONP实现。 用户在父应用中登录后,跟Session匹配的Cookie会存到客户端中,当用户需要登录子应用的时候,授权应用访问父应用提供的JSONP接口,并在请求中带上父应用域名下的Cookie,父应用接收到请求,验证用户的登录状态,返回加密的信息,子应用通过解析返回来的加密信息来验证用户,如果通过验证则登录用户。 这种方式虽然能解决跨域问题,但是安全性其实跟把信任存储到Cookie是差不多的。如果一旦加密算法泄露了,攻击者可以在本地建立一个实现了登录接口的假冒父应用,通过绑定Host来把子应用发起的请求指向本地的假冒父应用,并作出回应。 因为攻击者完全可以按照加密算法来伪造响应请求,子应用接收到这个响应之后一样可以通过验证,并且登录特定用户。 通过页面重定向的方式… Read More

JAVA: 抓取需要登录的页面, curl page with auth, How do I connect to a URL using Basic authentication?

ConnectToUrlUsingBasicAuthentication.java package test; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import org.apache.commons.codec.binary.Base64; public class ConnectToUrlUsingBasicAuthentication… Read More

JAVA: JDBC-Mysql操作类

package com.yunti.utils; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap;… Read More

JAVA:JDBC入门教程(三) PreparedStatement的使用

前两章我们写了一个 DBTools 工具类,可以进行简单的数据库操作,但是有很大的局限性,今天就来改善一下这个类,学习一个新的对象 PreparedStatement 为什么要使用PreparedStatement 前面我们建立了一个store数据库,并且建立了一个user数据表,表里包含字段 id ,account ,password ,role。而且还向里面加入了一条数据 sql 语句是这样写的 INSERT INTO store.user (account,password,role) VALUES ('admin','123',1) 我直接把字段的值直接写在了sql语句里,不过通常情况下,(‘admin’,’123’,1) 这里面都是一些变量,为了方便,我们会建立一个实体类,来对应相应的数据库表,现在新建一个… Read More

JAVA: JDBC入门教程(二) 通过JDBC进行简单的增删改查

对数据库的更新操作 数据库的更新包括:INSERT UPDATE DELETE 执行数据库更新操作需要用到 Statement类,该类通过Connection的createStatement()方法来获得,写好sql语句然后调用Statement对象的executeUpdate(sql) 方法来实现更新操作,很简单。 比如说我想在user表里加入一条记录,可以分为一下几个步骤 获取数据库连接 创建Statement对象 写sql语句 执行更新操作代码如下 @Test public void insertUser(){ Connection conn = null;… Read More

JAVA: JDBC入门教程(一): 连接数据库

1. JDBC的环境搭建 JDBC的环境搭建很简单,需要下面的配置好 安装Java 安装数据库 安装数据库驱动程序 以上两点都很容易,若果有疑问的自行百度解决吧,主要说一下第三个,现在以mysql为例 配置JDBC的环境。 新建java项目,自行命名,我这里的项目叫JDBCTest 下载驱动包,名字叫 mysql-connector-java-5.1.38-bin.jar 可以自行去网上下载,链接http://dev.mysql.com/downloads/connector/j/5.0.html 在项目的根目录下新建一个lib文件夹并且把刚刚下载的 驱动文件(.jar)拷贝到lib文件夹下,然后在这个文件上右键 Build Path–Add to Bulid Path. 这样JDBC的环境就已经搭建完成了。下面就开始尝试着把自己的java程序与数据库相连接。… Read More

Java: 精确数字运算, 加减乘除运算, 解决浮点数的计算失去精度问题, BigDecimal的用法(加减乘除)

今天在数值计算时碰到一个问题.程序如下: double a = (3.3-2.4)/0.1; System.out.println(a); 你可能认为结果很简单,不就是9嘛,是事实上,结果为:8.999999998,为什么呢?我翻阅了一些资料,终于找出了原因. 为什么浮点数会丢失精度?   十进制数的二进制表示可能不够精确浮点数或是双精度浮点数无法精确表示的情况并不少见。浮点数值没办法用十进制来精确表示的原因要归咎于CPU表示浮点数的方法。这样的话您就可能会牺牲一些精度,有些浮点数运算也会引入误差。以上面提到的情况为例,2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。原因在于浮点数由两部分组成:指数和尾数。浮点数的值实际上是由一个特定的数学公式计算得到的。您所遇到的精度损失会在任何操作系统和编程环境中遇到。 注意: 您可以使用Binary Coded Decimal (BCD)库来保持精度。BCD数字编码方法会把每一个十进制数字位单独编码。 类型失配 您可能混合了浮点数和双精度浮点数类型。请确定您在进行数学运算的时候所有的数据类型全部相同。 注意:float类型的变量只有7位的精度,而double类型的变量有15位的精度。 如何进行浮点数精度计算?     Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。… Read More

Java:遍历Map/HashMap的各种方法

在遍历Map集合之前首先先定义一个Map对象: Map<String, String> map = new LinkedHashMap<String, String>(); map.put("1", "one"); map.put("2", "two"); map.put("3", "three"); map.put("4", "fore"); map.put("5", "five"); 这个地方使用的是LinkedHashMap,主要是为了确保让map中的元素是按照插入的顺序存放的。 1.… Read More

JAVA: 使用Jackson解析JSON, 生成JSON, 反序列化和序列化, Jackson 实现JSON数据与Java对象相互转换, 详解入门(附项目源码)

项目主页:https://github.com/FasterXML/jackson-databind 在Web开发过程中,利用JSON可以帮助我们更加方便的开发我们的应用。那么在Java语言中,如何实现Java实例与JSON之间的相互转换(序列化与反序列化)呢?目前流行的JSON第三方类库有Jackson、Gson、Fastjson等,本文将简单介绍如何使用Jackson进行JSON的解析与序列化。 一、获取Jackson 获取Jackson可以通过Maven或直接下载jar包两种方式,通常我们只需要下载Jackson的jackson-core核心包即可,如果希望使用更多功能(例如注解),还需要下载另外的jar包。Jackson为我们提供了以下jar包: jackson-core.jar——核心包(必须),提供基于“流模式”解析的API。 jackson-databind——数据绑定包(可选),提供基于“对象绑定”和“树模型”相关API。 jackson-annotations——注解包(可选),提供注解功能。 目前Jackson的最新版本为2.9.3。 1、通过Maven获取 使用Maven获取Jackson十分方便,只需要在pom.xml中加入如下依赖即可: <properties> <jackson.version>2.9.3</jackson.version> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId>

JAVA:设计和实现一款轻量级的爬虫框架, JAVA爬虫, JAVA抓取页面, JAVA Crawler

说起爬虫,大家能够想起 Python 里赫赫有名的 Scrapy 框架, 在本文中我们参考这个设计思想使用 Java 语言来实现一款自己的爬虫框(lun)架(zi)。 我们从起点一步一步分析爬虫框架的诞生过程。 我把这个爬虫框架的源码放在 github上,里面有几个例子可以运行。 关于爬虫的一切 下面我们来介绍什么是爬虫?以及爬虫框架的设计和遇到的问题。 什么是爬虫? “爬虫”不是一只生活在泥土里的小虫子,网络爬虫(web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览网络上内容的机器人。 爬虫访问网站的过程会消耗目标系统资源,很多网站不允许被爬虫抓取(这就是你遇到过的 robots.txt 文件, 这个文件可以要求机器人只对网站的一部分进行索引,或完全不作处理)。… Read More

Java:注解初步学习

注解的分类 按照运行机制分 源码注解: 注解只在源码中存在,编译成 .class 文件就不存在。 编译时注解: 注解在源码和.class文件中都存在。例如JDK中@Override、@Deprecated、@Suppvisewarnings。 运行时注解 :在运行阶段还起作用,甚至会影响运行逻辑的注解。例如Spring中的@Autowired。 按来源来分 来自JDK的注解 来自第三方的注解 自定义注解 自定义注解语法要求 @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented… Read More

Java: maven下读取资源文件的问题, java路径

直接上图吧,新建一个maven工程后,main目录下会有java和resources两个文件夹,其中java文件夹下存放源代码,resources文件夹下存放一些配置文件等。 在弄清楚编译后,资源文件以及字节码存在哪里这个问题之前,有必要明白什么是classpath classpath实际上就是编译后的 以 classes 文件夹为起点的路径,而在ItelliJ IDEA 中编译后的文件都会存入out/production下。 所以,编译后,resources文件夹中的文件以及java目录下的文件都会存入同一个目录(out/production)下,也就是说,编译后是不存在java和resources这两个目录的。 读取资源文件的若干中方法 package me.shenchao.main; import java.io.*; /** * Created by jerry on… Read More

JAVA:Apache Commons工具集简介, BeanUtils, FileUpload, IO, Validator, Compress

Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。下面是我这几年做开发过程中自己用过的工具类做简单介绍。   组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等. Betwixt XML与Java对象之间相互转换. Codec 处理常用的编码方法的工具类包 例如DES、SHA1、MD5、Base64等. Collections java集合框架操作. Compress java提供文件打包 压缩类库. Configuration 一个java应用程序的配置管理类库. DBCP… Read More