java里登录校验是什么意思 Java语言中的字节码校验器是什么意思
大家好,关于java里登录校验是什么意思很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于Java语言中的字节码校验器是什么意思的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
java web应用如何实现单点登录
实现方式一:父域 Cookie
实现方式二:认证中心
实现方式三:LocalStorage跨域
补充:域名分级
在 B/S系统中,登录功能通常都是基于 Cookie来实现的。当用户登录成功后,一般会将登录状态记录到 Session中,或者是给用户签发一个 Token,无论哪一种方式,都需要在客户端保存一些信息(Session ID或 Token),并要求客户端在之后的每次请求中携带它们。在这样的场景下,使用 Cookie无疑是最方便的,因此我们一般都会将 Session的 ID或 Token保存到 Cookie中,当服务端收到请求后,通过验证 Cookie中的信息来判断用户是否登录。
单点登录(Single Sign On, SSO)是指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的应用系统。举例来说,百度贴吧和百度地图是百度公司旗下的两个不同的应用系统,如果用户在百度贴吧登录过之后,当他访问百度地图时无需再次登录,那么就说明百度贴吧和百度地图之间实现了单点登录。
单点登录的本质就是在多个应用系统中共享登录状态。如果用户的登录状态是记录在 Session中的,要实现共享登录状态,就要先共享 Session,比如可以将 Session序列化到 Redis中,让多个应用系统共享同一个 Redis,直接读取 Redis来获取 Session。
当然仅此是不够的,因为不同的应用系统有着不同的域名,尽管 Session共享了,但是由于 Session ID是往往保存在浏览器 Cookie中的,因此存在作用域的限制,无法跨域名传递,也就是说当用户在 app1.com中登录后,Session ID仅在浏览器访问 app1.com时才会自动在请求头中携带,而当浏览器访问 app2.com时,Session ID是不会被带过去的。实现单点登录的关键在于,如何让 Session ID(或 Token)在多个域中共享。
实现方式一:父域 Cookie
在将具体实现之前,我们先来聊一聊 Cookie的作用域。
Cookie的作用域由 domain属性和 path属性共同决定。domain属性的有效值为当前域或其父域的域名/IP地址,在 Tomcat中,domain属性默认为当前域的域名/IP地址。path属性的有效值是以“/”开头的路径,在 Tomcat中,path属性默认为当前 Web应用的上下文路径。
如果将 Cookie的 domain属性设置为当前域的父域,那么就认为它是父域 Cookie。Cookie有一个特点,即父域中的 Cookie被子域所共享,换言之,子域会自动继承父域中的Cookie。
利用 Cookie的这个特点,不难想到,将 Session ID(或 Token)保存到父域中不就行了。没错,我们只需要将 Cookie的 domain属性设置为父域的域名(主域名),同时将 Cookie的 path属性设置为根路径,这样所有的子域应用就都可以访问到这个 Cookie了。不过这要求应用系统的域名需建立在一个共同的主域名之下,如 tieba.baidu.com和 map.baidu.com,它们都建立在 baidu.com这个主域名之下,那么它们就可以通过这种方式来实现单点登录。
总结:此种实现方式比较简单,但不支持跨主域名。
实现方式二:认证中心
我们可以部署一个认证中心,认证中心就是一个专门负责处理登录请求的独立的 Web服务。
用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 Token写入 Cookie。(注意这个 Cookie是认证中心的,应用系统是访问不到的。)
应用系统检查当前请求有没有 Token,如果没有,说明用户在当前系统中尚未登录,那么就将页面跳转至认证中心。由于这个操作会将认证中心的 Cookie自动带过去,因此,认证中心能够根据 Cookie知道用户是否已经登录过了。如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录,如果发现用户已经登录过了,就不会让用户再次登录了,而是会跳转回目标 URL,并在跳转前生成一个 Token,拼接在目标 URL的后面,回传给目标应用系统。
应用系统拿到 Token之后,还需要向认证中心确认下 Token的合法性,防止用户伪造。确认无误后,应用系统记录用户的登录状态,并将 Token写入 Cookie,然后给本次访问放行。(注意这个 Cookie是当前应用系统的,其他应用系统是访问不到的。)当用户再次访问当前应用系统时,就会自动带上这个 Token,应用系统验证 Token发现用户已登录,于是就不会有认证中心什么事了。
这里顺便介绍两款认证中心的开源实现:
Apereo CAS是一个企业级单点登录系统,其中 CAS的意思是”Central Authentication Service“。它最初是耶鲁大学实验室的项目,后来转让给了 JASIG组织,项目更名为 JASIG CAS,后来该组织并入了Apereo基金会,项目也随之更名为 Apereo CAS。
XXL-SSO是一个简易的单点登录系统,由大众点评工程师许雪里个人开发,代码比较简单,没有做安全控制,因而不推荐直接应用在项目中,这里列出来仅供参考。
总结:此种实现方式相对复杂,支持跨域,扩展性好,是单点登录的标准做法。
实现方式三:LocalStorage跨域
前面,我们说实现单点登录的关键在于,如何让 Session ID(或 Token)在多个域中共享。
父域 Cookie确实是一种不错的解决方案,但是不支持跨域。那么有没有什么奇淫技巧能够让 Cookie跨域传递呢?
很遗憾,浏览器对 Cookie的跨域限制越来越严格。Chrome浏览器还给 Cookie新增了一个 SameSite属性,此举几乎禁止了一切跨域请求的 Cookie传递(超链接除外),并且只有当使用 HTTPs协议时,才有可能被允许在 AJAX跨域请求中接受服务器传来的 Cookie。
不过,在前后端分离的情况下,完全可以不使用 Cookie,我们可以选择将 Session ID(或 Token)保存到浏览器的 LocalStorage中,让前端在每次向后端发送请求时,主动将 LocalStorage的数据传递给服务端。这些都是由前端来控制的,后端需要做的仅仅是在用户登录成功后,将 Session ID(或 Token)放在响应体中传递给前端。
在这样的场景下,单点登录完全可以在前端实现。前端拿到 Session ID(或 Token)后,除了将它写入自己的 LocalStorage中之外,还可以通过特殊手段将它写入多个其他域下的 LocalStorage中。
————————————————
版权声明:本文为CSDN博主「风水道人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jcmj123456/article/details/114296482
前端通过 iframe+postMessage()方式,将同一份 Token写入到了多个域下的 LocalStorage中,前端每次在向后端发送请求之前,都会主动从 LocalStorage中读取 Token并在请求中携带,这样就实现了同一份 Token被多个域所共享。
总结:此种实现方式完全由前端控制,几乎不需要后端参与,同样支持跨域。
补充:域名分级
从专业的角度来说(根据《计算机网络》中的定义),.com、.cn为一级域名(也称顶级域名),.com.cn、baidu.com为二级域名,sina.com.cn、tieba.baidu.com为三级域名,以此类推,N级域名就是 N-1级域名的直接子域名。
从使用者的角度来说,一般把可支持独立备案的主域名称作一级域名,如 baidu.com、sina.com.cn皆可称作一级域名,在主域名下建立的直接子域名称作二级域名,如 tieba.baidu.com为二级域名。
Java语言中的字节码校验器是什么意思
当类加载器将新加载的Java平台类的字节码传递给虚拟机时,这些字节码首先要接受校验器(verifier)的校验。校验器负责检查那些指令无法执行的明显有破坏性的操作。除了系统类外,所有的类都要被校验,不过,可以使用非正式的-noverify选项来钝化校验。
例如,可以使用下面的命令行:
java-noverify Hello
下面是校验器执行的一些检查:
变量要在使用之前进行初始化。
方法调用与对象引用类型之间要匹配。
访问私有数据和方法的规则没有被违反。
对本地变量的访问都在运行时堆栈内。
运行时堆栈没有溢出。
如果以上这些检查中任何一条没有通过,那么该类就被认为遭到了破坏,并且不予加载。
java里如何正确计算检验和
Math类:
java.lang.Math类中包含基本的数字操作,如指数、对数、平方根和三角函数。
java.math是一个包,提供用于执行任意精度整数(BigInteger)算法和任意精度小数(BigDecimal)算法的类。
java.lang.Math类中包含E和PI两个静态常量,以及进行科学计算的类(static)方法,可以直接通过类名调用。
public static final Double E= 2.7182818284590452354
public static final Double PI= 3.14159265358979323846
public static long abs(double x):传回 x的绝对值。X也可int long float
public static long sin(double x):传回x径度的正弦函数值
public static long cos(double x):传回x径度的余弦函数值
public static long tan(double x):传回x径度的正切函数值
public static long asin(double x):传回x值的反正弦函数值。
public static long acos(double x):传回x值的反余弦函数值。
public static long atan(double x):传回x值的反正切函数值。
public static long atan2(double x, double y):传回极坐标(polar)的θ值
public static long floor(double x):传回不大于x的最大整数值
public static long ceil(double x):传回不小于x的最小整数值。
public static long exp(double x):传回相当于ex值
public static long log(double x):传回x的自然对数函数值
public static long max(double x,double y):传回x、y较大数
public static long min(double x,double y):传回x、y较小数
public static long pow(double x,double y):传回x的y次幂值
public static long sqrt(double x):传回x开平方值
public static long rint(double x):传回最接近x的整数值
public static long round(double x):传回x的四舍五入值
public static long toDegrees(double angrad):传回将angrad径度转换成角度
public static long toRadians(double angdeg):传回将angdeg角度转换成径度
public static long random():传回随机数值,产生一个0-1之间的随机数(不包括0和1)
好了,文章到这里就结束啦,如果本次分享的java里登录校验是什么意思和Java语言中的字节码校验器是什么意思问题对您有所帮助,还望关注下本站哦!