Java登陆验证模块的实现及小结
- 格式:doc
- 大小:37.50 KB
- 文档页数:3
java登陆原理
Java登录原理是通过验证用户输入的用户名和密码来判断用户是否合法,并根据验证结果为用户提供相应的访问权限。
具体实现过程如下:
1. 用户在登录界面输入用户名和密码,并点击登录按钮。
2. 后台服务器接收到用户的登录请求,并从数据库中检索出与输入的用户名匹配的用户信息。
3. 如果找到了相应的用户信息,则将数据库中存储的用户密码与用户输入的密码进行比对。
4. 如果两者匹配,则说明用户输入的密码是正确的,登录验证成功。
5. 系统根据用户的权限设置,决定为其提供相应的操作界面和功能。
6. 如果用户输入的密码与数据库中存储的密码不匹配,或者输入的用户名不存在,则登录验证失败,系统将提示用户重新输入正确的用户名和密码。
需要注意的是,为了保证用户密码的安全性,通常会对密码进行加密存储,而非明文存储。
在验证密码时,会将用户输入的密码进行相同的加密算法处理,然后与数据库中存储的加密密码进行比对。
这样即使数据库被非法访问,也不会直接泄露用户的密码信息。
另外,为了提高用户体验和安全性,登录过程通常还会包括一些验证码、记住密码、自动登录等功能的实现,以及一些额外的安全验证措施,如限制登录次数、用户锁定等。
这些都是为了保障用户信息的安全和提升系统的可用性。
实验1 MVC登录验证1 实验目的:熟悉MyEclipse2014和Java EE的集成开发环境,要求了解各组件的安装过程,次序及用途,并能进行调试简单的Java EE程序。
2 实验内容:在数据库中建立一个“用户名—密码”表,用户由页面上输入用户名和密码,单击登录按钮提交,程序通过JDBC 访问数据库中的表来验证用户,验证通过转到主页并回显欢迎信息,否则跳转至出错页。
3 实验程序○1 M部分:package org.easybooks.test.jdbc;import java.sql.*;import mon.core.CatchTag;public class SqlSrvDBConn {private Statement stmt;private Connection conn;ResultSet rs;public SqlSrvDBConn(){stmt=null;try{/*Class.forName("com.mysql.jdbc.Driver");conn=DriverManager.getConnection("jdbc:mysql://l27.0.0.1:3306;" +"databaseName=MBOOK","root","root");*/Class.forName("com.mysql.jdbc.Driver");String url="jdbc:mysql://localhost:3306/MBOOK";String user="root";String password="root";conn= DriverManager.getConnection(url,user,password);}catch(Exception e){e.printStackTrace();}rs=null;}public ResultSet executeQuery(String sql){try{stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);rs=stmt.executeQuery(sql);}catch(SQLException e){System.err.println("Data.executeQuery:"+e.getMessage());}return rs;}public void closeStmt(){try{stmt.close();}catch(SQLException e){System.err.println("Data.executeQuery:"+e.getMessage());}}public void closeConn(){try{conn.close();}catch(SQLException e){System.err.println("Data.executeQuery:"+e.getMessage());}}}○2 V部分:1.<%@ page language="java" pageEncoding="gb2312"%><html><head><title>简易留言板</title></head><body bgcolor="#E3E3E3"><form action="validate.jsp" method="post"><table><caption>用户登录</caption><tr><td>用户名:</td><td><input type="text" name="name" size="20"/></td></tr><tr><td>密码:</td><td><input type="password" name="password" size="21"/></td></tr></table><input type="submit" value="登录"/><input type="reset" value="重置"/></form>如果没有注册<a href="" >这里哦</a>注册!</body></html>2.<%@page language="java" pageEncoding="gb2312"%><Html><head><title>留言板信息 </title></head><body><body bgcolor=green><%out.print(request.getParameter("name")); %>你好!欢迎登录留言板. </body></Html>3.<%@ page language="java" pageEncoding="gb2312"%><html><head><title>出错</title></head><body>登录失败!单击<a href="login.jsp">这里</a>返回</body></html>○3 C部分<%@ page language="java" pageEncoding="gb2312" import="java.sql.*"%><jsp:useBean id="SqlSrvDB" scope="page" class="org.easybooks.test.jdbc.SqlSrvDBConn"/><html><head><meta http-equiv=Content-Type content="text/html;charset=gb2312"></head><body><%request.setCharacterEncoding("gb2312");String usr=request.getParameter("name");String pwd=request.getParameter("password");boolean validated=false;String sql="select * from userTable";ResultSet rs=SqlSrvDB.executeQuery(sql);while(rs.next()){if((rs.getString("name").trim().compareTo(usr)==0)&&(rs.getString("password").compareTo(pwd)==0)){validated=true;}}rs.close();SqlSrvDB.closeStmt();SqlSrvDB.closeConn();if(validated){//验证成功跳转到main.jsp%><jsp:forward page="main.jsp"/><%}else{//验证失败跳转到error.jsp%><jsp:forward page="error.jsp"/><%}%></body></html>4 实验小结通过本次实验,更让我熟悉了MyEclipse2014的集成开发环境,掌握了java程序的基本操作和运行,让我对学习Java EE的学习有了初步的了解,对以后的学习也充满了信心,相信以后的学习中一定能学好!。
java 单点登录实现方案Java单点登录(Single Sign-On,简称SSO)是一种身份验证机制,允许用户使用一组凭据(如用户名和密码)登录到多个相关的应用程序或系统,而无需在每个应用程序中单独进行身份验证。
本文将介绍Java单点登录的实现方案。
在实现Java单点登录时,可以采用以下方案:1. 基于Token的认证方案:这是目前较为常见的单点登录实现方案之一。
用户在登录成功后,后台生成一个Token,将其返回给用户,并存储在服务器端。
用户在访问其他应用程序时,将Token作为身份凭证发送到服务器端进行验证。
服务器端通过验证Token的有效性来判断用户的身份。
常见的Token生成方式包括JWT(JSON Web Token)和OAuth2.0。
2. 基于代理的认证方案:该方案使用一个代理服务器来处理用户的身份验证。
用户在登录成功后,代理服务器会为用户生成一个身份标识,并将其存储在Cookie中。
当用户访问其他应用程序时,请求会先发送到代理服务器,代理服务器会验证用户的身份,并将请求转发给相应的应用程序。
3. 基于Session的认证方案:该方案使用Java的Session机制来实现单点登录。
用户在登录成功后,后台会为用户创建一个Session,并将Session的ID存储在Cookie中。
当用户访问其他应用程序时,应用程序会通过Cookie中的Session ID来验证用户的身份。
无论采用哪种方案,Java单点登录的实现步骤大致相同:1. 用户登录:用户在登录页面输入用户名和密码进行登录。
后台验证用户的凭据是否正确,如果正确则进行下一步操作。
2. 生成身份凭证:在用户登录成功后,后台会生成一个身份凭证(Token、身份标识或Session),并将其返回给用户。
3. 存储身份凭证:服务器端会将生成的身份凭证存储起来,可以存储在数据库、缓存或服务器内存中。
4. 跨应用程序身份验证:当用户访问其他应用程序时,应用程序会验证用户的身份凭证的有效性。
java中login方法
在Java中,`login`方法通常用于验证用户身份,确保用户具有访问特定资源或执行特定操作的权限。
这个方法通常包含在用户认证和授权的逻辑中。
下面是一个简单的示例,展示了一个`login`方法的基本结构:
```java
public class UserService {
// 假设有一个验证用户的方法
private boolean validateUser(String username, String password) { // 在这里进行用户验证逻辑
// 比如从数据库或其他数据源中验证用户名和密码
// 如果验证成功,返回true;否则,返回false
}
public boolean login(String username, String password) {
// 调用验证用户的方法
return validateUser(username, password);
}
}
```
在这个示例中,`login`方法接受用户名和密码作为参数,并调用
`validateUser`方法进行验证。
如果验证成功,`login`方法返回`true`,表示登录成功;否则,返回`false`,表示登录失败。
请注意,这只是一个简单的示例,实际的登录逻辑可能会更加复杂,包括对密码的加密存储、使用第三方认证服务、防止暴力破解等安全措施。
因此,在编写实际的登录方法时,你需要根据具体的应用需求和安全要求来设计和实现。
用JAVA编写一个用户登陆界面用户验证通过数据库实现用户登录界面的实现可以分为以下几个步骤:1.用户界面设计2.数据库连接接下来,我们需要连接到数据库以验证用户的登录信息。
可以使用Java中的JDBC来连接数据库。
在连接数据库之前,需要准备好数据库的相关信息,如数据库驱动程序的引入、数据库连接URL、用户名和密码等。
3.用户验证一旦连接成功,我们可以使用SQL查询语句来验证用户的登录信息。
可以编写一个方法,传入用户输入的用户名和密码作为参数,并在数据库中查找是否存在匹配的用户记录。
可以使用PreparedStatement对象来执行SQL查询语句,查询结果将返回一个ResultSet对象。
4.处理验证结果根据查询结果,我们可以判断用户的登录是否成功。
如果有匹配的记录,则表示用户验证通过,可以跳转到下一个界面或执行其他操作。
如果没有匹配的记录,则表示用户验证失败,可以弹出错误提示框或执行其他错误处理逻辑。
5.关闭数据库连接在完成用户验证后,我们需要关闭数据库连接,释放相关资源。
可以在finally块中关闭连接,并通过try-catch-finally语句来确保连接的安全关闭。
以下是一个示例代码,用于实现用户登录界面的功能:```javaimport java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class UserLoginprivate static final String DB_URL ="jdbc:mysql://localhost:3306/mydatabase"; // 数据库连接URL private static final String DB_USER = "root"; // 数据库用户名public static void main(String[] args)//创建用户界面//用户界面设计略//监听登录按钮点击事件loginButton.setOnAction(event ->String username = usernameTextField.getText(;String password = passwordTextField.getText(;boolean result = validateUser(username, password);if (result)//用户验证通过,跳转到下一个界面或执行其他操作} else//用户验证失败,弹出错误提示框或执行其他错误处理逻辑}});}private static boolean validateUser(String username, String password)Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;boolean result = false;try//连接数据库conn = DriverManager.getConnection(DB_URL, DB_USER,DB_PASSWORD);//执行查询String sql = "SELECT * FROM users WHERE username = ? AND password = ?";stmt = conn.prepareStatement(sql);stmt.setString(1, username);stmt.setString(2, password);rs = stmt.executeQuery(;//判断查询结果if (rs.next()result = true; // 用户验证通过} elseresult = false; // 用户验证失败}} catch (SQLException e)//异常处理逻辑} finally//关闭连接和释放资源tryif (rs != null)rs.close(;}if (stmt != null)stmt.close(;}if (conn != null)conn.close(;}} catch (SQLException e)//异常处理逻辑}}return result;}```以上代码仅为示例,具体的实现可以根据自己的需求进行调整。
java用户登录验证程序的实现方法实现一个简单的Java用户登录验证程序可以分为以下几个步骤:1. 创建一个用户类(User):```javapublic class User {private String username;private String password;public User(String username, String password) {= username;= password;}public String getUsername() {return username;}public String getPassword() {return password;}}```2. 创建一个登录验证类(LoginValidator):```javaimport ;import ;public class LoginValidator {private Map<String, String> users = new HashMap<>();public LoginValidator() {("user1", "password1"); // 添加一些用户和密码的映射关系 ("user2", "password2");("user3", "password3");}public boolean validate(User user) {String correctPassword = (());if (correctPassword != null && (())) {return true; // 用户名和密码匹配,验证通过} else {return false; // 用户名或密码不匹配,验证失败}}}```3. 在主程序中测试登录验证:```javapublic class Main {public static void main(String[] args) {LoginValidator loginValidator = new LoginValidator();User user = new User("user1", "password1"); // 创建用户对象,设置用户名和密码boolean isLoginValid = (user); // 进行登录验证if (isLoginValid) {("登录验证通过!");} else {("登录验证失败!");}}}```这个程序只是一个简单的示例,实际的用户登录验证系统需要考虑更多的因素,例如密码加密、用户输入校验、错误处理等。
java登录实现原理在现代应用程序中,登录功能是必不可少的。
Java 作为一种广泛使用的编程语言,提供了许多不同的方法来实现用户登录。
本文将介绍 Java 中实现登录功能的原理。
1. 前端界面Java 中实现用户登录的第一步是创建一个前端界面。
这个界面通常由 HTML、CSS 和 JavaScript 组成,用于显示登录表单和接收用户输入的数据。
在这个界面中,用户将输入他们的用户名和密码。
2. 后端处理一旦用户输入了他们的用户名和密码,这些数据将被发送到服务器端进行处理。
Java 程序员可以使用多种技术来处理登录请求,包括 Servlet、JSP、Spring 等。
在服务器端,Java 代码将读取用户输入的数据,并使用一些技术来验证用户的身份。
这个过程通常涉及到从数据库中检索用户信息,并将其与用户提供的数据进行比较。
如果用户提供的数据与数据库中存储的数据匹配,则用户被认为已经成功登录。
3. Session 与 Cookie在用户成功登录后,Java 程序员通常会使用 Session 和Cookie 来跟踪用户的会话。
Session 是一种在服务器端跟踪用户状态的技术。
它将用户数据存储在服务器的内存或硬盘上,并给用户提供一个唯一的 ID。
Cookie 是一种在客户端跟踪用户状态的技术。
它将用户数据存储在用户的浏览器中,并在用户下次访问同一网站时自动发送该数据。
4. 安全当实现登录功能时,安全是一个关键问题。
Java 程序员必须确保用户的密码和其他敏感信息不会被黑客攻击者窃取。
为此,他们可以使用许多不同的技术,包括 SSL、HTTPS、加密和哈希等。
总结Java 中实现用户登录的过程包括创建前端界面、后端处理、Session 和 Cookie 跟踪用户会话以及安全保护等步骤。
在实现这些功能时,Java 程序员应该注意安全问题,并注意保护用户的敏感信息。
java登录注册业务逻辑(实用版)目录1.Java 登录注册业务逻辑概述2.登录功能的实现3.注册功能的实现4.业务逻辑的优化和扩展正文一、Java 登录注册业务逻辑概述Java 登录注册业务逻辑是网站或应用程序中常见的功能之一,它涉及到用户的身份验证和用户信息的管理。
在 Java 中,实现登录注册业务逻辑通常需要处理用户输入、验证用户信息、与数据库交互以及处理登录或注册成功的提示。
本文将介绍如何使用 Java 实现登录注册业务逻辑。
二、登录功能的实现1.接收用户输入:首先,需要创建一个表单,让用户输入用户名和密码。
2.验证用户信息:将用户输入的用户名和密码与数据库中存储的用户信息进行比对,判断用户输入的信息是否正确。
3.处理登录成功:如果用户输入的信息正确,则将用户登录状态记录到 Session 中,并跳转到登录成功页面。
4.处理登录失败:如果用户输入的信息错误,则提示用户重新输入或注册。
三、注册功能的实现1.接收用户输入:创建一个表单,让用户输入用户名、密码和确认密码等信息。
2.验证用户信息:检查用户输入的信息是否符合规范,如密码是否包含特殊字符等。
3.与数据库交互:将用户输入的信息存储到数据库中。
4.处理注册成功:注册成功后,将用户信息记录到 Session 中,并跳转到注册成功页面。
四、业务逻辑的优化和扩展1.密码加密:为保证用户密码的安全性,可以将用户输入的密码进行加密处理,如使用 MD5 或 SHA-256 等加密算法。
2.输入校验:对用户输入的信息进行校验,如检查用户名是否为空、密码是否符合规范等,以减少错误提示。
3.忘记密码功能:为用户提供找回密码的功能,如通过邮箱或手机验证码等方式。
4.第三方登录:提供第三方登录功能,如通过微信、QQ 等社交账号登录。
综上所述,通过使用 Java 实现登录注册业务逻辑,可以方便地管理用户身份验证和用户信息。
Java程序设计中的用户认证与访问控制模块案例用户认证与访问控制是Java程序设计中的一个重要模块,它用于验证用户身份并控制其访问权限。
本文将通过一个具体案例介绍Java程序设计中的用户认证与访问控制模块的实现。
案例背景:假设我们正在开发一个图书管理系统,系统中有三种用户角色:管理员、普通用户和游客。
管理员具有最高权限,可以管理图书馆的所有功能;普通用户可以借阅图书、查询图书信息;游客只能查询图书信息,不能进行借阅操作。
在本案例中,我们将使用Java程序设计实现这个用户认证与访问控制模块。
1. 用户认证模块设计:用户认证是验证用户身份的过程,我们可以通过以下步骤来设计用户认证模块:a) 创建一个用户类,包含用户ID、用户名和密码等属性。
可以使用数据库或文件来保存用户信息。
b) 在登录界面中,用户输入用户名和密码,并提交认证请求。
c) 后台程序接收到认证请求后,根据用户输入的用户名从数据库或文件中查询对应的用户信息。
d) 进行密码比对,如果密码匹配,则认证通过,否则认证失败。
2. 访问控制模块设计:访问控制是控制用户权限的过程,我们可以通过以下步骤来实现访问控制模块:a) 在用户类中添加一个角色属性,用于标识用户的角色(管理员、普通用户、游客)。
b) 对于不同角色的用户,设置不同的权限,如管理员具有所有权限,普通用户和游客只有部分权限。
c) 在系统功能实现代码中,对每个功能进行访问权限的判断。
例如,只有管理员才能进行图书管理操作,普通用户和游客只能进行查询操作。
d) 若用户角色与功能权限匹配,则允许用户访问相应功能;否则,拒绝用户访问。
3. 案例实现:在这个案例中,我们可以使用Java编程语言来实现用户认证与访问控制模块。
可以使用Java的面向对象特性来定义用户类和相关方法,并通过数据库或文件来保存用户信息。
同时,可以利用Java中的条件语句和循环结构来实现用户认证和访问控制逻辑。
总结:Java程序设计中的用户认证与访问控制模块是保障系统安全性和用户权限管理的关键部分。
java单点登录实现方式-回复Java单点登录(SSO)是一种用于多个应用程序中的用户身份验证和授权的机制。
在传统的身份验证和授权模型中,用户需要为每个应用程序提供用户名和密码,这对于用户来说是不方便且容易遗忘的。
而SSO可以通过一次成功的登录,允许用户在多个应用程序中访问他们的数据和资源,从而提高用户的工作效率和用户体验。
在本文中,我们将介绍Java单点登录的实现方式,并说明每个步骤的详细过程。
在实现Java单点登录之前,我们需要明确以下几点:1. 用户集中验证:这意味着所有的应用程序共享同一个身份验证系统,用户只需要登录一次,即可在其他应用程序中被自动识别和授权。
2. Token生成与验证:在用户登录成功后,服务器会为用户生成一个令牌(Token)。
在用户访问其他应用程序时,该令牌将被用于验证用户的身份和权限。
3. 令牌存储和验证:令牌需要被保存在一个可共享的地方,并能够被其他应用程序访问和验证。
常见的做法是将令牌保存在Session或Cookie中,或者使用分布式缓存来存储令牌。
以下是Java单点登录的实现步骤:第1步:身份验证服务的搭建1. 选择一个适合的身份验证服务(例如Spring Security、Shiro等),并将其集成到你的应用程序中。
2. 在身份验证服务中配置一个用于存储用户信息的用户数据库(例如数据库表、LDAP等)。
3. 设置好用户登录的相关逻辑,包括输入用户名和密码、从数据库中验证用户信息等。
第2步:令牌生成与传递1. 在用户成功登录后,从身份验证服务中生成一个令牌(Token),并将其发送给前端应用程序。
2. 令牌可以通过两种方式传递给前端应用程序:一是将令牌保存在Session中,二是将令牌保存在Cookie中。
第3步:令牌的存储和验证1. 前端应用程序在访问其他应用程序时,将令牌发送给目标应用程序。
2. 目标应用程序验证令牌的合法性和有效性。
验证的方式可以是通过访问身份验证服务的接口,获取令牌的相关信息并进行验证。
这是我以前写的系统登录框的loginpackage java1;import java.awt.*;import java.awt.event.*;import java.sql.*;import java.util.*;import javax.swing.*;import javax.swing.event.*;import java.awt.Rectangle;import java.awt.Font;public class login extends JFrame{public login() {try {jbInit();}catch (Exception ex) {ex.printStackTrace();}}public static void main(String[] args){login frm=new login();frm.setBounds(300,200,300,260);frm.setVisible(true);}private void jbInit() throws Exception {this.getContentPane().setLayout(null);jLabel1.setForeground(Color.red);jLabel1.setText("用户名");jLabel1.setBounds(new Rectangle(25, 72, 68, 29));jButton2.setBounds(new Rectangle(142, 159, 81, 30));jButton2.setText("取消");jButton2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {jButton2_actionPerformed(e);}});jButton1.setBounds(new Rectangle(38, 159, 81, 29));jButton1.setText("确定");jButton1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {jButton1_actionPerformed(e);}});jTextField1.setBounds(new Rectangle(109, 79, 136, 23));jPasswordField1.setBounds(new Rectangle(109, 115, 136, 23));this.getContentPane().add(jLabel1);jLabel3.setFont(new java.awt.Font("隶书", Font.PLAIN, 24));jLabel3.setText("学生考试系统");jLabel3.setBounds(new Rectangle(22, 15, 268, 47));this.getContentPane().add(jTextField1);this.getContentPane().add(jLabel2);this.getContentPane().add(jButton2);this.getContentPane().add(jButton1);this.getContentPane().add(jLabel3);this.getContentPane().add(jPasswordField1);jLabel2.setForeground(Color.red);jLabel2.setText("密码");jLabel2.setBounds(new Rectangle(26, 112, 68, 29));}JLabel jLabel1 = new JLabel();JLabel jLabel2 = new JLabel();JTextField jTextField1 = new JTextField();JButton jButton1 = new JButton();JButton jButton2 = new JButton();JLabel jLabel3 = new JLabel();JPasswordField jPasswordField1 = new JPasswordField();main2 wo=new main2();int sum;//判断权限的方法public void success(){try{ResultSet rs1;String s1="select * from 管理权限where name='"+jTextField1.getText()+"' and password='"+jPasswordField1.getText()+"'";rs1=sqlcx.Rs_jiluji(s1);rs1.first();sum=Integer.parseInt((String)(rs1.getString(3)));System.out.println(sum);very();}catch(Exception c){System.out.println("success error");}}//根据权限设置窗口public void very(){if (sum==1){JOptionPane.showOptionDialog(this, "您现在是以教师权限登陆", "登陆信息", JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE,null, null, null);}else{JOptionPane.showOptionDialog(this, "你现在是以学生权限登陆", "登陆信息", JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE,null, null, null);wo.jButton2.setVisible(false);wo.jButton3.setVisible(false);wo.jButton4.setVisible(false);wo.jButton5.setVisible(false);wo.jButton6.setVisible(false);wo.jButton7.setVisible(false);wo.jButton8.setVisible(false);wo.jMenu2.setVisible(false);wo.jMenu3.setVisible(false);wo.jMenu4.setVisible(false);}}public void jButton1_actionPerformed(ActionEvent e){//判断用户名是否为空if (jTextField1.getText().length() == 0) {JOptionPane.showOptionDialog(this, "用户名不能为空", "错误信息", JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE,null, null, null);}//判断密码是否为空else if (jPasswordField1.getText().length()==0){JOptionPane.showOptionDialog(this,"密码不能为空", "错误信息", JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE,null, null, null);}else{try{ResultSet rs;//声明记录集String sql="select * from 管理权限where name='"+jTextField1.getText()+"'";rs = sqlcx.Rs_jiluji(sql);if (rs.next()){if(jPasswordField1.getText().equals(rs.getString(2))){success();wo.setBounds(60,40,700,600);wo.setVisible(true);this.dispose();}else{JOptionPane.showOptionDialog(this,"密码错误", "错误信息", JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE,null, null, null);}}else{JOptionPane.showOptionDialog(this,"没有所要找的用户名", "错误信息", JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE,null, null, null);}}catch(Exception c){JOptionPane.showOptionDialog(this,"连接数据库失败", "错误信息", JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE,null, null, null);}}}public void jButton2_actionPerformed(ActionEvent e) { System.exit(0);}。
java实现登录验证码功能本⽂实例为⼤家分享了java实现登录验证码功能的具体代码,供⼤家参考,具体内容如下登录验证码登录验证是⼤多数登录系统都会⽤到的⼀个功能,它的验证⽅式也是有很多种,例如登录验证码,登录验证条及拼图拖动块等,这⾥讲讲输⼊登录验证码的⽅式来实现的例⼦。
⾸先,kaptcha这是⼀个开源的验证码实现库,利⽤这个库可以⾮常⽅便的实现验证码功能。
1.添加依赖在pom⽂件下添加kaptcha依赖包<!-- https:///artifact/com.github.axet/kaptcha --><dependency><groupId>com.github.axet</groupId><artifactId>kaptcha</artifactId><version>0.0.9</version></dependency>2.添加配置新建config包,在该包下创建kaptcha配置类,配置验证码的⼀些⽣成属性。
KaptchaConfig.java/*** @author: yzy* @Date: 2020/6/11 10:41* @Description: 验证码的配置*/@Configurationpublic class CaptchaConfig {@Beanpublic DefaultKaptcha producer() {Properties properties = new Properties();properties.put("kaptcha.border","no");properties.put("kaptcha.textproducer.font.color","black");properties.put("kaptcha.textproducer.char.space","5");Config config = new Config(properties);DefaultKaptcha defaultKaptcha = new DefaultKaptcha();defaultKaptcha.setConfig(config);return defaultKaptcha;}}3.⽣成代码新建⼀个控制器,提供系统登录相关的API,在其中添加验证码⽣成接⼝。
登陆验证模块的实现登陆页面验证首先是验证账号, 验证码是否填写,密码长度是否符合要求,验证码是否正确。
这几个验证是通过自定义的几个$.fn扩展函数实现的($.fn.remote=Function(url,msg, msgCnt){})实现的,一般将这些自定义的函数放在一个js文件中,便于维护。
自定义函数一般包含相应的提示字符串,及节点对象$(“#id”)等参数。
通过函数对节点的var value = this.val();value是否为空或空字符串的判断,相应的改变节点text属性的值。
1验证码正确验证1)验证码正确与否的验证是通过采用了Ajax技术的函数实现的。
对应的action的result 的属性为json(result要配置<param name="root">ok</param>的参数),action类要有布尔类型的名为ok的属性,通过返回值ok,更改相应的改变节点text属性的值。
如:$.fn.remote=function(url,msg,msgCnt){var value=this.val();//获得表单提交的数据,如你所填入的验证码/资费名称var name=this.attr("name");//获得表单名称,如验证码文本框的name:verifiCodevar b=false;$.ajax({url:url+"?"+name+"="+value,dataTyp e:"json",async:false,success:function(data){ if(data){$(msgCnt).text("");b=true;}else{$(msgCnt).text(msg);}}});return b;};2)验证码的点击更新是利用了result=stream的属性(要配置name="inputName",name="contentType"的参数),点击发送请求,对应的action(该类必须有InputStream类的属性,且名字要和result相应参数的属性值相同)生成验证码并存入session。
超详细讲解Java秒杀项⽬⽤户验证模块的实现⽬录⼀、⽤户验证1、在⽅法内添加请求与反应2、cookie操作的封装3、UserServiceImpl4、跳转界⾯PathController⼆、全局session1、导⼊依赖2、配置yml⽂件redis3、开启虚拟机三、⾃定义redis实现功能1、新建RedisConfig⽂件2、实现全局session四、使⽤参数解析器1、新建WebConfig⽂件2、定义参数解析器3、PathController4、访问主界⾯得到相关信息:接着上期内容⼀、⽤户验证未登录的⽤户不能进⼊⾸页根据上期内容,我未登录也能进⼊⾸页:1、在⽅法内添加请求与反应①、IUserServicepackage com.example.seckill.service;import er;import com.baomidou.mybatisplus.extension.service.IService;import com.example.seckill.util.response.ResponseResult;import erVo;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** <p>* ⽤户信息表服务类* </p>** @author lv* @since 2022-03-15*/public interface IUserService extends IService<User> {ResponseResult<?> findByAccount(UserVo userVo, HttpServletRequest request, HttpServletResponse response);}②、UserServiceImpl③、UserControllerpackage com.example.seckill.controller;import com.example.seckill.service.IUserService;import com.example.seckill.util.response.ResponseResult;import erVo;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.validation.Valid;/*** <p>* ⽤户信息表前端控制器* </p>** @author lv* @since 2022-03-15*/@RestController@RequestMapping("/user")public class UserController {@Autowiredprivate IUserService userService;// ⽤户登录@RequestMapping("/login")public ResponseResult<?> login(@Valid UserVo userVo, HttpServletRequest request, HttpServletResponse response){// 调⽤service的登录验证return userService.findByAccount(userVo,request,response);}}2、cookie操作的封装package com.example.seckill.util;import lombok.extern.slf4j.Slf4j;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.UnsupportedEncodingException;import .URLDecoder;import .URLEncoder;@Slf4jpublic class CookieUtils {/*** @Description: 得到Cookie的值, 不编码*/public static String getCookieValue(HttpServletRequest request, String cookieName) {return getCookieValue(request, cookieName, false);}/*** @Description: 得到Cookie的值*/public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) {Cookie[] cookieList = request.getCookies();if (cookieList == null || cookieName == null) {return null;}String retValue = null;try {for (int i = 0; i < cookieList.length; i++) {if (cookieList[i].getName().equals(cookieName)) {if (isDecoder) {retValue = URLDecoder.decode(cookieList[i].getValue(), "UTF-8");} else {retValue = cookieList[i].getValue();}break;}}} catch (UnsupportedEncodingException e) {e.printStackTrace();}return retValue;}/*** @Description: 得到Cookie的值*/public static String getCookieValue(HttpServletRequest request, String cookieName, String encodeString) {Cookie[] cookieList = request.getCookies();if (cookieList == null || cookieName == null) {return null;}String retValue = null;try {for (int i = 0; i < cookieList.length; i++) {if (cookieList[i].getName().equals(cookieName)) {retValue = URLDecoder.decode(cookieList[i].getValue(), encodeString);break;}}} catch (UnsupportedEncodingException e) {e.printStackTrace();}return retValue;}/*** @Description: 设置Cookie的值不设置⽣效时间默认浏览器关闭即失效,也不编码*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, String cookieValue) {setCookie(request, response, cookieName, cookieValue, -1);}/*** @Description: 设置Cookie的值在指定时间内⽣效,但不编码*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, String cookieValue, int cookieMaxage) {setCookie(request, response, cookieName, cookieValue, cookieMaxage, false);}/*** @Description: 设置Cookie的值不设置⽣效时间,但编码* 在服务器被创建,返回给客户端,并且保存客户端* 如果设置了SETMAXAGE(int seconds),会把cookie保存在客户端的硬盘中* 如果没有设置,会默认把cookie保存在浏览器的内存中* ⼀旦设置setPath():只能通过设置的路径才能获取到当前的cookie信息*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,String cookieValue, boolean isEncode) {setCookie(request, response, cookieName, cookieValue, -1, isEncode);}/*** @Description: 设置Cookie的值在指定时间内⽣效, 编码参数*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) { doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, isEncode);/*** @Description: 设置Cookie的值在指定时间内⽣效, 编码参数(指定编码)*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,String cookieValue, int cookieMaxage, String encodeString) {doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, encodeString);}/*** @Description: 删除Cookie带cookie域名*/public static void deleteCookie(HttpServletRequest request, HttpServletResponse response,String cookieName) {doSetCookie(request, response, cookieName, null, -1, false);}/*** @Description: 设置Cookie的值,并使其在指定时间内⽣效*/private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) { try {if (cookieValue == null) {cookieValue = "";} else if (isEncode) {cookieValue = URLEncoder.encode(cookieValue, "utf-8");}Cookie cookie = new Cookie(cookieName, cookieValue);if (cookieMaxage > 0)cookie.setMaxAge(cookieMaxage);if (null != request) {// 设置域名的cookieString domainName = getDomainName(request);("========== domainName: {} ==========", domainName);if (!"localhost".equals(domainName)) {cookie.setDomain(domainName);}}cookie.setPath("/");response.addCookie(cookie);} catch (Exception e) {e.printStackTrace();}}/*** @Description: 设置Cookie的值,并使其在指定时间内⽣效*/private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,String cookieName, String cookieValue, int cookieMaxage, String encodeString) {try {if (cookieValue == null) {cookieValue = "";} else {cookieValue = URLEncoder.encode(cookieValue, encodeString);}Cookie cookie = new Cookie(cookieName, cookieValue);if (cookieMaxage > 0)cookie.setMaxAge(cookieMaxage);if (null != request) {// 设置域名的cookieString domainName = getDomainName(request);("========== domainName: {} ==========", domainName);if (!"localhost".equals(domainName)) {cookie.setDomain(domainName);}}cookie.setPath("/");response.addCookie(cookie);} catch (Exception e) {e.printStackTrace();}}/*** @Description: 得到cookie的域名*/private static final String getDomainName(HttpServletRequest request) {String domainName = null;String serverName = request.getRequestURL().toString();if (serverName == null || serverName.equals("")) {domainName = "";} else {serverName = serverName.toLowerCase();serverName = serverName.substring(7);final int end = serverName.indexOf("/");serverName = serverName.substring(0, end);if (serverName.indexOf(":") > 0) {String[] ary = serverName.split("\\:");serverName = ary[0];}final String[] domains = serverName.split("\\.");int len = domains.length;if (len > 3 && !isIp(serverName)) {// domainName = "." + domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1];} else if (len <= 3 && len > 1) {// or domainName = "." + domains[len - 2] + "." + domains[len - 1];} else {domainName = serverName;}}return domainName;}public static String trimSpaces(String IP) {//去掉IP字符串前后所有的空格while (IP.startsWith(" ")) {IP = IP.substring(1, IP.length()).trim();}while (IP.endsWith(" ")) {IP = IP.substring(0, IP.length() - 1).trim();return IP;}public static boolean isIp(String IP) {//判断是否是⼀个IPboolean b = false;IP = trimSpaces(IP);if (IP.matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}")) {String s[] = IP.split("\\.");if (Integer.parseInt(s[0]) < 255)if (Integer.parseInt(s[1]) < 255)if (Integer.parseInt(s[2]) < 255)if (Integer.parseInt(s[3]) < 255)b = true;}return b;}}3、UserServiceImpl// 最初版本(session),但Session内数据是服务器共⽤的// 所有不让名字重复String ticket=UUID.randomUUID().toString().replace("-","");request.getSession().setAttribute(ticket,user);// 将⽣成的ticket给⽤户,⽤户如何验证?使⽤cookieCookieUtils.setCookie(request,response,"ticket",ticket);点击登录时,查看应⽤程序,cookie内有值4、跳转界⾯PathController跳转⽅法:// 跳所有⼆级页⾯@RequestMapping("/{dir}/{path}")public String toPath(@PathVariable("dir") String dir, @PathVariable("path") String path, HttpServletRequest request){ String ticket= CookieUtils.getCookieValue(request,"ticket");if(ticket==null){throw new BusinessException(ResponseResultCode.TICKET_ERROR);}// 去session中取到ticket对应的⽤户,判断是否有值Object obj=request.getSession().getAttribute(ticket);if(obj==null){throw new BusinessException(ResponseResultCode.TICKET_ERROR);}return dir+"/"+path;}未登录时访问主界⾯失败:只有登录成功后才能访问⼆、全局session根据以上操作完后,session仍然有问题,,session只能在当前某⼀台服务器中,需使⽤第三者完成数据共享,此处使⽤redis⽅式,将需要缓存的数据丢到缓存内1、导⼊依赖此处全局session是spring session中的⼀个,spring session就是spring中的⼀个⽂件<!--commons-pool2--><dependency><groupId>mons</groupId><artifactId>commons-pool2</artifactId></dependency><!--spring-session将session借助于第三⽅存储(redis/mongodb等等),默认redis--><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency>2、配置yml⽂件redisspring:redis:host: 47.100.191.44password: xiaoli_redisdatabase: 0port: 63793、开启虚拟机现在开启虚拟机三、⾃定义redis实现功能完成全局session的作⽤1、新建RedisConfig⽂件⽤于操作redispackage com.example.seckill.config;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;@Configurationpublic class RedisConfig {public RedisTemplate redisTemplate(RedisConnectionFactory factory){// 新建⼀个RedisTemplate redisTemplate=new RedisTemplate();//设置⼀下使⽤连接⼯⼚redisTemplate.setConnectionFactory(factory);// 额外设置// 将key序列化操作,转化为stringredisTemplate.setKeySerializer(new StringRedisSerializer());// value被转化为jsonredisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());// 额外设置(hash 就是 map集合)redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());// 让设置⽣效redisTemplate.afterPropertiesSet();return redisTemplate;}}2、实现全局session①、写个帮助类,⽤于调⽤IRedisService接⼝:package com.example.seckill.service;import er;public interface IRedisService {void putUserByTicket(String ticket, User user);User getUserByTicket(String ticket);}实现接⼝:package com.example.seckill.service.impl;import er;import com.example.seckill.service.IRedisService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Servicepublic class RedisServiceImpl implements IRedisService {@Autowiredprivate RedisTemplate redisTemplate;@Overridepublic void putUserByTicket(String ticket, User user) {redisTemplate.opsForValue().set("user:"+ticket,user,2L, TimeUnit.HOURS);}@Overridepublic User getUserByTicket(String ticket) {Object obj=redisTemplate.opsForValue().get("user:"+ticket);if(obj==null || !(obj instanceof User)){return null;}return (User)obj;}}②、redisService到缓存中拿元素@Autowiredprivate IRedisService redisService;// 跳所有⼆级页⾯@RequestMapping("/{dir}/{path}")public String toPath(@PathVariable("dir") String dir, @PathVariable("path") String path, HttpServletRequest request){ // 获取⽤户的ticketString ticket= CookieUtils.getCookieValue(request,"ticket");if(ticket==null){throw new BusinessException(ResponseResultCode.TICKET_ERROR);}// 去session中取到ticket对应的⽤户,判断是否有值// Object obj=request.getSession().getAttribute(ticket);// 去缓存中拿元素User user=redisService.getUserByTicket(ticket);if(user==null){throw new BusinessException(ResponseResultCode.TICKET_ERROR);}return dir+"/"+path;}③、放到缓存中UserServiceImpl:// 放到缓存中去redisService.putUserByTicket(ticket,user);package com.example.seckill.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;import com.example.seckill.exception.BusinessException;import er;import erMapper;import com.example.seckill.service.IRedisService;import com.example.seckill.service.IUserService;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.example.seckill.util.CookieUtils;import com.example.seckill.util.MD5Utils;import com.example.seckill.util.ValidatorUtils;import com.example.seckill.util.response.ResponseResult;import com.example.seckill.util.response.ResponseResultCode;import erVo;import m.Request;import ng3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.web.bind.annotation.RequestBody;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.websocket.Session;import java.util.Date;import java.util.UUID;/*** <p>* ⽤户信息表服务实现类* </p>** @author lv* @since 2022-03-15*/@Servicepublic class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Autowiredprivate IRedisService redisService;@Overridepublic ResponseResult<?> findByAccount(UserVo userVo, HttpServletRequest request, HttpServletResponse response) {// 先判断信息是否符合(账号是否是⼿机号码,密码是不是空)// if(!ValidatorUtils.isMobile(userVo.getMobile())){// throw new BusinessException(ER_ACCOUNT_NOT_MOBLIE);// }// if(StringUtils.isBlank(userVo.getPassword())){// throw new BusinessException(ER_PASSWORD_NOT_MATCH);// }// 再去数据库查出对应的⽤户(mobile)User user=this.getOne(new QueryWrapper<User>().eq("id",userVo.getMobile()));if(user==null){throw new BusinessException(ER_ACCOUNT_NOT_FIND);}// ⽐较密码// ⼆重加密(前端->后端,后端->数据库)String salt=user.getSalt();// 将前台的加密密码和后端的盐再次进⾏加密String newPassword=MD5Utils.formPassToDbPass(userVo.getPassword(),salt);if(!newPassword.equals(user.getPassword())){throw new BusinessException(ER_PASSWORD_NOT_MATCH);}// 修改最后的登录时间this.update(new UpdateWrapper<User>().eq("id",userVo.getMobile()).set("last_login_date",new Date()).setSql("login_count=login_count+1"));// 最初版本(session),但Session内数据是服务器共⽤的// 所有不让名字重复String ticket=UUID.randomUUID().toString().replace("-","");// 放到全局或者当服务器的session// request.getSession().setAttribute(ticket,user);// 放到缓存中去redisService.putUserByTicket(ticket,user);// 将⽣成的ticket给⽤户,⽤户如何验证?使⽤cookieCookieUtils.setCookie(request,response,"ticket",ticket);return ResponseResult.success();}}④、LocalDateTime⽆法构造实例LocalDateTime是Java8推荐使⽤的时间类,我此处⽆法转化,需要去配置解析器,我就改变实体类中的LocalDateTime改为时间戳Timestamp四、使⽤参数解析器在controller类中⽅法内加上User实体类参数,查询出⽤户,⾃动将信息赋值1、新建WebConfig⽂件package com.example.seckill.config;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.method.support.HandlerMethodArgumentResolver;import org.springframework.web.servlet.config.annotation.EnableWebMvc;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;@Configuration//打开mvc的功能@EnableWebMvcpublic class WebConfig implements WebMvcConfigurer {@Autowiredprivate UserArgumentResolvers userArgumentResolvers;@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(userArgumentResolvers);}// 使静态资源仍然可使⽤@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {//静态资源访问映射映射路径 -> 本地资源路径registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");}}2、定义参数解析器UserArgumentResolvers :package com.example.seckill.config;import com.example.seckill.exception.BusinessException;import er;import com.example.seckill.service.IRedisService;import com.example.seckill.util.CookieUtils;import com.example.seckill.util.response.ResponseResultCode;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.core.MethodParameter;import ponent;import org.springframework.web.bind.support.WebDataBinderFactory;import org.springframework.web.context.request.NativeWebRequest;import org.springframework.web.method.support.HandlerMethodArgumentResolver;import org.springframework.web.method.support.ModelAndViewContainer;import javax.servlet.http.HttpServletRequest;@Componentpublic class UserArgumentResolvers implements HandlerMethodArgumentResolver {@Autowiredprivate IRedisService redisService;// supportsParameter⽅法判断参数是否需要解析,决定了resolveArgument⽅法是否运⾏@Overridepublic boolean supportsParameter(MethodParameter methodParameter) {return methodParameter.getParameterType() == User.class;}// 解析参数@Overridepublic Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { // 参数解析User,因为很多地⽅需要做登录验证HttpServletRequest request=(HttpServletRequest) nativeWebRequest.getNativeRequest();// 获取⽤户的ticketString ticket= CookieUtils.getCookieValue(request,"ticket");if(ticket==null){throw new BusinessException(ResponseResultCode.TICKET_ERROR);}// 去session中取到ticket对应的⽤户,判断是否有值// Object obj=request.getSession().getAttribute(ticket);// 去缓存中拿元素User user=redisService.getUserByTicket(ticket);if(user==null){throw new BusinessException(ResponseResultCode.TICKET_ERROR);}return user;//经过了参数解析后,参数会变成你这个地⽅返回的值}}3、PathControllerpackage com.example.seckill.controller;import com.example.seckill.exception.BusinessException;import er;import com.example.seckill.service.IRedisService;import com.example.seckill.util.CookieUtils;import com.example.seckill.util.response.ResponseResultCode;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.CookieValue;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;@Controllerpublic class PathController {// 登录跳⾸页@RequestMapping("/")public String toPath(){return "login";}// 跳所有⼆级页⾯@RequestMapping("/{dir}/{path}")public String toPath(@PathVariable("dir") String dir, @PathVariable("path") String path, User user){return dir+"/"+path;}}4、访问主界⾯得到相关信息:本期内容结束~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~到此这篇关于超详细讲解Java秒杀项⽬⽤户验证模块的实现的⽂章就介绍到这了,更多相关Java ⽤户验证内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
Java登录功能实现token⽣成与验证⼀、token与cookie相⽐较的优势1、⽀持跨域访问,将token置于请求头中,⽽cookie是不⽀持跨域访问的;2、⽆状态化,服务端⽆需存储token,只需要验证token信息是否正确即可,⽽session需要在服务端存储,⼀般是通过cookie中的sessionID在服务端查找对应的session;3、⽆需绑定到⼀个特殊的⾝份验证⽅案(传统的⽤户名密码登陆),只需要⽣成的token是符合我们预期设定的即可;4、更适⽤于移动端(Android,iOS,⼩程序等等),像这种原⽣平台不⽀持cookie,⽐如说微信⼩程序,每⼀次请求都是⼀次会话,当然我们可以每次去⼿动为他添加cookie,详情请查看博主另⼀篇博客;5、避免CSRF跨站伪造攻击,还是因为不依赖cookie;⼆、基于JWT的token认证实现JWT:JSON Web Token,其实token就是⼀段字符串,由三部分组成:Header,Payload,Signature1、引⼊依赖<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.8.2</version></dependency>2、设置密钥和⽣存时间//设置过期时间private static final long EXPIRE_DATE=30*60*100000;//token秘钥private static final String TOKEN_SECRET = "ZCEQIUBFKSJBFJH2020BQWE";3、实现签名⽅法public static String token (String username,String password){String token = "";try {//过期时间Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);//秘钥及加密算法Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);//设置头部信息Map<String,Object> header = new HashMap<>();header.put("typ","JWT");header.put("alg","HS256");//携带username,password信息,⽣成签名token = JWT.create().withHeader(header).withClaim("username",username).withClaim("password",password).withExpiresAt(date).sign(algorithm);}catch (Exception e){e.printStackTrace();return null;}return token;}4、验证tokenpublic static boolean verify(String token){/*** @desc 验证token,通过返回true* @create 2019/1/18/018 9:39* @params [token]需要校验的串**/try {Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);JWTVerifier verifier = JWT.require(algorithm).build();DecodedJWT jwt = verifier.verify(token);return true;}catch (Exception e){e.printStackTrace();return false;}}5、测试直接⽤⽣成的token去验证,成功public static void main(String[] args) {String username ="zhangsan";String password = "123";String token = token(username,password);System.out.println(token);boolean b = verify(token);System.out.println(b);}三、完整的Token⼯具类代码package xxx.utils; //你的包import com.auth0.jwt.JWT;import com.auth0.jwt.JWTVerifier;import com.auth0.jwt.algorithms.Algorithm;import com.auth0.jwt.interfaces.DecodedJWT;import java.util.Date;import java.util.HashMap;import java.util.Map;/*** @desc 使⽤token验证⽤户是否登录* @author zm**/public class TokenUtils {//设置过期时间private static final long EXPIRE_DATE=30*60*100000;//token秘钥private static final String TOKEN_SECRET = "ZCfasfhuaUUHufguGuwu2020BQWE";public static String token (String username,String password){String token = "";try {//过期时间Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);//秘钥及加密算法Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);//设置头部信息Map<String,Object> header = new HashMap<>();header.put("typ","JWT");header.put("alg","HS256");//携带username,password信息,⽣成签名token = JWT.create().withHeader(header).withClaim("username",username).withClaim("password",password).withExpiresAt(date).sign(algorithm);}catch (Exception e){e.printStackTrace();return null;}return token;}public static boolean verify(String token){/*** @desc 验证token,通过返回true* @params [token]需要校验的串**/try {Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);JWTVerifier verifier = JWT.require(algorithm).build();DecodedJWT jwt = verifier.verify(token);return true;}catch (Exception e){e.printStackTrace();return false;}}public static void main(String[] args) {String username ="zhangsan";String password = "123";String token = token(username,password);System.out.println(token);boolean b = verify("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd22yZCI6IjEyMyIsImV4cCI6MTU3ODE5NzQxMywidXNlcm5hbWUiOiJ6aGFuZ3NhbiJ9.IyTZT0tISQQZhGhsNuaqHGV8LD7idjUYjn3MGbulmJg"); System.out.println(b);}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
实现java web 页面的登录验证实现java web 页面的登录验证本案例中的程序主要通过java jdbc-odbc 驱动连接sql2000数据库,并依据数据库中的用户表信息验证客户端登录请求提交的用户名和密码.1. sql2000数据库中建立数据库test..Clocal)即indo” HI)-LJ数据库:+ U master!+' Q modelL+ {J msdb:+ |J fiorthwind” Q gw++ L J管理3.在表中增加数据3. 建立数据源testEclipse开发环境4. 新建项目]i B J2EE+ JavaDynamic tfeb Froj ect*:&插件开发+ &示例」| |il &简单4. 新建WEB下面的HTML页面index.html.Er L. Dyn&jTiie Web Frojeels一Lz7 a电防意B± 赤demowgb+ ■班系统库[j2r*L 4.1J02] '+ »Tomcat vS.0 runtinit+ 法1JavaS ourct+ 慧mwbfis如jar 一C: VPrcgr Fil&+ 遂,mssqlserver, jar - C:\?rograjii+ 色msutil. j w - C:\Frogram FileA eb App Libraries [d.«moweb]&bin三i (2^? WebC^iiteiit+ 占HETA-IBF+ 3 WEBTNfclieckvali d. j wpcontiiiue. j sp img. html l^gin. jsp m ain. j sp5. 写入代码:<! DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" > < html >< head >< title > 系统登录</ title > </ head > < body >center >h2 >系统登录</ h2 >form action "login.jsp" method "post" >< Input type "text" name = "uid" maxlength 8 style "width:150" >< br >< Input type "password" name = "upwd" maxlength 8 style "width:150" >< br >< Input type "submit" value ="登陆"></ </< Inputform >center >type "reset" value "取消"></ body > </ html >界面如右jstzGOSO/demoweL/indeM. html 系统登录6. 新建jsp 文件login.jsp.Statement stmt =con.createStatement();String sql = "select * from userid where name='"sql += " and psw='" + password + "'"; // 准备查询语句ResultSet rs=stmt.executeQuery( sql );"UTF-8" %><%@page import = "java.sql.*" %><! DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" html headmeta http-equiv = "Content-Type" content = "text/html; charset=UTF-8"title >验证页面 </ title ></ head > < body > <%String username = request.getParameter( "uid"); String password = request.getParameter( "upwd");if (username != null && !username.equals( "n)){try {/**连接数据库 */Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );Connection con=DriverManager.getConnection("jdbc:odbc:test""n"n);+ username +if ( rs.next() )(session.setAttribute( session.setAttribute(%>< jsp:forward page = "main.jsp" /><% ) elseout.println( "错误的用户名和密码 ”);//验证未通过,显示错误信息out.println( "<a href=index.html> 返回 </a>” ); ) catch (Exception ee)( ee.printStackTrace(); )) else (out.println( "请先登录!” ); //验证未通过,显示错误信息out.println( "<a href=index.html> 返回 </a>” );) %> </ body > </ html > 7.新建 checkvalid.jsp<%@page language = "java" contentType = "text/html; charset=UTF-8" pageEncoding = "UTF-8" %> <! DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >< html > < head >< title > 验证页面 </ title </ head > < body >"login" , "ok” ); //验证通过之后,跳转到后续页面 "uname" ,username);<%if (session.getAttribute( "login" )== null|| !session.getAttribute( "login" ).equals( "ok" )) {response.sendRedirect( "index.html" ); // 验证没有通过}%></ body ></ html >8. 新建main.jsp<%@page language = "java" contentType = "text/html; charset=UTF-8" pageEncoding = "UTF-8" %><! DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >< html >< head >< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" >< title > 主页面</ title ></ head >< body ><%@include file = "checkvalid.jsp" %>欢迎进入本页面,您已经通过验证,你的用户名是 <%=session.getAttribute( "uname" ) %> < p ></ A > < A HREF = "continue.jsp" >您可以跳转到后续页面</ body ></ html >9. 新建continue.jsp<%@page language = "java" contentType = "text/html; charset=UTF-8" pageEncoding ="UTF-8" %><! DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >< html >< head >< meta http-equiv = "Content-Type" content = "text/html; charsetUTF-8" >< title > Insert title here </ title ></ head >< body ><%@include file = "checkvalid.jsp" %><%= session.getAttribute( "uname" ) %> ,欢迎您进入第二个页面!</ body ></ html >10.首先在Eclipse 中启动Tomcat应用服务器,然后启动IE浏览器.10.测试一下A_A先输入用户名,再输入密码,当然只有在sql2000中有的用户才是有较用户!点击登陆后跳为下贞:d. j sp; zin.jE# 七 CGntmQ« jsp !.|hi tp //loc«dh4i.t 6080/dtii&w«b/14£iFi jwpzJ 1> m 欢迎进入本页面,您已经通过验ilk. 你的用户名是txy您可以跳转到后续页面11点击说接跳到下页…txy,欢迎您进入第二个页面1当用户名或密码错时,将到下面页;<错误的用户名和密码 近回。
登陆验证模块的实现
登陆页面验证首先是验证账号, 验证码是否填写,密码长度是否符合要求,验证码是否正确。
这几个验证是通过自定义的几个$.fn扩展函数实现的($.fn.remote=Function(url,msg, msgCnt){})实现的,一般将这些自定义的函数放在一个js文件中,便于维护。
自定义函数一般包含相应的提示字符串,及节点对象$(“#id”)等参数。
通过函数对节点的var value = this.val();value是否为空或空字符串的判断,相应的改变节点text属性的值。
1验证码正确验证
1)验证码正确与否的验证是通过采用了Ajax技术的函数实现的。
对应的action的result 的属性为json(result要配置<param name="root">ok</param>的参数),action类要有布尔类型的名为ok的属性,通过返回值ok,更改相应的改变节点text属性的值。
如:
$.fn.remote=function(url,msg,msgCnt){
var value=this.val();//获得表单提交的数据,如你所填入的验证码/资费名称
var name=this.attr("name");//获得表单名称,如验证码文本框的name:verifiCode
var b=false;
$.ajax({url:url+"?"+name+"="+value,dataTyp e:"json",async:false,success:function(data){ if(data){
$(msgCnt).text("");
b=true;
}else{
$(msgCnt).text(msg);
}
}
});
return b;
};
2)验证码的点击更新是利用了result=stream的属性(要配置name="inputName",name="contentType"的参数),点击发送请求,对应的action(该类必须有InputStream类的属性,且名字要和result相应参数的属性值相同)生成验证码并存入session。
2账户和密码的验证
当前面一系列的验证结果都满足条件时,才能提交表单。
可定义一个函数实现:if(b1 && b2 && b4) {$("#loginForm").submit();}
相应action 接受到数据后,根据账户和密码调用DAO的相关方法,查询返回admin。
如果admin存在则转发到主页面(通过result在admin的不同状态下返回的字符串实现不同的type="redirectAction"),此时将admin存入session。
为后面的登陆检查验证做准备。
session.put(KEY_ADMIN, admin);
如果不存在就,还是停留在登陆页面。
3检查登陆验证。
为了防止未登录而访问数据,通过struts2的自定义拦截器功能实现登陆检查验证。
可通过实现接口Interceptor或者抽象类AbstractInterceptor,我选择继承AbstractIntercepto,相对较简洁。
在接口定义的方法intercept(ActionInvocation in)实现验证
逻辑。
通过ActionInvocatio n的getInvocationContext()方法获得action上下文对象ActionContext。
通过action上下问对象获得session对象,在session对象中获取admin对象:
Admin admin = (Admin)session.get(Constants.KEY_ADMIN);
如果admin为空,则通过return 返回字符串及全局result回到登陆页面。
如果admin不为空,则通过ActionInvocation对象调用invoke()方法,调用后面的action。
权限管理:
每个用户具有不同的角色,不同的角色具有不同的权限。
当用户登陆的时候,根据用户对象取得用户所具有的角色,根据角色id在privileges.xml(通过privilegereader类)文件中获得用户具有的所有权限,然后将此所有权限的集合存入session。
当用户每一次发送请求时都要通过拦截器,在拦截器中截取用户的请求路径(request.getServletPath()),并检查是否存在于session中的用户所具有权限中。
如果没有就返回到提示页面,如果有就调用invoke()方法执行后面的action,result。
拦截器的配置:
1.首先注册拦截器
<interceptor name="checklogin" class="ctoss.interceptor.CheckLoginInterceptor"> </interceptor>
2.然后定义拦截器栈,将默认拦截器栈也加进来。
<interceptor-stack name="loginStack">
<interceptor-ref name="checklogin"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
3.为当前package中所有Action指定默认的拦截器:
<default-interceptor-ref name="openSessionStack"/>
资费管理模块:
资费管的功能主要有资费信息的增加、管理、删除和修改等功能。
采用三大框架整合技术实现的。
在applicationContext.xml文件中配置连接池(用户名、密码、驱动包、连接路径),将连接池注入SessionFactory中,在SessionFactory中配置Hibernate框架参数:如方言dialect,show_sql等,指定映射描述。
然后开启组件扫描:
<context:component-scan base-package="ctoss">
</context:component-scan>
因为采用注解的形式,所以dao要继承HibernateDaoSupport,定义一个set方法调用父类的super.setSessionFactory(sf)方法,实例化HibernateTemplate。
在dao中利用getHibernateTemplate()实现一列的增删改查方法。
List list = getHibernateTemplate().find(hql,name);
关于事务:
在applicationContext.xml文件中定义事务管理Bean,然后定义通知<tx:advice transaction-manager="txManager">,可以在里面(<tx:attributes>)指定目标组件中的哪些方
法采用哪种事务管理方式。
然后定义<aop:config>,指定切入点<aop:pointcut >,将指定的dao当做目标。
然后关联通知和切入点:<aop:advisor advice-ref="txAdvice" pointcut-ref="servicepointcut"/>。
将dao用@Respository扫描进组件。