「java授权验证」java验证码验证
今天给各位分享java授权验证的知识,其中也会对java验证码验证进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、Java的权限修饰符怎样验证
- 2、Java有哪些可考的证书?
- 3、Java如何实现验证码验证功能
- 4、sun公司的java认证
- 5、什么是JAAS,以及灵活的Java安全
- 6、java的用户验证功能
Java的权限修饰符怎样验证
【访问权限修饰符】
java语言中有四种不同的限定词,提供了四种不同的访问权限。
1) private 类中限定为private的成员,只能被这个类本身访问。如果一
个类的构造方法声明为private,则其它类不能生成该类的一个实例。
2) default 类中不加任何访问权限限定的成员属于缺省的(default)访问状态:
friend,可以被这个类本身和同一个包中的类所访问。
3) protected 类中限定,为protected的成员,可以被这个类本身、它的子类(包括同一个包中以及不同包中的子类)和同一个包中的所有其他的类访问。
4) public 类中限定为public的成员,可以被所有的类访问。
5)final 关键字可以修饰类、类的成员变量和成员方法,但final 的作用不同。
(1) final 修饰成员变量:final修饰变量,则成为常量,修饰成员变量时,定义时同时给出初始值,且以后不能被修改,而修饰局部变量时不做要求。
(2) final 修饰成员方法:final修饰方法,则该方法不能被子类重写
(3) final 类:final修饰类,则类不能被继承 n6)java语言中,用abstract 关键字来修饰一个类时,这个类叫做抽象类,用abstract 关键字来修饰一个方法时,这个方法叫做抽象方法。
格式如下:
abstract class abstractClass{ …} //抽象类
abstract returnType abstractMethod([paramlist]) //抽象方法 n 抽象类必须被继承,抽象方法必须被重写。抽象方法只需声明,无需实现;抽象类不能被实例化,抽象类不一定要包含抽象方法。若类中包含了抽象方法,则该类必须被定义为抽象类。若一个类继承了一个抽象类,则抽象类的抽象方法必须被实现,否则子类必须声明为abstract.
Java有哪些可考的证书?
Java高级工程师,Java可靠的证书有SCJP。 sun certificated java programmer对于是Java程序员认证,一种Java认证考试。
知识扩展:
Java自1995年问世以来,因其卓越的通用性、高效性、平台移植性 和安全性等特性,成为全球范围内应用范围最广的开发语言,而且即使历经二十余年发展仍然在行业内保持着“常青树”的地位。Java软件工程师是指运用Java这种开发语言去完成软件产品的软件程序设计、开发、测试、维护升级等工作的人员。
sun certificated java programmer (SCJP)对于是Java程序员认证,一种Java认证考试。Java程序设计员,Sun推出两项认证:SunCertificatedJavaProgrammer(SCJP)和SunCertificatedJavaDeveloper(SCJD)。
相对于SCJD来说,SCJP更侧重于测验您的Java程序设计概念及能力,内容偏重于Java语法及JDK的内容。其对应的最主要的学习课程是SL-275。SCJP 的学习/考试过程是相对相对比较明确的,首先学员参加SL-275的培训课程(标准费用大致在2600人民币,包括考试券、教材费),也可以单独购买考试券(Certification Voucher,费用现在是1250元),然后在Prometric考试中心参加考试。通过后获得Sun颁发的SCJP认证证书。
Java如何实现验证码验证功能
Java如何实现验证码验证功能呢?日常生活中,验证码随处可见,他可以在一定程度上保护账号安全,那么他是怎么实现的呢?
Java实现验证码验证功能其实非常简单:用到了一个Graphics类在画板上绘制字母,随机选取一定数量的字母随机生成,然后在画板上随机生成几条干扰线。
首先,写一个验证码生成帮助类,用来绘制随机字母:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
public final class GraphicHelper {
/**
* 以字符串形式返回生成的验证码,同时输出一个图片
*
* @param width
* 图片的宽度
* @param height
* 图片的高度
* @param imgType
* 图片的类型
* @param output
* 图片的输出流(图片将输出到这个流中)
* @return 返回所生成的验证码(字符串)
*/
public static String create(final int width, final int height, final String imgType, OutputStream output) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics graphic = image.getGraphics();
graphic.setColor(Color.getColor("F8F8F8"));
graphic.fillRect(0, 0, width, height);
Color[] colors = new Color[] { Color.BLUE, Color.GRAY, Color.GREEN, Color.RED, Color.BLACK, Color.ORANGE,
Color.CYAN };
// 在 "画板"上生成干扰线条 ( 50 是线条个数)
for (int i = 0; i 50; i++) {
graphic.setColor(colors[random.nextInt(colors.length)]);
final int x = random.nextInt(width);
final int y = random.nextInt(height);
final int w = random.nextInt(20);
final int h = random.nextInt(20);
final int signA = random.nextBoolean() ? 1 : -1;
final int signB = random.nextBoolean() ? 1 : -1;
graphic.drawLine(x, y, x + w * signA, y + h * signB);
}
// 在 "画板"上绘制字母
graphic.setFont(new Font("Comic Sans MS", Font.BOLD, 30));
for (int i = 0; i 6; i++) {
final int temp = random.nextInt(26) + 97;
String s = String.valueOf((char) temp);
sb.append(s);
graphic.setColor(colors[random.nextInt(colors.length)]);
graphic.drawString(s, i * (width / 6), height - (height / 3));
}
graphic.dispose();
try {
ImageIO.write(image, imgType, output);
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
}
接着,创建一个servlet,用来固定图片大小,以及处理验证码的使用场景,以及捕获页面生成的验证码(捕获到的二维码与用户输入的验证码一致才能通过)。
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet(urlPatterns = "/verify/regist.do" )
public class VerifyCodeServlet extends HttpServlet {
private static final long serialVersionUID = 3398560501558431737L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获得 当前请求 对应的 会话对象
HttpSession session = request.getSession();
// 从请求中获得 URI ( 统一资源标识符 )
String uri = request.getRequestURI();
System.out.println("hello : " + uri);
final int width = 180; // 图片宽度
final int height = 40; // 图片高度
final String imgType = "jpeg"; // 指定图片格式 (不是指MIME类型)
final OutputStream output = response.getOutputStream(); // 获得可以向客户端返回图片的输出流
// (字节流)
// 创建验证码图片并返回图片上的字符串
String code = GraphicHelper.create(width, height, imgType, output);
System.out.println("验证码内容: " + code);
// 建立 uri 和 相应的 验证码 的关联 ( 存储到当前会话对象的属性中 )
session.setAttribute(uri, code);
System.out.println(session.getAttribute(uri));
}
}
接着写一个HTML注册页面用来检验一下:
html
head
meta charset="UTF-8"
title注册/title
link rel="stylesheet" href="styles/general.css"
link rel="stylesheet" href="styles/cell.css"
link rel="stylesheet" href="styles/form.css"
script type="text/javascript" src="js/ref.js"/script
style type="text/css"
.logo-container {
margin-top: 50px ;
}
.logo-container img {
width: 100px ;
}
.message-container {
height: 80px ;
}
.link-container {
height: 40px ;
line-height: 40px ;
}
.link-container a {
text-decoration: none ;
}
/style
/head
body
div class="container form-container"
form action="/wendao/regist.do" method="post"
div class="form" !-- 注册表单开始 --
div class="form-row"
span class="cell-1"
i class="fa fa-user"/i
/span
span class="cell-11" style="text-align: left;"
input type="text" name="username" placeholder="请输入用户名"
/span
/div
div class="form-row"
span class="cell-1"
i class="fa fa-key"/i
/span
span class="cell-11" style="text-align: left;"
input type="password" name="password" placeholder="请输入密码"
/span
/div
div class="form-row"
span class="cell-1"
i class="fa fa-keyboard-o"/i
/span
span class="cell-11" style="text-align: left;"
input type="password" name="confirm" placeholder="请确认密码"
/span
/div
div class="form-row"
span class="cell-7"
input type="text" name="verifyCode" placeholder="请输入验证码"
/span
span class="cell-5" style="text-align: center;"
img src="/demo/verify/regist.do" onclick="myRefersh(this)"
/span
/div
div class="form-row" style="border: none;"
span class="cell-6" style="text-align: left"
input type="reset" value="重置"
/span
span class="cell-6" style="text-align:right;"
input type="submit" value="注册"
/span
/div
/div !-- 注册表单结束 --
/form
/div
/body
/html
效果如下图:
在控制台接收到的图片中验证码的变化如下:
当点击刷新页面的时候,验证码也会随着变化,但我们看不清验证码时,只要点击验证码就会刷新,这样局部的刷新可以用JavaScript来实现。
在img
src="/demo/verify/regist.do"中,添加一个问号和一串后缀数字,当刷新时让后缀数字不断改变,那么形成的验证码也会不断变化,我们可以采用的一种办法是后缀数字用date代替,date获取本机时间,时间是随时变的,这样就保证了刷新验证码可以随时变化。
代码如下:
function myRefersh( e ) {
const source = e.src ; // 获得原来的 src 中的内容
//console.log( "source : " + source ) ;
var index = source.indexOf( "?" ) ; // 从 source 中寻找 ? 第一次出现的位置 (如果不存在则返回 -1 )
//console.log( "index : " + index ) ;
if( index -1 ) { // 如果找到了 ? 就进入内部
var s = source.substring( 0 , index ) ; // 从 source 中截取 index 之前的内容 ( index 以及 index 之后的内容都被舍弃 )
//console.log( "s : " + s ) ;
var date = new Date(); // 创建一个 Date 对象的 一个 实例
var time = date.getTime() ; // 从 新创建的 Date 对象的实例中获得该时间对应毫秒值
e.src = s + "?time=" + time ; // 将 加了 尾巴 的 地址 重新放入到 src 上
//console.log( e.src ) ;
} else {
var date = new Date();
e.src = source + "?time=" + date.getTime();
}
}
如回答不详细可追问
sun公司的java认证
Sun针对先进的科技,推出Java及Solaris技术认证方案。根据这些认证,在企业方面可以藉此作为招聘人才的评判标准,或是作为衡量员工技术水准的依据;在技术方面,通过这些认证也可以证明个人的技术能力。 Sun在UNIX领域一直是技术上和市场占有率的领先者;近年来推出的Java技术,更成为业界的标准。Sun公司所举办的认证考试,也将成为Java和UNIX在全球信息界公认的标准。Sun推出的专业认证包括下列三种:Java认证考试 对于Java程序设计员,Sun推出两项认证:SunCertifiedJavaProgrammer(SCJP)和SunCertifiedJavaDeveloper(SCJD)。SCJP测验Java程序设计概念及能力,内容偏重于Java语法及JDK的内容;SCJD则进一步测试用Java开发应用程序的能力,考试者必须先完成一个程序的设计方案,再回答与此方案相关的一些问题。Solaris系统管理认证考试对Solaris/SunOS系统管理员,Sun推出CertifiedSolarisAdministrator(CSA)。CSA分别为两个等级(PartI和PartII),测试对Solaris系统管理的了解程度。Solaris网络管理认证考试为了测试使用者对于Solaris网络的管理能力,Sun还特别推出CertifiedNetworkAdministrator(CNA).内容包括基本网络概念、RoutingandSubnet、Security、Performance、DNS、NIS+等通过SUN任何一门专业认证后,将全收到SunMicrosystems总公司寄发的资格证书及徽章,并有权将通过Sun认证的标记印在个人名片上,作为个人技术能力的肯定。
SUN认证JAVA程序员众所周知,Java以其独有的开放性,跨平台性和面向网络的交互性席卷全球,以其安全性、易用性和开发周期短的特点,迅速从最初的编程语言发展成为全球第二大软件开发平台。这些优点已引起国内外计算机界的极大关注;Java公用规范(PAS)已被国际标准化组织(ISO)认定,Java技术已列为当今世界信息技术三大要点之一。 根据权威部门的预测:到2000年,我国对Java技术人员的需求量将高达20万余人。然而,到目前为止,在我国参加认证培训的学员只有近万人,而参加认证考试并获得认证资格的人员不足2000人。这个数字和20万人的需求量相差甚远。因此,早日掌握Java技术,对每个有志于在IT行业发展的人来说是尤为重要的。我们深信Java技术的应用和普及,必将成为势不可挡的潮流迅速在世界各地发展。SunJava认证是业界唯一经Sun授权的Java认证。考试内容涉及所有Java相关知识、编程概念及applet开发技巧。Sun认证Java程序员考试旨在观察您通过应用软件分配进行复杂编程的能力。之后还要测试您完成编程所需的知识。每次考试都包括65道以上的选择题,时间大约为90分钟。
什么是JAAS,以及灵活的Java安全
Java Authentication Authorization Service(JAAS,Java验证和授权API)提供了灵活和可伸缩的机制来保证客户端或服务器端的Java程序。Java早期的安全框架强调的是通过验证代码的来源和作者,保护用户避免受到下载下来的代码的攻击。JAAS强调的是通过验证谁在运行代码以及他/她的权限来保护系统面受用户的攻击。它让你能够将一些标准的安全机制,例如Solaris NIS(网络信息服务)、Windows NT、LDAP(轻量目录存取协议),Kerberos等通过一种通用的,可配置的方式集成到系统中。
你是否曾经需要为一个应用程序实现登录模块呢?如果你是一个比较有经验的程序员,相信你这样的工作做过很多次,而且每次都不完全一样。你有可能把你的登录模块建立在Oracle数据库的基础上,也有可能使用的是NT的用户验证,或者使用的是LDAP目录。如果有一种方法可以在不改变应用程序级的代码的基础上支持上面提到的所有这一些安全机制,对于程序员来说一定是一件幸运的事。
现在你可以使用JAAS实现上面的目标。JAAS是一个比较新的的Java API。在J2SE 1.3中,它是一个扩展包;在J2SE 1.4中变成了一个核心包。在本文中,我们将介绍JAAS的一些核心概念,然后通过例子说明如何将JAAS应用到实际的程序中。本文的例子是根据我们一个基于Web的Java应用程序进行改编的,在这个例子中,我们使用了关系数据库保存用户的登录信息。由于使用了JAAS,我们实现了一个健壮而灵活的登录和身份验证模块。
客户端和服务器端的JAAS
开发人员可以将JAAS应用到客户端和服务器端。在客户端使用JAAS很简单。在服务器端使用JAAS时情况要复杂一些。目前在应用服务器市场中的JAAS产品还不是很一致,使用JAAS的J2EE应用服务器有一些细微的差别。例如JBossSx使用自己的结构,将JAAS集成到了一个更大的安全框架中;而虽然WebLogic 6.x也使用了JAAS,安全框架却完全不一样。
现在你能够理解为什么我们需要从客户端和服务器端的角度来看JAAS了。我们将在后面列出两种情况下的例子。为了使服务器端的例子程序更加简单,我们使用了Resin应用服务器。
核心JAAS类
在使用JAAS之前,你首先需要安装JAAS。在J2SE 1.4中已经包括了JAAS,但是在J2SE 1.3中没有。如果你希望使用J2SE 1.3,你可以从SUN的官方站点上下载JAAS。当正确安装了JAAS后,你会在安装目录的lib目录下找到jaas.jar。你需要将该路径加入Classpath中。(注:如果你安装了应用服务器,其中就已经包括了JAAS,请阅读应用服务器的帮助文档以获得更详细的信息)。在Java安全属性文件java.security中,你可以改变一些与JAAS相关的系统属性。该文件保存在/lib/security目录中。
在应用程序中使用JAAS验证通常会涉及到以下几个步骤:
1. 创建一个LoginContext的实例。
2. 为了能够获得和处理验证信息,将一个CallBackHandler对象作为参数传送给LoginContext。
3. 通过调用LoginContext的login()方法来进行验证。
4. 通过使用login()方法返回的Subject对象实现一些特殊的功能(假设登录成功)。
下面是一个简单的例子:
LoginContext lc = new LoginContext("MyExample");
try {
lc.login();
} catch (LoginException) {
// Authentication failed.
}
// Authentication successful, we can now continue.
// We can use the returned Subject if we like.
Subject sub = lc.getSubject();
Subject.doAs(sub, new MyPrivilegedAction());
在运行这段代码时,后台进行了以下的工作。
1. 当初始化时,LoginContext对象首先在JAAS配置文件中找到MyExample项,然后更具该项的内容决定该加载哪个LoginModule对象。
2. 在登录时,LoginContext对象调用每个LoginModule对象的login()方法。
3. 每个login()方法进行验证操作或获得一个CallbackHandle对象。
4. CallbackHandle对象通过使用一个或多个CallBack方法同用户进行交互,获得用户输入。
5. 向一个新的Subject对象中填入验证信息。
我们将对代码作进一步的解释。但是在这之前,让我们先看代码中涉及到的核心JAAS类和接口。这些类可以被分为三种类型:
普通类型 Subject,Principal,凭证
验证 LoginContext,LoginModule,CallBackHandler,Callback
授权 Policy,AuthPermission,PrivateCredentialPermission
上面列举的类和接口大多数都在javax.security.auth包中。在J2SE 1.4中,还有一些接口的实现类在com.sun.security.auth包中。
普通类型:Subject,Principal,凭证 Subject类代表了一个验证实体,它可以是用户、管理员、Web服务,设备或者其他的过程。该类包含了三中类型的安全信息: 身份(Identities):由一个或多个Principal对象表示 公共凭证(Public credentials):例如名称或公共秘钥 私有凭证(Private credentials):例如口令或私有密钥 Principal对象代表了Subject对象的身份。它们实现了java.security.Principal和java.io.Serializable接口。在Subject类中,最重要的方法是getName()。该方法返回一个身份名称。在Subject对象中包含了多个Principal对象,因此它可以拥有多个名称。由于登录名称、身份证号和Email地址都可以作为用户的身份标识,可见拥有多个身份名称的情况在实际应用中是非常普遍的情况。 在上面提到的凭证并不是一个特定的类或借口,它可以是任何对象。凭证中可以包含任何特定安全系统需要的验证信息,例如标签(ticket),密钥或口令。Subject对象中维护着一组特定的私有和公有的凭证,这些凭证可以通过getPrivateCredentials()和getPublicCredentials()方法获得。这些方法通常在应用程序层中的安全子系统被调用。 验证:LoginContext 在应用程序层中,你可以使用LoginContext对象来验证Subject对象。LoginContext对象同时体现了JAAS的动态可插入性(Dynamic Pluggability),因为当你创建一个LoginContext的实例时,你需要指定一个配置。LoginContext通常从一个文本文件中加载配置信息,这些配置信息告诉LoginContext对象在登录时使用哪一个LoginModule对象。 下面列出了在LoginContext中经常使用的三个方法: login () 进行登录操作。该方法激活了配置中制定的所有LoginModule对象。如果成功,它将创建一个经过了验证的Subject对象;否则抛出LoginException异常。 getSubject () 返回经过验证的Subject对象 logout () 注销Subject对象,删除与之相关的Principal对象和凭证 验证:LoginModule LoginModule是调用特定验证机制的接口。J2EE 1.4中包含了下面几种LoginModule的实现类: JndiLoginModule 用于验证在JNDI中配置的目录服务 Krb5LoginModule 使用Kerberos协议进行验证 NTLoginModul 使用当前用户在NT中的用户信息进行验证 UnixLoginModule 使用当前用户在Unix中的用户信息进行验证 同上面这些模块绑定在一起的还有对应的Principal接口的实现类,例如NTDomainPrincipal和UnixPrincipal。这些类在com.sun.security.auth包中。 LoginModule接口中包含了五个方法: initialize () 当创建一LoginModule实例时会被构造函数调用 login () 进行验证 commit () 当LgoninContext对象接受所有LoginModule对象传回的结果后将调用该方法。该方法将Principal对象和凭证赋给Subject对象。 abort () 当任何一个LoginModule对象验证失败时都会调用该方法。此时没有任何Principal对象或凭证关联到Subject对象上。 logout () 删除与Subject对象关联的Principal对象和凭证。 在应用程序的代码中,程序员通常不会直接调用上面列出的方法,而是通过LigonContext间接调用这些方法。 验证:CallbackHandler和Callback CallbackHandler和Callback对象可以使LoginModule对象从系统和用户那里收集必要的验证信息,同时独立于实际的收集信息时发生的交互过程。 JAAS在javax.sevurity.auth.callback包中包含了七个Callback的实现类和两个CallbackHandler的实现类: ChoiceCallback、ConfirmationCallback、LogcaleCallback、NameCallback、PasswordCallback、TextInputCallback、TextOutputCallback、DialogCallbackHandler和TextCallBackHandler。Callback接口只会在客户端会被使用到。
java的用户验证功能
类:NameII 权限:public
方法:main 权限:public
参数:name,password,denglu,i;
1.参数介绍:
name,数据类型 String ,用来存储一个从 input 中获取的值,在本程序当中用作用户名的存放;
password,数据类型 String ,用来存储一个从 input 中获取的值,在本程序当中用作密码的存放;
denglu,数据类型 boolean,用来存储默认账户的登录状态,true 表示登录成功,false 表示尚未登录;
i,数据类型 int ,用来存储一个用户尝试登录失败次数的值;
2.方法功能:
在控制台输出“请输入用户名:”要求用户从控制台输入一个 String 类型的数值存放到name当中;
而后在控制台输出“请输入密码:”要求用户从控制台输入一个 String 类型的数值存放在password当中;
验证从控制台通过 input 中获取的用户名和密码是否与默认的用户名和密码一致;
如果一致,则输出“登录成功”,并更改用户登录状态 denglu 的值为 true ;
如果不一致,提醒用户登录失败,将用户尝试登录失败的次数加1,并提醒用户账号剩余的尝试登录次数;
用户尝试登录失败的次数达到3次,并提示用户名账号被冻结。
3.代码如下
public class NameII {
public static void main (String []arge) {
boolean denglu = false;//声明一个 boolean 数据类型的变量 denglu 存储用户名的登录状态,默认值为 false 尚未登录;
int i = 0;//声明一个 int 数据类型的变量 i 存储用户尝试登录失败的次数;
java.util.Scanner input = new java.util.Scanner (System.in);
do{
System.out.println("请输入用户名:");
String name = input.next();//声明一个 String 数据类型的变量 name 存储 input 中获取的用户名的值;
System.out.println("请输入密码:");
String password = input.next();//声明一个 String 数据类型的变量 password 存储 input 中获取的密码的值;
//验证 name 中的值和 password 中的值是否和用户名和密码一致;
if ("zhang".equals(name)"123".equals(password)){//如果一致则执行以下代码块;
System.out.println("登录成功");//提示用户名登录成功;
denglu = true;//更改用户名登录状态;
}else{//如果不一致则执行以下代码块;
//提醒用户登录失败,将用户尝试登录失败的次数加1,并提醒用户账号剩余的尝试登录次数;
i++;
System.out.println("登录失败,您还可以在尝试" + (3-i) +"次");
//用户尝试登录失败的次数达到3次,并提示用户名账号被冻结;
if(i == 3){
System.out.println("账号或密码错误三次,账号冻结");
}
}
}while(i 3 !denglu);//满足 尝试登录失败的次数小于三次的用户 或 登录成功的用户;
}
}
关于java授权验证和java验证码验证的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-24,除非注明,否则均为
原创文章,转载请注明出处。