基於springboot,阿裏P7親自講解

程序小茉莉 2021-09-20 04:18:57 阅读数:889

springboot p7
public User login(String username, String password) {
return userDAO.login(username, password);
}

}


[](
)生成驗證碼的工具
---------------------------------------------------------------------------
在開發 `com.yusael.controller` 包的內容前,我們需要引入一個驗證碼功能的代碼,將它放到 `com.yusael.utils` 下作為一個工具類:**這個不需要我們自己寫,直接拿過來用就可以了。**

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

package com.yusael.utils;

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Arrays;

import java.util.Random;

public class ValidateImageCodeUtils {

/**
* 驗證碼難度級別 Simple-數字 Medium-數字和小寫字母 Hard-數字和大小寫字母
*/
public enum SecurityCodeLevel {
Simple, Medium, Hard
};
/**
* 產生默認驗證碼,4比特中等難度
*
* @return
*/
public static String getSecurityCode() {
return getSecurityCode(4, SecurityCodeLevel.Medium, false);
}
/**
* 產生長度和難度任意的驗證碼
*
* @param length
* @param level
* @param isCanRepeat
* @return
*/
public static String getSecurityCode(int length, SecurityCodeLevel level, boolean isCanRepeat) {
// 隨機抽取len個字符
int len = length;
// 字符集合(--除去易混淆的數字0,1,字母l,o,O)
char[] codes = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
};
// 根據不同難度截取字符串
if (level == SecurityCodeLevel.Simple) {
codes = Arrays.copyOfRange(codes, 0, 10);
} else if (level == SecurityCodeLevel.Medium) {
codes = Arrays.copyOfRange(codes, 0, 36);
}
// 字符集和長度
int n = codes.length;
// 拋出運行時异常
if (len > n && isCanRepeat == false) {
throw new RuntimeException(String.format("調用SecurityCode.getSecurityCode(%1$s,%2$s,%3$s)出現异常," + "當isCanRepeat為%3$s時,傳入參數%1$s不能大於%4$s", len, level, isCanRepeat, n));
}
// 存放抽取出來的字符
char[] result = new char[len];
// 判斷能否出現重複字符
if (isCanRepeat) {
for (int i = 0; i < result.length; i++) {
// 索引0 and n-1
int r = (int) (Math.random() * n);
// 將result中的第i個元素設置為code[r]存放的數值
result[i] = codes[r];
}
} else {
for (int i = 0; i < result.length; i++) {
// 索引0 and n-1
int r = (int) (Math.random() * n);
// 將result中的第i個元素設置為code[r]存放的數值
result[i] = codes[r];
// 必須確保不會再次抽取到那個字符,這裏用數組中最後一個字符改寫code[r],並將n-1
codes[r] = codes[n - 1];
n--;
}
}
return String.valueOf(result);
}
/**
* 生成驗證碼圖片
* @param securityCode
* @return
*/
public static BufferedImage createImage(String securityCode){
int codeLength = securityCode.length();//驗證碼長度
int fontSize = 18;//字體大小
int fontWidth = fontSize+1;
//圖片寬高
int width = codeLength*fontWidth+6;
int height = fontSize*2+1;
//圖片
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.setColor(Color.WHITE);//設置背景色
g.fillRect(0, 0, width, height);//填充背景
g.setColor(Color.LIGHT_GRAY);//設置邊框顏色
g.setFont(new Font("Arial", Font.BOLD, height-2));//邊框字體樣式
g.drawRect(0, 0, width-1, height-1);//繪制邊框
//繪制噪點
Random rand = new Random();
g.setColor(Color.LIGHT_GRAY);
for (int i = 0; i < codeLength*6; i++) {
int x = rand.nextInt(width);
int y = rand.nextInt(height);
g.drawRect(x, y, 1, 1);//繪制1*1大小的矩形
}
//繪制驗證碼
int codeY = height-10;
g.setColor(new Color(19,148,246));
g.setFont(new Font("Georgia", Font.BOLD, fontSize));
for(int i=0;i<codeLength;i++){
double deg=new Random().nextDouble()*20;
g.rotate(Math.toRadians(deg), i*16+13,codeY-7.5);
g.drawString(String.valueOf(securityCode.charAt(i)), i*16+5, codeY);
g.rotate(Math.toRadians(-deg), i*16+13,codeY-7.5);
}
g.dispose();//關閉資源
return image;
}
public static void main(String[] args) throws IOException {
String securityCode = ValidateImageCodeUtils.getSecurityCode();
System.out.println(securityCode);
BufferedImage image = ValidateImageCodeUtils.createImage(securityCode);
ImageIO.write(image,"png",new FileOutputStream("aa.png"));
}

}


[](
)controller
-----------------------------------------------------------------------------
### [](
)IndexController
我們知道,`resources/templates` 下面放的是我們的頁面文件(html),如果我們直接訪問 templates 下的靜態頁面是無法獲取 static 中的樣式的。
我們需要用控制器進行去訪問,**該控制器沒有其他作用,只是為了訪問界面而已**。
在 `com.yusael.controller` 下創建一個 `IndexController.java`:

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

package com.yusael.controller;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.GetMapping;

// 直接訪問templates下的靜態頁面是無法獲取static中的樣式的

// 用該控制器進行去訪問, 該控制器沒有其他作用, 只是為了訪問界面而已

