JavaWeb HTTP 基本认证(Basic Authentication)的示例代码(仅供学习)

JavaWeb HTTP 基本认证(Basic Authentication)的示例代码(仅供学习)

使用到的技术:JDBC ,Servlet,Tomcat
使用到的数据库:MySQL

  前台需要通过 JavaScript 或类似的脚本语言来获取用户提供的用户名和密码,并将其构造成基本认证的信息,然后发送到后台进行处理。

  以下是一个示例代码,展示了如何使用 JavaScript 获取用户提交的用户名和密码,并将其作为基本认证信息发送到后台:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>student</title>
</head>
<body>
<form id="loginForm" method="post">
    <label for="username">用户名:</label>
    <input type="text" id="username" name="username" required>
    <br>
    <label for="password">密码:</label>
    <input type="password" id="password" name="password" required>
    <br>
    <button type="button" onclick="submitForm()">登录</button>
</form>
<div id="result"></div>

<script>
    function submitForm() {
        debugger;
        var username = document.getElementById("username").value;
        var password = document.getElementById("password").value;

        var encodedUsername = encodeURIComponent(username);
        var encodedPassword = encodeURIComponent(password);

        // 构造认证信息
        var auth = btoa(encodeURIComponent(encodedUsername) + ":" + encodeURIComponent(encodedPassword));
        var authHeader = "Basic " + auth;

        // 发送认证请求
        var xhr = new XMLHttpRequest();
        xhr.open("GET", "/xmm/servlet/HelloWorldServlet");
        xhr.setRequestHeader("Authorization", authHeader);
        xhr.onreadystatechange = function() {
            if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
                // 登录成功,执行后续操作
                document.getElementById("result").textContent = xhr.responseText;
            } else if (xhr.readyState === XMLHttpRequest.DONE) {
                // 登录失败,显示错误信息
                document.getElementById("result").textContent = "登录失败:" + xhr.status;
            }
        };
        xhr.send();
    }
</script>

</body>
</html>
可以使用 Java 中的 Base64 类对包含用户名和密码的 Base64 字符串进行解码。
解析出了用户名和密码的字符串,可以进一步处理和使用这些值,例如进行身份验证或执行其他逻辑操作。
以下是一个示例代码,展示了如何解析用户名和密码,并进行基本的身份验证:
package com.dljd.studeyone;

import jakarta.servlet.ServletContext;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.sql.*;
import java.util.Base64;

public class HelloWorldServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {

        // 获取请求头中 Authorization 值
        String authorizationHeader = request.getHeader("Authorization");

        // 判断Authorization是否为空,以及是否以"Basic "开头
        if (authorizationHeader != null && authorizationHeader.startsWith("Basic ")) {

            // 解析Authorization中的身份验证信息
            String base64Credentials = authorizationHeader.substring("Basic ".length());
            byte[] credentialBytes = Base64.getDecoder().decode(base64Credentials);
            String credentials = new String(credentialBytes);

            // 解析账户和密码
            String[] parts = credentials.split(":");
            String encodedUsername = parts[0];
            String encodedPassword = parts[1];

            // 将 url 编码的用户名和密码解码
            String username = URLDecoder.decode(encodedUsername, StandardCharsets.UTF_8);
            username = URLDecoder.decode(username, StandardCharsets.UTF_8);
            String password = URLDecoder.decode(encodedPassword, StandardCharsets.UTF_8);

            // 调用身份验证逻辑,判断用户是否有效
            if (isValidUser(username, password)) {

                // 用户有效,向客户端返回"登录成功!"
                response.getWriter().write("登录成功!");
            } else {

                // 用户无效,向客户端返回"登陆失败!"
                response.getWriter().write("登陆失败!");
            }
        }
    }

    /**
     * 检查用户是否有效
     *
     * @param username 用户名
     * @param password 密码
     * @return 如果用户有效,返回true;否则返回false
     */
    private boolean isValidUser(String username, String password) {
        try (
                Connection connection = getConnection();
                PreparedStatement preparedStatement = createPreparedStatement(connection, username, password);
                ResultSet resultSet = preparedStatement.executeQuery()) {
            return resultSet.next(); // 如果结果集中有匹配的记录,则说明用户有效
        } catch (SQLException e) {
            e.printStackTrace();
            return false; // 发生异常时,默认返回 false
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取数据库连接
     *
     * @return 数据库连接对象
     * @throws SQLException 如果获取连接时发生异常
     */
    private Connection getConnection() throws SQLException, ClassNotFoundException {

        ServletContext servletContext = this.getServletContext();
        String className = servletContext.getInitParameter("className");
        String url = servletContext.getInitParameter("url");
        String user = servletContext.getInitParameter("user");
        String password = servletContext.getInitParameter("password");
        //注册驱动
        Class.forName(className);

        return DriverManager.getConnection(url, user, password);
    }


    /**
     * 创建预编译的 SQL 语句对象
     *
     * @param connection 数据库连接
     * @param username   用户名
     * @param password   密码
     * @return 预编译的 SQL 语句对象
     * @throws SQLException 如果创建预编译语句对象时发生异常
     */
    private PreparedStatement createPreparedStatement(Connection connection, String username, String password) throws SQLException {
        PreparedStatement preparedStatement = connection.prepareStatement("SELECT 1 FROM gspuser WHERE username = ? AND password = ?");
        preparedStatement.setString(1, username);
        preparedStatement.setString(2, password);
        return preparedStatement;
    }

}

效果展示
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用HTTP协议实现大媒体在线播放的JavaWeb代码示例: ```java import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MediaServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = request.getParameter("file"); String filePath = "/path/to/media/" + fileName; FileInputStream fileInputStream = new FileInputStream(filePath); BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); OutputStream outputStream = response.getOutputStream(); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream); response.setContentType("video/mp4"); response.setHeader("Content-Disposition", "inline; filename=" + fileName); byte[] buffer = new byte[8192]; int length; while ((length = bufferedInputStream.read(buffer)) > 0) { bufferedOutputStream.write(buffer, 0, length); } bufferedOutputStream.flush(); bufferedOutputStream.close(); bufferedInputStream.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } ``` 在上面的示例中,我们创建了一个名为 `MediaServlet` 的 servlet,用于处理客户端请求并提供视频文件的流式传输。当客户端请求该 servlet 时,servlet 会读取请求参数中指定的视频文件,并将其作为 HTTP 响应的一部分传输回客户端。在响应头中设置了 `Content-Type` 和 `Content-Disposition`,以便告知客户端响应的文件类型和文件名。 请注意,上述代码示例中的 `/path/to/media/` 应该被替换为实际存储视频文件的路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值