同样的base64直接在前端赋给img可以展示,但是后端接口返回后再赋给img不展示
时间: 2024-05-29 14:16:12 浏览: 11
这种情况可能是因为前端直接将 base64 字符串作为图片的 src 属性值进行赋值时,浏览器会自动解析该字符串并将其转换为图片进行展示。而在后端返回 base64 字符串时,需要将其设置为 img 标签的 src 属性值,但是此时需要确保该字符串是正确的 base64 编码格式,并且需要设置正确的 Content-Type 头信息,否则浏览器可能无法正确解析该字符串并将其转换为图片进行展示。你可以通过在后端设置正确的 Content-Type 头信息,或者使用第三方库进行 base64 编码转换来解决这个问题。
相关问题
写一个springboot后端使用easycaptcha生成验证码,以base64的形式传给前端登录页面,前端展示
1. 引入依赖
在pom.xml中添加以下依赖:
```
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>easy-captcha-spring-boot-starter</artifactId>
<version>2.4.4</version>
</dependency>
```
2. 配置参数
在application.properties或application.yml中添加以下配置:
```
# 验证码配置
easy.captcha.width=130 # 验证码宽度
easy.captcha.height=48 # 验证码高度
easy.captcha.length=4 # 验证码字符长度
easy.captcha.font-size=30 # 验证码字体大小
easy.captcha.expire=120 # 验证码有效期,单位秒
```
3. 生成验证码
在登录接口中生成验证码,代码如下:
```java
@RestController
public class LoginController {
@Autowired
private Producer captchaProducer;
@GetMapping("/captcha")
public Map<String, String> getCaptcha(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 生成验证码
String text = captchaProducer.createText();
BufferedImage image = captchaProducer.createImage(text);
// 将验证码转换成base64格式
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "png", bos);
byte[] bytes = bos.toByteArray();
String base64Img = "data:image/png;base64," + Base64.getEncoder().encodeToString(bytes);
// 将验证码存入session中
HttpSession session = request.getSession();
session.setAttribute("captcha", text);
// 返回结果
Map<String, String> result = new HashMap<>();
result.put("captcha", base64Img);
return result;
}
@PostMapping("/login")
public String login(HttpServletRequest request, @RequestParam String username, @RequestParam String password, @RequestParam String captcha) {
// 校验验证码
HttpSession session = request.getSession();
String captchaInSession = (String) session.getAttribute("captcha");
if (!captcha.equals(captchaInSession)) {
return "验证码错误";
}
// 校验用户名和密码
if ("admin".equals(username) && "123456".equals(password)) {
return "登录成功";
} else {
return "用户名或密码错误";
}
}
}
```
在getCaptcha方法中,首先使用captchaProducer.createText()方法生成验证码的文字,然后使用captchaProducer.createImage(text)方法生成验证码图片。接着,将验证码图片转换成base64格式,并将验证码文字存入session中,最后返回包含验证码图片的base64编码的结果。
在login方法中,先从session中获取验证码文字,然后与用户输入的验证码比较。如果一致,则校验用户名和密码,并返回登录结果。
4. 前端展示
在前端页面中,使用<img>标签展示验证码,代码如下:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form action="/login" method="post">
<div>
<label for="username">Username:</label>
<input type="text" name="username" id="username">
</div>
<div>
<label for="password">Password:</label>
<input type="password" name="password" id="password">
</div>
<div>
<label for="captcha">Captcha:</label>
<input type="text" name="captcha" id="captcha">
<img src="" id="captchaImg">
<a href="#" onclick="refreshCaptcha()">refresh</a>
</div>
<input type="submit" value="Login">
</form>
<script>
function refreshCaptcha() {
// 刷新验证码
var captchaImg = document.getElementById("captchaImg");
var url = "/captcha?" + new Date().getTime();
fetch(url).then(function (response) {
return response.json();
}).then(function (data) {
captchaImg.src = data.captcha;
});
}
// 页面加载时刷新验证码
window.onload = function () {
refreshCaptcha();
};
</script>
</body>
</html>
```
在页面加载时,使用fetch方法调用/captcha接口获取验证码图片的base64编码,并将其设置为<img>标签的src属性。当点击刷新链接时,再次调用/captcha接口获取新的验证码图片,并刷新<img>标签的src属性。在提交表单时,将用户输入的验证码一并提交给后端进行校验。
这样,就完成了使用easycaptcha生成验证码,并将其以base64格式传给前端登录页面的后端代码和前端代码。
springboot项目中后端生成的验证码如何以base64编码的形式传给前端并在前端显示
可以使用Java的Base64编码器将验证码转换为Base64编码的字符串,然后将其作为JSON响应发送到前端。在前端,可以使用JavaScript的atob()函数将Base64编码的字符串解码,并将其显示在图像元素中。
以下是一个示例代码片段,用于将Java中生成的验证码编码为Base64字符串并将其发送到前端:
```java
@RestController
public class CaptchaController {
@Autowired
private CaptchaService captchaService;
@PostMapping("/captcha")
public ResponseEntity<Map<String, String>> generateCaptcha() {
BufferedImage image = captchaService.generateCaptcha();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ImageIO.write(image, "png", baos);
} catch (IOException e) {
e.printStackTrace();
}
byte[] bytes = baos.toByteArray();
String base64 = Base64.getEncoder().encodeToString(bytes);
Map<String, String> response = new HashMap<>();
response.put("captcha", base64);
return ResponseEntity.ok(response);
}
}
```
在前端,可以使用以下代码将Base64编码的字符串解码并将其显示在图像元素中:
```javascript
fetch('/captcha', {
method: 'POST'
})
.then(response => response.json())
.then(data => {
const captchaImg = document.createElement('img');
captchaImg.src = 'data:image/png;base64,' + data.captcha;
document.body.appendChild(captchaImg);
});
```
在这个示例中,我们从后端获取Base64编码的验证码,并将其设置为图像元素的源。由于图像元素需要一个URL作为源,我们需要使用"data" URL格式,并在Base64编码的字符串之前添加"data:image/png;base64,"前缀。