Spring Security 、OAuth2.0 、JWT、Dubbo和Swagger2集成 和使用说明

Dubbo整合Spring security 一.初谈认证 作为web系统肯定少不了登录环节,和spring整合过程中大都通过拦截器来实现,无论是mvc自带的在xml文件中的配置拦截路径;或者与本期“主人公”平分秋色的shiro;框架只是给我们提供了一种简单的实现方式,提高我们的开发速度;但是设计还是我们开发人员需要做的;比如用户-角色-权限表的相关设计;拦截机制和具体加密实现! 二.代码实现 1.web.xml <?xml versi... 阅读详情

1、Spring Security

1.1 框架介绍

Spring Security,这是一种基于 Spring AOP 和 Servlet 过滤器的安全框架。它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权。

1.2 配置说明

1.2.1 maven 集成

<!-- ==========security dependency ==============-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

1.2.2 WebSecurityConfig

@Configuration
@EnableWebSecurity  //开启WebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	/**
	* 自定义用户服务类,用于用户名、密码校验,权限获取
	*/
    @Resource(name = "userDetailsService")
    private UserDetailsService userDetailsService;

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    /**
     * 安全拦截机制
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .requestMatchers().anyRequest()
                .and()
                .authorizeRequests()
                .antMatchers("/oauth/**").permitAll() //oauth下的所有方法,无须认证
                .and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler());
    }


    /**
     * 密码加密策略
     * @return
     */
    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

1.2.3 UserServiceImpl

自定义用户服务类,继承UserDetailsService,重写loadUserByUsername 方法,根据自身业务修改代码

@Service(value = "userDetailsService")
public class UserServiceImpl implements UserDetailsService {

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		// 这里需要写根据用户名查询用户逻辑。。。。。。
		UserDTO user = new UserDTO();
        user.setUserId("1");
        user.setUsername("admin");
        user.setMobile("188103956897");
        user.setStatus(6);

        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
        UserDTO userDTO = new UserDTO();
        // 为了增强jwt令牌内容,可以将整个对象转json存放到username中
        userDTO.setUsername(JSON.toJSONString(user));
//        userDTO.setUsername("admin");
        userDTO.setPassword(bCryptPasswordEncoder.encode("123"));

        return userDTO;
    }

}

1.2.4 UserDTO

配合UserServiceImpl使用,返回用户对象

@Getter
@Setter
public class UserDTO implements UserDetails {
    private String userId;
    private String username;
    private String password;
    private String mobile;
    private String realName;
    private String companyId;
    private Integer status;


    public UserDTO() {

    }

