Java Token在HTTP请求头的Authorization中的设置

在开发Web应用程序时,我们经常需要对接口进行权限验证,以确保只有具有合法访问权限的用户可以访问受保护的资源。一种常见的做法是使用令牌(Token)进行身份验证。本文将介绍如何使用Java Token并将其设置在HTTP请求头的Authorization中。

什么是Java Token

Java Token是一种用于身份验证和授权的字符串,它包含了用户的身份信息以及其他相关的权限信息。Java Token通常由服务器生成,并在用户进行登录验证成功后返回给客户端。客户端在后续的请求中携带Token,以证明其身份和权限。

Token的设置与获取

以下是一个简单的示例代码,展示了在Java中如何设置和获取Token:

public class TokenUtils {
    private static final String SECRET_KEY = "mySecretKey";

    public static String generateToken(String username) {
        Date expirationDate = new Date(System.currentTimeMillis() + 24 * 60 * 60 * 1000); // Token有效期为24小时
        return Jwts.builder()
                .setSubject(username)
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }

    public static String getUsernameFromToken(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
        return claims.getSubject();
    }
}

上述代码使用了jjwt库来生成和解析Token。在generateToken方法中,我们设置了Token的主题为用户名,并指定了Token的过期时间为当前时间加上24小时。在实际应用中,可以根据需求自定义Token中包含的信息。在getUsernameFromToken方法中,我们通过解析Token获取到用户名。

将Token设置在HTTP请求头的Authorization中

为了在HTTP请求中使用Token进行身份验证,我们需要将Token设置在请求头的Authorization字段中。以下是一个示例代码,展示了如何将Token设置在HTTP请求头中:

public class HttpClientUtils {
    public static void sendRequest(String url, String token) {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("Authorization", "Bearer " + token)
                .build();

        try {
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            System.out.println(response.body());
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

上述代码中的sendRequest方法用于发送HTTP请求。我们使用HttpClient类来发送请求,并在HttpRequest中设置了URI和Authorization头部字段。其中,Token前面的"Bearer "是一种常见的前缀,用于指定Token的类型。

使用Token进行身份验证

服务端在接收到带有Token的HTTP请求后,需要对Token进行验证以确保其合法性。以下是一个简单的示例代码,展示了如何使用Token进行身份验证:

public class AuthenticationFilter implements Filter {
    private static final String SECRET_KEY = "mySecretKey";

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String token = request.getHeader("Authorization");

        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7); // 去除前缀"Bearer "
            try {
                String username = TokenUtils.getUsernameFromToken(token);
                // 根据用户名进行身份验证
                if (authenticateUser(username)) {
                    filterChain.doFilter(servletRequest, servletResponse);
                } else {
                    HttpServletResponse response = (HttpServletResponse) servletResponse;
                    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                }
            } catch (Exception e) {
                HttpServletResponse response = (HttpServletResponse) servletResponse;
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            }
        } else {
            HttpServletResponse response = (HttpServletResponse) servletResponse;
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        }
    }

    private boolean authenticateUser(String username) {
        // 进行身份验证逻辑,验证成功返回true,否则返回false
    }
}

上述代码是一个基于Servlet的身份验证过滤器,使用AuthenticationFilter类继承自Filter接口。在doFilter方法中,我们首先通过request.getHeader方法获取到请求头中的Authorization字段。然后,我们根