@Controller

public class IndexController {

@GetMapping("/index")
public String toIndex() {
return "ems/login";
}
@GetMapping("/toRegister")
public String toRgsiter() {
return "ems/regist";
}
@GetMapping("/toSave")
public String toSaave() {
return "ems/addEmp";
}

}


### [](
)UserController
在 `com.yusael.controller` 下開發 `UserController.java`:

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

package com.yusael.controller;

import com.yusael.entity.User;

import com.yusael.service.UserService;

import com.yusael.utils.ValidateImageCodeUtils;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import javax.imageio.ImageIO;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import java.awt.image.BufferedImage;

import java.io.IOException;

@Controller

@RequestMapping(“/user”)

public class UserController {

@Autowired
private UserService userService;
// 登錄方法
@PostMapping("/login")
public String login(String username, String password, HttpSession session) {
User login = userService.login(username, password);
if (login != null) {
session.setAttribute("user", login);
System.out.println("登錄成功");
return "redirect:/emp/findAll"; // 跳轉到查詢所有
} else {
return "redirect:/index"; // 跳轉回到登錄
}
}
// 注册方法
@PostMapping("/register")
public String register(User user, String code, HttpSession session) {
String sessionCode = (String)session.getAttribute("code"); // 生成的驗證碼
// 忽略大小寫, 比較用戶輸入的驗證碼與生成的驗證碼
if (sessionCode.equalsIgnoreCase(code)) { // 輸入正確
userService.register(user); // 注册
System.out.println("注册成功");
return "redirect:/index"; // 注册成功跳轉到登錄界面
} else { // 輸入錯誤
return "redirect:/toRegister"; // 注册失敗跳轉到注册界面
}
}
// 生成驗證碼
@GetMapping("/code")
public void getImage(HttpSession session, HttpServletResponse response) throws IOException {
// 生成驗證碼
String securityCode = ValidateImageCodeUtils.getSecurityCode();
BufferedImage image = ValidateImageCodeUtils.createImage(securityCode);
// 存入session作用域中
session.setAttribute("code", securityCode);
// 響應圖片
ServletOutputStream os = response.getOutputStream();
ImageIO.write(image, "png", os);
}

}


[](
)前端頁面
-----------------------------------------------------------------------
這裏就把 登陸頁面`login.html` 和 注册頁面`regist.html` 的文件放出來(能體會到後端效果即可),完整項目可以去 [https://github.com/szluyu99/ems\_thymeleaf](
)。
將 `login.html` 和 `regist.html` 放到 `resources/templates/ems` 下:(css、img這些請去[GitHub](
)獲取,沒有這些不影響項目功能)
![基於springboot,阿裏P7親自講解_程序員](https://s9.51cto.com/images/20210920/1632082214626438.jpg)
### [](
)登錄頁面 login.html

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.

<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “ http://www.w3.org/TR/html4/loose.dtd”>

<html lang=“en” xmlns:th=“ http://www.thymeleaf.org”>

<head>

<title>login</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" th:href="@{/css/style.css}"/>

</head>

<body>

<div id=“wrap”>

<div id="top_content">
<div id="header">
<div id="rightheader">
<p>
2009/11/20
<br/>
</p>
</div>
<div id="topheader">
<a rel="nofollow" href="#">main</a>
</div>
<div id="navigation">
</div>
</div>
<div id="content">
<p id="whereami">
</p>
login
<form th:action="@{/user/login}" method="post">
<table cellpadding="0" cellspacing="0" border="0" class="form_table">
<tr>
<td valign="middle" align="right">
username:
</td>
<td valign="middle" align="left">
<input type="text" class="inputgri" name="username"/>
</td>
</tr>
<tr>
<td valign="middle" align="right">
password:
</td>
<td valign="middle" align="left">
<input type="password" class="inputgri" name="password"/>
</td>
</tr>
</table>
<p>
<input type="submit" class="button" value="Submit &raquo;"/>
<input type="button" class="button" onclick="location.href='/ems/toRegister'" value="Regist &raquo;"/>
</p>
</form>
</div>
</div>
<div id="footer">
<div id="footer_bg">
[email protected]
</div>
</div>

</div>

</body>

</html>


### [](
)注册頁面 regist.html

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “ http://www.w3.org/TR/html4/loose.dtd”>

<html xmlns:th=“ http://www.thymeleaf.org”>

<head>
<title>regist</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="css/style.css" />
</head>
<body>
<div id="wrap">
<div id="top_content">
<div id="header">
<div id="rightheader">
<p>
2009/11/20
<br />
</p>
</div>
<div id="topheader">
<a rel="nofollow" href="#">main</a>
</div>
<div id="navigation">
</div>
</div>
<div id="content">
<p id="whereami">
</p>
注册
<form th:action="@{/user/register}" method="post">
<table cellpadding="0" cellspacing="0" border="0" class="form_table">
<tr>
<td valign="middle" align="right">

線程、數據庫、算法、JVM、分布式、微服務、框架、Spring相關知識

基於springboot,阿裏P7親自講解_後端_02

一線互聯網P7面試集錦+各種大廠面試集錦

基於springboot,阿裏P7親自講解_Java_03

 CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】

學習筆記以及面試真題解析

基於springboot,阿裏P7親自講解_Java_04

版权声明:本文为[程序小茉莉]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210920041856451A.html