    public UserDTO(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

2、OAuth2.0

2.1 框架介绍

​ OAuth 2.0是目前最流行的授权机制,用来授权第三方应用,获取用户数据。

​ 允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容

2.1.1 四种授权方式

  • 授权码(authorization-code)

    常用遇到的场景就是其他软件登录的时候,不想注册账户,可以选择用QQ、微信等方式进行登录,这个时候不需要输入账户、密码。而是需要扫描,在QQ或者微信中进行确认即可

    是最复杂、最安全的授权方式

    1、先获取授权码

    2、根据授权码再去申请token

  • 简化模式(implicit)

    常用于单页面应用,没有复杂的后台,直接通过url形式获取token

  • 密码式(password)

    常用于内部系统,完全可以信任的情况,根据用户名、密码获取token

  • 客户端凭证(client credentials)

    最简单最不安全的方式,根据客户端id、授权密码就可以获取token

2.1.2 JWT令牌

JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简介的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公 钥/私钥对来签名,防止被篡改

  • 优点

1、jwt基于json,非常方便解析。
2、可以在令牌中自定义丰富的内容,易扩展。
3、通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。
4、资源服务使用JWT可不依赖认证服务即可完成授权。

  • 缺点

1、JWT令牌较长,占存储空间比较大。

2.2 配置说明

2.2.1 maven 集成

<!-- ==========security-oauth2 dependency ==============-->
<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
	<version>2.3.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-jwt</artifactId>
    <version>1.1.0.RELEASE</version>
</dependency>

2.2.2 授权服务配置

/**
 * 开启授权服务器
 */
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

    /**
     * 指定哪些资源是需要授权验证的
     */
    private static final String RESOURCE_ID = "ALL";

    /**
     * 设置jwt加密key
     */
    private static final String JWT_SIGNING_KEY = "jwt_MC43A6m0Xt9jUIV";

    /**
     * 认证方式
     */
    @Autowired
    private AuthenticationManager authenticationManager;

    /**
     * 自定义用户服务
     */
    @Resource(name = "userDetailsService")
    private UserDetailsService userDetailsService;

//    @Autowired
//    private CustomWebResponseExceptionTranslator customWebResponseExceptionTranslator;


    /**
     * 配置客户端对应授权方式及客户端密码
     * 当前使用内存模式
     * @param configurer
     * @throws Exception
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer configurer) throws Exception {
        // 用 BCrypt 对密码编码
        String secret = new BCryptPasswordEncoder().encode("MC43A6m0Xt9jUIV");  
        //配置1个客户端,一个用于password认证
        configurer.inMemory()  // 使用in-memory存储
                .withClient("weixin")    //client_id用来标识客户的Id  客户端1
                .resourceIds(RESOURCE_ID)
                .authorizedGrantTypes("password", "refresh_token")  //允许授权类型   密码授权模式
                .scopes("read","write")  //允许授权范围
                .authorities("oauth2")  //客户端可以使用的权限
                .secret(secret)  //secret客户端安全码
                .accessTokenValiditySeconds(1*60*60)     //token 时间秒
                .refreshTokenValiditySeconds(6*60*60); //刷新token 时间 秒
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore())
                .authenticationManager(authenticationManager)
                .accessTokenConverter(accessTokenConverter())
                .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)  //支持GET  POST  请求获取token
                .userDetailsService(userDetailsService) //必须注入userDetailsService否则根据refresh_token无法加载用户信息
//                .exceptionTranslator(customWebResponseExceptionTranslator)
                .reuseRefreshTokens(true);  //开启刷新token
    }


    /**
     * 认证服务器的安全配置
     *
     * @param security
     * @throws Exception
     */
    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security
                .tokenKeyAccess("permitAll()")
                .checkTokenAccess("isAuthenticated()") //isAuthenticated():排除anonymous   isFullyAuthenticated():排除anonymous以及remember-me
                .allowFormAuthenticationForClients();  //允许表单认证
    }

	
	/**
	* jwt令牌增强,添加加密key
	*/
    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey(JWT_SIGNING_KEY);
        return converter;
    }

    /**
     * 使用JWT存储令牌信息
     * @return
     */
    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

	/**
	* token认证服务
	*/
    @Bean
    public ResourceServerTokenServices tokenService() {
    	// 授权服务和资源服务在统一项目内,可以使用本地认证方式,如果再不同工程,需要使用远程认证方式
        DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setTokenStore(tokenStore());
        defaultTokenServices.setSupportRefreshToken(true);
        return defaultTokenServices;
    }

}

2.2.3 资源服务配置

/**
 * 资源服务器配置
 */
@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    private static final String RESOURCE_ID = "ALL";

    @Autowired
    private ResourceServerTokenServices tokenServices;

