2021.4.2 HashMap

这个博客展示了如何在Java中创建并使用HashMap来存储硬币的面值及其名称。程序创建了一个HashMap,将整数(面值)作为键,字符串(硬币名称)作为值,并提供了插入数据和根据输入面值获取硬币名称的方法。

HashMap

实例

package 顺序容器.src.Program.HashMap;

import javax.swing.*;
import java.util.HashMap;
import java.util.Scanner;

public class HMtest {

    private  HashMap<Integer,String> coinget = new HashMap<>();

    public void Coinnn(){
        coinget.put(1,"penny");
        coinget.put(10,"dime");
        coinget.put(25,"quarter");
        coinget.put(50,"half-dollar");

    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        HMtest hMtest = new HMtest();
        hMtest.Coinnn();
        System.out.println(hMtest.Coin(num));
    }


    public String Coin(int num){
        return coinget.get(num);
    }
}



创建HashMap

private HashMap<前面数据类型,对应的需要输出的数据类型> 名称 = new HashMap<>();

向HashMap里面放入和取出数据

放入数据:

名称.put(前一个数据,后一个数据);

取出数据:

名称.get(前一个数据);

查看现在一共存有多少个数据

名称.keySet().size();

//把所有的key先做成集合后,再求长度

注意

HashMap可以直接输出

for each遍历HashMap

//假如key为int 第二个数据类型为String

for(Integer k : 名称.keySet() ){

​ String s = 名称.get(k);

​ System.out.println(s);

}

根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
<think>嗯,用户想在OAuth2 2.3.6和Spring Security 2021.0.9的环境下,用JWT生成token的代码实现。首先,我需要确认这些版本是否兼容,可能用户的项目使用的是较新的Spring Security版本,所以对应的OAuth2依赖可能需要调整。Spring Security在2021.0.x版本可能对应的是Spring Boot 2.6或更高版本,这时候可能需要使用Spring Security OAuth2的特定配置。 然后,用户提到JWT生成token,这需要配置JwtAccessTokenConverter和JwtTokenStore。可能需要检查相关的依赖,比如spring-security-jwt是否还适用,或者是否已经被Spring Security OAuth2 Server取代。因为在较新的版本中,Spring团队可能已经将OAuth2的支持迁移到Spring Security OAuth2 Authorization Server项目中,所以需要确认依赖是否正确。 接下来,配置AuthorizationServerConfigurerAdapter。这里需要重写configure方法,设置客户端详情、令牌服务以及端点配置。用户可能需要设置客户端ID、密钥、授权类型和作用域。同时,JwtAccessTokenConverter需要设置签名密钥,比如对称密钥HMAC或者非对称密钥对。用户可能需要生成一个合适的签名密钥,并确保资源服务器能够验证这个签名。 另外,引用中提到Redis整合,但用户的问题是关于JWT的,所以可能不需要Redis存储token,除非需要存储额外的用户信息。JWT本身是无状态的,所以令牌信息存储在token中,不需要Redis持久化。不过,用户认证时的用户信息可能需要从数据库加载,这里可能需要UserDetailsService的实现。 还要注意引用的内容中提到的客户端认证方式,比如Basic Auth使用client_id和client_secret,这部分在配置客户端详情时需要正确设置。代码示例中的@Configuration和@EnableAuthorizationServer注解是否正确应用,以及是否在Spring Boot的自动配置下正常工作。 可能还需要考虑令牌的有效期配置,比如accessTokenValiditySeconds,以及如何自定义JWT的claims,比如添加用户角色或其他信息。这部分可以通过自定义TokenEnhancer来实现,增强JWT的内容。 最后,测试生成token的请求是否符合预期,使用curl或Postman发送请求,检查返回的JWT结构是否正确,签名是否有效。同时,确保资源服务器配置了JwtTokenStore和相同的JwtAccessTokenConverter,以便正确解析token。 总结步骤:添加依赖、配置授权服务器、设置JWT转换器、定义客户端详情、实现用户认证,最后测试验证。需要确保所有配置与Spring Security和OAuth2的版本兼容,避免因版本问题导致的配置错误。</think>在Spring Security 2021.0.9(对应Spring Boot 2.6.x)和OAuth2 2.3.6环境下,JWT令牌生成的实现可分为以下步骤: ### 一、核心配置实现 #### 1. 添加依赖 ```xml <!-- Spring Security OAuth2 --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-jose</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-resource-server</artifactId> </dependency> <!-- JWT支持 --> <dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-jose-jwt</artifactId> <version>9.31</version> </dependency> ``` #### 2. 配置授权服务器 ```java @Configuration @EnableAuthorizationServer public class AuthServerConfig extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; @Autowired private UserDetailsService userDetailsService; @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient("app-client") .secret("{bcrypt}$2a$10$your_client_secret_hash") .authorizedGrantTypes("password", "refresh_token") .scopes("all") .accessTokenValiditySeconds(3600) .refreshTokenValiditySeconds(86400); } @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) { endpoints .authenticationManager(authenticationManager) .userDetailsService(userDetailsService) .tokenStore(tokenStore()) .accessTokenConverter(jwtAccessTokenConverter()); } @Bean public TokenStore tokenStore() { return new JwtTokenStore(jwtAccessTokenConverter()); } @Bean public JwtAccessTokenConverter jwtAccessTokenConverter() { JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); converter.setSigningKey("your-256-bit-secret"); // 对称密钥 return converter; } } ``` #### 3. 安全配置 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("admin") .password(passwordEncoder().encode("123456")) .roles("ADMIN"); } } ``` ### 二、令牌生成流程 1. **客户端认证**:使用Basic Auth传递client_id和client_secret[^3] 2. **用户认证**:Spring Security验证用户凭证[^2] 3. **令牌生成**:JwtAccessTokenConverter使用HS256算法生成包含标准声明(sub, exp等)的JWT 4. **响应返回**:返回格式示例 ```json { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "bearer", "expires_in": 3600, "scope": "all" } ``` ### 三、自定义JWT声明 通过TokenEnhancer增强令牌: ```java public class CustomTokenEnhancer implements TokenEnhancer { @Override public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken) accessToken; Map<String, Object> info = new HashMap<>(); info.put("organization", "example_org"); token.setAdditionalInformation(info); return token; } } // 在配置中添加 endpoints.tokenEnhancer(tokenEnhancerChain()); ``` ### 四、测试验证 使用CURL测试令牌获取: ```bash curl -X POST \ -u "app-client:client-secret-8888" \ -d "grant_type=password&username=admin&password=123456&scope=all" \ http://localhost:8080/oauth/token ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值