//    @Autowired
//    private LogoutSuccessHandler customLogoutSuccessHandler;
//    @Autowired
//    private CustomAuthenticationEntryPoint customAuthenticationEntryPoint;


    /**
     * 验证令牌配置
     * RESOURCE_ID 必须和授权服务器中保持一致
     * @param config
     */
    @Override
    public void configure(ResourceServerSecurityConfigurer config) {
        config.resourceId(RESOURCE_ID)
                .tokenServices(tokenServices)
                .stateless(true);
    }


    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/users/**").authenticated() //配置users访问控制,必须认证过后才可以访问
                .antMatchers("/test/**").permitAll() //配置test无须认证,可以匿名访问
                .anyRequest().authenticated();
//                .and()
//                .exceptionHandling().authenticationEntryPoint(customAuthenticationEntryPoint)  //认证失败的业务处理
//                .and()
//                .logout()
//                .logoutUrl("/oauth/logout")
//                .logoutSuccessHandler(customLogoutSuccessHandler);   //退出成功的业务处理
    }

//    @Bean
//    public LogoutSuccessHandler customLogoutSuccessHandler(){
//        return new CustomLogoutSuccessHandler();
//    }

//    @Bean
//    public AuthenticationEntryPoint customAuthenticationEntryPoint(){
//        return new CustomAuthenticationEntryPoint();
//    }




}

2.2.3 SystemController

import com.akm.security.security.model.UserDTO;
import com.alibaba.fastjson.JSON;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class SystemController {

	/**
	* 访问时,需要携带token,进行认证
	*/
    @GetMapping("/user/list")
    public List<UserDTO> getUser(){
        List<UserDTO> users = new ArrayList<>();
        users.add(new UserDTO("张三","123456"));
        users.add(new UserDTO("李四","123456"));
        users.add(new UserDTO("张五","123456"));
        return users;
    }

	/**
	* 支持匿名访问,无须携带token
	*/
    @GetMapping("/test/list")
    public List<UserDTO> getTestUser(){
        List<UserDTO> users = new ArrayList<>();
        users.add(new UserDTO("张三","123456"));
        users.add(new UserDTO("李四","123456"));
        users.add(new UserDTO("张五","123456"));
        return users;
    }

    /**
     * 获取当前登录用户信息
     *
     * @param authentication
     * @return
     */
    @RequestMapping("/info")
    public Object info(OAuth2Authentication authentication) {
        // 需要配合UserServiceImpl--》userDTO.setUsername(JSON.toJSONString(user))使用
        UserDTO ddo = JSON.parseObject(authentication.getPrincipal().toString(),UserDTO.class);

        // SecurityContextHolder 和 OAuth2Authentication都可以获取当前用户信息
        Authentication auth =  SecurityContextHolder.getContext().getAuthentication();
        return "获取到了用户资源:"+ddo.getUsername()+"------"+ddo.getUsername()+"----"+ddo.getMobile();
    }

}

3.3 使用说明

访问方法时,可以使用postman进行接口访问

3.3.1 获取token

访问URL:post形式访问

http://localhost:8081/oauth/token

携带参数:要和AuthorizationServerConfiguration–》configurer.inMemory() 中设置的参数对应上

client_id–》客户端id client_secret–>客户端密码 grant_type–》认证方式,password为密码方式

username–》用户名 password–》密码

client_id: weixin
client_secret: MC43A6m0Xt9jUIV
grant_type: password
username: admin
password: 123

3.3.2 刷新token

刷新token,是指已经获取到token、refresh_token

访问URL:post形式访问

http://localhost:8081/oauth/token

携带参数:

client_id–》客户端id client_secret–>客户端密码 grant_type–》refresh_token

refresh_token–》获取token时,返回的refresh_token值

client_id: weixin
client_secret: MC43A6m0Xt9jUIV
grant_type: refresh_token
refresh_token : xxxxxxxxxxxxxxxxxxxxxxxxxxxx

3.3.3 携带token,请求资源

客户端获取到token时,访问需要验证的资源时,需要在headers中携带参数

访问URL:

http://localhost:8081/server/user/list

携带参数:

Authorization —》固定参数,对应参数为token

bearer —》token传递策略

Authorization: bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

3、Dubbo

3.1 框架介绍

Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

3.1.1 注册中心介绍

Multicast 注册中心
Zookeeper 注册中心(推荐使用)
Nacos 注册中心 (阿里开源组件,阿里内部使用)
Redis 注册中心
Simple 注册中心

3.2 配置说明

3.2.1 maven 集成

<!-- dubbo 集成 -->
<dependency>
    <groupId>com.alibaba.spring.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>
<!-- zookeeper 连接 -->
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.10</version>
</dependency>
<!-- nacos 连接 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo-registry-nacos</artifactId>
    <version>2.6.7</version>
</dependency>

3.2.3 服务提供端配置

application.properties

server.port=8888

dubbo.application.name=dubbo-user
# 组网形式
#dubbo.registry.address=multicast://224.5.6.7:1234
# zookeeper 注册中心
#dubbo.registry.address=zookeeper://127.0.0.1:2181
# nacos 注册中心
dubbo.registry.address=nacos://127.0.0.1:8848
# 简单注册中心
#dubbo.registry.address=127.0.0.1:9090
# 直连形式
#dubbo.registry.address=N/A

# 对外开放接口
dubbo.protocol.name=dubbo
dubbo.protocol.host=192.168.1.11
dubbo.protocol.port=20888

3.2.2 服务消费端配置

application.properties

server.port=9999

dubbo.application.name=dubbo-page
# 组网形式(多网卡或者开启虚拟机网卡时,容易出现问题)
#dubbo.registry.address=multicast://224.5.6.7:1234
# zookeeper 注册中心
#dubbo.registry.address=zookeeper://127.0.0.1:2181
# nacos 注册中心
dubbo.registry.address=nacos://127.0.0.1:8848
# 简单注册中心
#dubbo.registry.address=127.0.0.1:9090
# 直连形式
#dubbo.registry.address=N/A

3.3 使用说明

3.3.1 公共API接口

使用dubbo框架的时候,需要将提供服务的接口提取到公共API工程中,消费端也需要引用API工程

接口和引用的Bean都要保持一致

UserService

public interface UserService {

    /**
     * 根据ID查询用户信息
     * @param user
     * @return
     */
    public String getUserById(User user);
}

User

public class User implements Serializable {

    private String id;

    private String name;

    public User() {

    }

    public User(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3.3.2 服务提供者

UserServiceImpl,@Service将UserServiceImpl对外发布

import com.akm.dubbo.api.service.UserService;
import com.akm.dubbo.api.bean.User;
import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 将UserServiceImpl交给dubbo管理
 */
@Component
@Service
public class UserServiceImpl implements UserService {

    /**
     * 根据ID查询用户信息
     * @param user
     * @return
     */
    @Override
    public String getUserById(User user) {
        List<User> list = new ArrayList<>();
        list.add(new User("1","张三"));
        list.add(new User("2","李四"));
        System.out.println(JSON.toJSONString(user));
        System.out.println(JSON.toJSONString(list));
        return "用户ID:"+user.getId();
    }
}

DubboUserApplication ,@EnableDubbo 开启Dubbo

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableDubbo
@SpringBootApplication
public class DubboUserApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboUserApplication.class, args);
        System.out.println("dubbo 服务提供者启动成功************");
    }

}

3.3.3 服务消费者

PageController

@Reference 注解会自动将远程dubbo中的userService类进行注入

import com.akm.dubbo.api.bean.User;
import com.akm.dubbo.api.service.UserService;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PageController {

    @Reference(check = false) //,url = "dubbo://127.0.0.1:20888"
     UserService userService;

    @GetMapping("/user")
    public String getUser(){
        User user = new User("123456","这就是duboo");
        userService.getUserById(user);
        return "这就是用户信息";
    }

}

DubboPageApplication , @EnableDubbo开启Dubbo功能

@EnableDubbo
@SpringBootApplication
public class DubboPageApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboPageApplication.class, args);
        System.out.println("Duboo 服务消费者启动成功************");
    }

}

4、Swagger2

4.1 框架介绍

Swagger2 是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的web服务 ,可以通过在类、方法上添加注解的形式,生成在线API。节省了很多前后端接口沟通的时间!

4.2 配置说明

4.2.1 maven 集成

<!-- ==========Swagger2 dependency ==============-->
<dependencies>
<!--导入Swagger2-->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>${swagger.version}</version>
    </dependency>
    <!--导入Swagger ui-->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>${swagger.version}</version>
    </dependency>
 </dependencies>

4.2.2 开启Swagger配置,AcmeSwagger2Config

@Configuration
@EnableSwagger2 // 开启Swagger
@Profile("dev") // 只有在dev开发状态,才对外开启api功能
public class AcmeSwagger2Config {
    @Bean
    public Docket createRestApi(Environment environment){

//           // 设置要显示Swagger的环境:开发环境、测试环境
//           Profiles profiles= Profiles.of("dev","test");
//          //获取项目的环境,判断是否处在自己设定的环境当中
//           boolean enalbeFlag= environment.acceptsProfiles(profiles);

        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
//                .enable(true)
                .select()
                // 所有ApiOperation注解的方法,生成接口文档
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("物联网基础平台")
                .description("物联网基础平台 API 文档")
                .termsOfServiceUrl("http://localhost:8080")
                .version("1.0")
                .build();
    }
}

4.2.3 增加配置类AcmeSwaggerAutoConfiguration为swagger建立新的静态文件路径映射

/**
 * 为swagger建立新的静态文件路径映射
 */
@Configuration
public class AcmeSwaggerAutoConfiguration extends WebMvcConfigurerAdapter {
    /**
     * 因为swagger-ui.html 是在springfox-swagger-ui.jar里的,
     * 修改了路径后,Spring Boot不会自动把/swagger-ui.html这个路径映射到对应的目录META-INF/resources/下面,
     * 所以需要修改springboot配置类,为swagger建立新的静态文件路径映射就可以了
     * @param registry
     */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("swagger-ui.html")
                    .addResourceLocations("classpath:/META-INF/resources/");
            registry.addResourceHandler("/webjars/**")
                    .addResourceLocations("classpath:/META-INF/resources/webjars/");

        }
}

4.3 使用说明

4.3.1 Controller使用说明

类上使用注解 @Api(tags = “Hello控制类”)
方法上使用注解 @ApiOperation(“hello测试”)

@Api(tags = "Hello控制类")
@RestController
@RequestMapping("/server")
public class HelloController {

    @ApiOperation("hello测试")
    @ResponseBody
    @GetMapping(value="/hello")
    public String hello(){
        return "测试Swagger";
    }
}

4.3.2 实体类使用说明

实体类使用注解@ApiModel(“用户实体类”)
实例类中的属性使用注解@ApiModelProperty(“用户名”)

@ApiModel("用户实体类")
public class User {

    @ApiModelProperty("用户名")
    public String username;

    @ApiModelProperty("密码")
    public String password;
}
Qwen3.6-Plus编程AI实战:工程化能力深度解析 编程AI已从基础代码补全迈向真实开发流程嵌入,其核心价值在于对开发上下文、工程约束与中文技术生态的深度建模。不同于通用大模型依赖参数规模,Qwen3.6-Plus通过AST+控制流图联合表征、动态上下文裁剪和国产框架约定学习,显著提升单元测试生成、IDE智能补全与Code Review建议的准确率与落地性。它不追求长文本推理极限,而专注在VS Code插件、CLI工具链和团队规范适配等工程环节实现‘可验证、可复现、可嵌入’——尤其在Spring Boot、Dubbo、钉钉SDK等国内主流技术栈中展现出对中文 阅读详情

相关推荐

SpringBoot与微服务实践系列教程(专栏导航)

该教程全面讲解SpringBoot的配置、数据访问、日志处理、Web使用、缓存、消息队列、微服务实践,包括Spring Cloud和Spring Cloud Alibaba,还涵盖单点登录、OAuth2.0、Elasticsearch和任务调度等内容,适合初学者和进阶者。

Nicky's blog 7199

实战电商后端系统(一)—— 项目搭建以及Dubbo+SpringBoot+Oauth2+Swagger2的集成

前言 本系统技术栈用到了Dubbo、Zookeeper、SpringBoot、Oauth2、Swagger、Nginx,项目刚开始起步,没完成一个大功能都会专门写一篇博文来记录技术细节以及遇到的技术难点,如项目中有哪些设计或者架构不太正确的地方,请大家在留言区中提出,互相学习~ 光学习理论源码不动手实践是不得行的,阅读底层源码能力上来了,编码工程能力也要齐头并进!! 正文 1. 项目工程目录介绍 先声明下版本: SpringBoot: 2.1.14.RELEASE Dubbo: 2.6.2 Zookeepe

你要悄悄的拔尖,然后惊艳所有人 1909

《一步步搭建Springboot+zk+dubbo分布式微服务博客》之实战篇25:整合springsecurity安全框架2security配置(version24)

《一步步搭建Springboot+zk+dubbo分布式微服务博客》之实战篇25:整合springsecurity安全框架2security配置(version24) ======webSecurityConfig ============ package org.it123.sdubbo.web.security; import org.springframework.beans.facto...

mastudy老师 644

SpringBoot+OAuth2+Spring Security+Redis+mybatis-plus+mysql+swagger搭建实现

SpringBoot+OAuth2+Spring Security+Redis+mybatis-plus+mysql+swagger搭建实现

lucky_fang的博客 5182

Wireshark 4.6 TCP 流图解析:3种拥塞控制算法可视化对比

本文深入解析Wireshark 4.6的TCP流图功能,通过可视化对比Reno、Cubic和BBR三种主流拥塞控制算法的性能特征。文章提供详细的实验环境搭建方法、流图分析工具使用技巧,以及算法调优建议,帮助网络工程师优化TCP性能。

weixin_29291573的博客 446

3.1 计算机视觉的发展和卷积神经网络概要(百度架构师手把手带你零基础实践深度学习原版笔记系列)

3.1 计算机视觉的发展和卷积神经网络(百度架构师手把手带你零基础实践深度学习原版笔记系列) 概要 计算机视觉作为一门让机器学会如何去“看”的科学学科,具体的说,就是让机器去识别摄像机拍摄的图片或视频中的物体,检测出物体所在的位置,并对目标物体进行跟踪,从而理解并描述出图片或视频里的场景和故事,以此来模拟人脑视觉系统。因此,计算机视觉也通常被叫做机器视觉,其目的是建立能够从图像或者视频中“感知”信息的人工系统。 计算机视觉技术经过几十年的发展,已经在交通(车牌识别、道路违章抓拍)、安防(人脸闸机.

aiAI 691

Springboot - dubbo整合Security框架与CAS单点登录

一、项目源码: 1、dubbo-provider (生产者) https://github.com/Vmetrio/dubbo-provider 2、dubbo-consumer (消费者) https://github.com/Vmetrio/dubbo-consumer.git git之后,在配置文件中,修改注册中心的IP,注册中心用的是zookeeper 3、dubbo-admi...

孟孟的博客 2529

当AI换脸遇上内容审核:Facefusion NSFW检测的技术伦理与用户自主权之争

本文探讨了Facefusion开源AI换脸工具中NSFW检测机制的技术伦理困境与用户自主权之争。分析了其多层次防御机制的技术实现与社区规避方法,揭示了开源软件在安全与自由之间的平衡难题,并提出了分层权限设计等社区实践方案。

weixin_29165725的博客 687

SpringSecurity------WebSecurityConfiguration配置类

简单的说,这个类的作用就是用来创建FilterChainProxy,FilterChainProxy是一个Servlet Filter,他是一组SecurityFilterChain的代理,用于管理这些SecurityFilterChain。这个方法是接口ImportAware的方法,当前配置类是通过@EnableWebSecurity注解上的@Import注解引入的,实现该接口的方法使得当前配置类可以获取到@EnableWebSecurity的debug属性值。

ywb201314的专栏 2144

Prometheus常用配置介绍

除了 scrape_configs 外,上部还有 global 和 rule_files 部分, 其中 global 中 是 全 局 参 数 , scrape_interval 指 定 全 局 默 认 的 时 间 间 隔 , evaluation_interval 指定告警规则校验的时间间隔,rule_files 指定了告警规 则文件的位置名称。• annotations(注释):它们被用于存储更长的其他信息,例如警报描述 或者链接,注释值也可以被模板化。• alert:告警的名称。

weixin_42886699的博客 2260

【Rcode】生存分析: KM & COX回归& 随机森林& nomogram

本文使用了R——survival包下的lung数据进行方法测试: 1)KM 2) Cox回归:多因素 3)随机森林因子(根据cox回归结果) 4)nomogram ( 根据cox回归结果,建立了中位生存时间,1年5年生存率的概率计算) -------------------????????‍♀️本文只有干货,非常干!????----------------------------- 一、数据加载 #生存分析 library("survival") library("survminer") data("

weixin_43172152的博客 9273

Qwen3.6-Plus:面向工程落地的国产编程模型深度解析

编程辅助模型正从‘代码补全’迈向‘工程意图理解’——这一技术演进本质是将大模型能力与真实开发场景深度耦合。其核心原理在于上下文感知增强、AST-aware语义建模与可验证代码契约机制,显著提升生成代码的可维护性、安全性与风格一致性。技术价值不仅体现为效率跃升,更在于降低工程决策成本、缩短PR评审周期、强化合规边界控制。典型应用场景覆盖IDE实时辅助、CI/CD智能守门、遗留系统现代化重构及多语言客户端自动生成。本文聚焦Qwen3.6-Plus这一国产编程模型在上下文感知与工程化落地方面的实践突破,解析其如何

weixin_30530939的博客 358

String+CytoScape构建PPI网络

1.下载CytoScape Cytoscape是一款专业强大好用的物生信息分析软件,主要达用于专业的研究人员使用,软件主要适用于整合模块化网络和生物科学联系网络图的绘制,支持多种文件格式,导入后就可以直接进行编辑或者分析等操作了,除此之外,软件还提供了强大的编辑工具,支持添加相应的注释信息,软件基于java环境组件打造。 下载地址:https://cytoscape.org/ 因为软件基于java...

xiaobai1_1的博客 1万+

前后端开发全解析:从核心职责到协作实践

在软件开发领域,前后端分离架构是构建现代Web应用的核心模式。其原理在于通过定义清晰的API契约,将用户界面(前端)与业务逻辑及数据服务(后端)解耦,实现独立开发与部署。这种模式的技术价值在于提升了开发效率、系统可维护性和团队协作的流畅度。在实际应用场景中,前端作为用户体验的最终交付者,专注于利用React、Vue等框架处理界面渲染、状态管理和性能优化;后端则作为业务逻辑与数据安全的守护者,负责实现API接口、数据库操作以及系统安全。随着云原生和Serverless等技术的发展,两者的边界虽在模糊,但通过B

weixin_34117211的博客 402

利用R语言通过holtwinters模型进行预测

使用Holt-Winters模型进行预测的第一步是对模型进行拟合。该函数需要两个参数:您的时间序列数据和一个“seasonal”参数,该参数指示您的数据的周期性(例如,如果您的数据按月记录,则应将“seasonal”参数设置为12,因为一年有12个月)。拟合模型后,您可以使用“forecast()”函数进行预测。该函数需要两个参数:您的拟合模型以及您要进行预测的时间段的长度。要使用Holt-Winters模型,您需要安装并加载“forecast”包。以下是进行Holt-Winters模型预测的示例代码。

Mrrunsen的博客 1696

基于matlab实现的水果识别系统设计

本项目针对多种常见水果混合的图像,利用 Matlab 软件,对水果的识别进行研究。根据水果和背景的差别选取阈值,对去噪增强对比度后的图像进行二值化处理。再对图像进行边缘检测,选定连通区域,标记后再对不同种水果的颜色,形状,大小等特征进行快速识别水果,从而实现对水果的正确分拣。:水果识别、MATLAB、数字图像处理。

热情、奔放、快乐编程! 4854

资深 Java 工程师与架构师知识体系全景图

服务暴露、寻址、网络传输与动态代理;发布订阅与点对点模式对比。: 缓存穿透、击穿、雪崩的成因与治理方案;: String、Hash、List、Set、ZSet 底层编码与结构;: Nacos、Eureka、Consul、Apollo / Spring Cloud Config 架构对比;: 数组、链表、栈、队列、哈希表底层实现;红黑树、平衡二叉树、B 树、B+树特征与应用场景;

qq_23277595的博客 384

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

spring security 权限动态管理

前言 相信每天工作都要用spring框架的大家一定使用过spring security,security的概念是权限管控,且管控级别可以到达最小颗粒也就是功能管控,相对与shiro的权限管控机制,它更灵活可扩展方法也更多,当然这也是Spring官方推荐的权限管控光甲,security更关注的是访问地址与用户的权限是否一致,从而达到灵活去验证权限相关功能,更好的实现灵活配置,比如说一个大型系统中功能管理,菜单管理,前端可视化权限管理等等,都是各个模块都需要的操作,那样代表着这些操作会散落在系统的各...

qq_37753687的博客 1139

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring Security Config : WebSecurityConfiguration Web 安全配置

package org.springframework.security.config.annotation.web.configuration; // 忽略 import 行 /** * Spring Security 的配置类 : * 1. 使用一个 WebSecurity 对象创建执行 Spring Security 基于web的安全任务的 FilterChainProxy 对象。...

Details Inside Spring 5250

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

dubbo 购物平台搭建笔记(三)基于Security实现系统登录与安全控制

第一部分:初步认识security web.xml中配置springSecurity的入口,是通过spring的代理实现的拦截 &lt;!--springSecurity 的入口,通过spring的代理实现对访问的拦截--&gt; &lt;filter&gt; &lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name...

SmileTimLi的博客 1465

swagger文档配置

swagger文档在springboot项目中使用已经非常广泛,作为api接口管理工具 使用起来也很简单,只需要简单配置一下,就可以生成文档管理页面,在页面上管理查看api接口文档,以及进行接口调试等 配置示例 首先引入knife4j依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <...

小蜜蜂1010的博客 1155

dubbo中使用security4.1

dubbo中使用security4.1 一---------------->登录 spring-security.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security"...

Mr_Li的博客 469

对OAuth2的一点理解

对OAuth2的一点理解

Code In Life 2936

SpringSecurityOAuth2(8) swagger2 集成OAuth2

GitHub地址 码云地址 swagger是一款优雅的接口api展示工具,在这里我们具体不展开讲解,有兴趣的自行百度。 该篇文章主要讲解的是如何集成OAuth2的验证即在请求中添加token,验证接口是否具有权限。 方式一:在每个请求上加一个Authorization 窗口自己手动输入toke...

1677

Spring原生Rpc六种实现的正确打开方式

前言 在java生态圈谈到Rpc,很多人可能就会想到Dubbo、Motan、Grpc等框架。但是你知道吗?作为Java编程全家桶的Spring已经内置了多种RPC的实现方式,可以直接使用。存在即合理,有些场景下其实并不需要Dubbo,Grpc等重量级的RPC组件,那么Spring的轻量封装就可以派上用场了。下面就来探索下Spring中的RPC的实现方式以及如何使用的。 文中代码地址:spring-rpc-learning: spring 内置Rpc组件,包含spring-hessian-rpc,spri

技术小站 1639

dubbo总结

集群模式下的容错模式 集群模式下,调用服务失败时的容错机制 1、默认是failover,重试机制,默认是两次。通常可用于读操作 2、failfast,快速失败模式,当调用失败时候就报错,通常用于写操作 3、failsafe,失败安全模式,当调用失败时直接忽略。通常用于写入日志等操作。 ...

536
上一篇: 银河麒麟下离线安装nginx-1.17.2
下一篇: java 提取应用程序图标,根据exe路径提取图标
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值