网站搜索 代码网站一般的后台

bicheng/2026/1/18 6:36:00/文章来源:
网站搜索 代码,网站一般的后台,vi企业视觉形象设计,辽阳哪里做网站最近在使用SpringSecurityJWT实现认证授权的时候#xff0c;出现Redis在反序列化userDetails的异常。通过实践发现#xff0c;使用不同的序列化方法和不同的fastJson版本#xff0c;异常信息各不相同。所以特地记录了下来。 一、项目代码 先来看看我项目中redis相关配置信息…        最近在使用SpringSecurityJWT实现认证授权的时候出现Redis在反序列化userDetails的异常。通过实践发现使用不同的序列化方法和不同的fastJson版本异常信息各不相同。所以特地记录了下来。 一、项目代码 先来看看我项目中redis相关配置信息。 1.自定义的redis序列化器 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.TypeFactory; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import com.alibaba.fastjson.parser.ParserConfig; import org.springframework.util.Assert; import java.nio.charset.Charset;/*** Redis使用FastJson序列化** author mosul*/ public class FastJsonRedisSerializerT implements RedisSerializerT {public static final Charset DEFAULT_CHARSET Charset.forName(UTF-8);private ClassT clazz;static{ParserConfig.getGlobalInstance().setAutoTypeSupport(true);}public FastJsonRedisSerializer(ClassT clazz){super();this.clazz clazz;}Overridepublic byte[] serialize(T t) throws SerializationException{if (t null){return new byte[0];}return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);}Overridepublic T deserialize(byte[] bytes) throws SerializationException{if (bytes null || bytes.length 0){return null;}String str new String(bytes, DEFAULT_CHARSET);return JSON.parseObject(str, clazz);}protected JavaType getJavaType(Class? clazz){return TypeFactory.defaultInstance().constructType(clazz);} } 2.redis配置类 import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer;Configuration public class RedisConfig {/*** 指定特定的连接工厂* return*//*Beanpublic RedisConnectionFactory redisConnectionFactory() {return new LettuceConnectionFactory();}*/BeanSuppressWarnings(value { unchecked, rawtypes })public RedisTemplateObject, Object redisTemplate(RedisConnectionFactory connectionFactory){RedisTemplateObject, Object template new RedisTemplate();template.setConnectionFactory(connectionFactory);FastJsonRedisSerializer serializer new FastJsonRedisSerializer(Object.class);// 使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(serializer);// Hash的key也采用StringRedisSerializer的序列化方式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;} } 3.redis工具类 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundSetOperations; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component;import java.util.*; import java.util.concurrent.TimeUnit;/*** Redis帮助类** author mosul*/ SuppressWarnings(value { unchecked, rawtypes }) Component public class RedisHelper {Autowiredpublic RedisTemplate redisTemplate;/*** 缓存基本的对象Integer、String、实体类等** param key 缓存的键值* param value 缓存的值*/public T void setCacheObject(final String key, final T value){redisTemplate.opsForValue().set(key, value);}/*** 缓存基本的对象Integer、String、实体类等** param key 缓存的键值* param value 缓存的值* param timeout 时间* param timeUnit 时间颗粒度*/public T void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit){redisTemplate.opsForValue().set(key, value, timeout, timeUnit);}/*** 设置有效时间** param key Redis键* param timeout 超时时间* return true设置成功false设置失败*/public boolean expire(final String key, final long timeout){return expire(key, timeout, TimeUnit.SECONDS);}/*** 设置有效时间** param key Redis键* param timeout 超时时间* param unit 时间单位* return true设置成功false设置失败*/public boolean expire(final String key, final long timeout, final TimeUnit unit){return redisTemplate.expire(key, timeout, unit);}/*** 获得缓存的基本对象。** param key 缓存键值* return 缓存键值对应的数据*/public T T getCacheObject(final String key){ValueOperationsString, T operation redisTemplate.opsForValue();return operation.get(key);}/*** 删除单个对象** param key*/public boolean deleteObject(final String key){return redisTemplate.delete(key);}/*** 删除集合对象** param collection 多个对象* return*/public long deleteObject(final Collection collection){return redisTemplate.delete(collection);}/*** 缓存List数据** param key 缓存的键值* param dataList 待缓存的List数据* return 缓存的对象*/public T long setCacheList(final String key, final ListT dataList){Long count redisTemplate.opsForList().rightPushAll(key, dataList);return count null ? 0 : count;}/*** 获得缓存的list对象** param key 缓存的键值* return 缓存键值对应的数据*/public T ListT getCacheList(final String key){return redisTemplate.opsForList().range(key, 0, -1);}/*** 缓存Set** param key 缓存键值* param dataSet 缓存的数据* return 缓存数据的对象*/public T BoundSetOperationsString, T setCacheSet(final String key, final SetT dataSet){BoundSetOperationsString, T setOperation redisTemplate.boundSetOps(key);IteratorT it dataSet.iterator();while (it.hasNext()){setOperation.add(it.next());}return setOperation;}/*** 获得缓存的set** param key* return*/public T SetT getCacheSet(final String key){return redisTemplate.opsForSet().members(key);}/*** 缓存Map** param key* param dataMap*/public T void setCacheMap(final String key, final MapString, T dataMap){if (dataMap ! null) {redisTemplate.opsForHash().putAll(key, dataMap);}}/*** 获得缓存的Map** param key* return*/public T MapString, T getCacheMap(final String key){return redisTemplate.opsForHash().entries(key);}/*** 往Hash中存入数据** param key Redis键* param hKey Hash键* param value 值*/public T void setCacheMapValue(final String key, final String hKey, final T value){redisTemplate.opsForHash().put(key, hKey, value);}/*** 获取Hash中的数据** param key Redis键* param hKey Hash键* return Hash中的对象*/public T T getCacheMapValue(final String key, final String hKey){HashOperationsString, String, T opsForHash redisTemplate.opsForHash();return opsForHash.get(key, hKey);}/*** 删除Hash中的数据** param key* param hkey*/public void delCacheMapValue(final String key, final String hkey){HashOperations hashOperations redisTemplate.opsForHash();hashOperations.delete(key, hkey);}/*** 获取多个Hash中的数据** param key Redis键* param hKeys Hash键集合* return Hash对象集合*/public T ListT getMultiCacheMapValue(final String key, final CollectionObject hKeys){return redisTemplate.opsForHash().multiGet(key, hKeys);}/*** 获得缓存的基本对象列表** param pattern 字符串前缀* return 对象列表*/public CollectionString keys(final String pattern){return redisTemplate.keys(pattern);} } 4.自己系统中的UserDetails Data NoArgsConstructor AllArgsConstructor public class LoginUser implements UserDetails {private static final long serialVersionUID 1L;// 系统用户private SysUser user;// 用户权限列表private ListSysPermission permissionList;Overridepublic Collection? extends GrantedAuthority getAuthorities() {return permissionList.stream().filter(permission - permission.getPermission() ! null).map(permission - new SimpleGrantedAuthority(permission.getPermission())).collect(Collectors.toList());}Overridepublic String getPassword() {return user.getPassword();}Overridepublic String getUsername() {return user.getUsername();}Overridepublic boolean isAccountNonExpired() {return true;}Overridepublic boolean isAccountNonLocked() {return true;}Overridepublic boolean isCredentialsNonExpired() {return true;}Overridepublic boolean isEnabled() {return true;} } 5.登录设置 Overridepublic String login(SysUser sysUser) {String token null;//密码需要客户端加密后传递try {UserDetails userDetails sysUserService.loadUserByUsername(sysUser.getUsername());if(!passwordEncoder.matches(sysUser.getPassword(),userDetails.getPassword())){throw new BadCredentialsException(密码不正确);}UsernamePasswordAuthenticationToken authentication new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());SecurityContextHolder.getContext().setAuthentication(authentication);token jwtTokenUtil.generateToken(userDetails);String key login: sysUser.getUsername();//设置redisredisHelper.setCacheObject(key,userDetails);//insertLoginLog(username);} catch (AuthenticationException e) {LOGGER.warn(登录异常:{}, e.getMessage());}return token;}Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {SysUser sysUser sysUserMapper.selectOne(new QueryWrapperSysUser().eq(username, username));ListSysPermission permissionsByUser sysUserRoleMapper.findPermissionsByUser(sysUser.getUserId());sysUser.setPassword(new BCryptPasswordEncoder().encode(sysUser.getPassword()));// 将系统的用户信息和权限信息封装成UserDetailsUserDetails userDetail new LoginUser(sysUser, permissionsByUser);return userDetail;} 6.JWT校验 Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {String authHeader request.getHeader(this.tokenHeader);if (authHeader ! null authHeader.startsWith(this.tokenHead)) {String authToken authHeader.substring(this.tokenHead.length());// The part after Bearer String username jwtTokenUtil.getUserNameFromToken(authToken.trim());LOGGER.info(checking username:{}, username);if (username ! null SecurityContextHolder.getContext().getAuthentication() null) {//从redis中获取userDetailsString redisKey login: username;UserDetails userDetails redisHelper.getCacheObject(redisKey);if(Objects.isNull(userDetails)){throw new RuntimeException(用户未登录);}if (jwtTokenUtil.validateToken(authToken, userDetails)) {//存入SecurityContextHolder//TODO 获取权限信息封装到Authentication中UsernamePasswordAuthenticationToken authentication new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));LOGGER.info(authenticated user:{}, username);SecurityContextHolder.getContext().setAuthentication(authentication);}}}//放行filterChain.doFilter(request, response);} 7.fastjson版本 !--fastjson依赖--!--第一个版本--dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.47/version/dependency!--第二个版本--dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion2.0.22/version/dependency 上面的代码中先根据用户名获取用户对应的用户信息和权限信息然后构建SpringSecurity的UserDetails对象用户登录的时候将这个UserDetails对象放入redis中后续校验请求携带的token与redis中的信息是否一致。 二、异常信息 1.版本一报错信息 需要说明的是在redis系列化时是正常的对应的值也成功设置近缓存了但是在JWT校验阶段执行UserDetails userDetails redisHelper.getCacheObject(redisKey);时出现异常反序列化失败。 针对这个问题首先上面的代码逻辑是没有问题的但是与fastjson反序列化不兼容导致的问题。 根据异常信息提示设置属性authorities错误猜想下是因为LoginUser中没有authorities属性但也说不过去同样没有属性username和password怎么不会报错 带着这个疑问我们先给将LoginUser代码改为下面这种形式。 Data public class LoginUser implements UserDetails {private static final long serialVersionUID 1L;private SysUser user;private ListSysPermission permissionList;private ListGrantedAuthority authorities;public LoginUser() {}public LoginUser(SysUser user, ListSysPermission permissionList) {this(user,permissionList,null);}/*** 针对fastJson中redis反序列化报错的改进* org.springframework.data.redis.serializer.SerializationException:* Could not deserialize: set authorities error; nested exception is com.alibaba.fastjson.JSONException: set authorities error** param user* param permissionList* param authorities*/public LoginUser(SysUser user, ListSysPermission permissionList, ListGrantedAuthority authorities) {//返回当前用户的权限ListGrantedAuthority authoritieList permissionList.stream().filter(permission - permission.getPermission() ! null).map(permission - new SimpleGrantedAuthority(permission.getPermission())).collect(Collectors.toList());this.user user;this.permissionList permissionList;this.authorities authoritieList;}Overridepublic Collection? extends GrantedAuthority getAuthorities() {return this.authorities;}Overridepublic String getPassword() {return user.getPassword();}Overridepublic String getUsername() {return user.getUsername();}Overridepublic boolean isAccountNonExpired() {return true;}Overridepublic boolean isAccountNonLocked() {return true;}Overridepublic boolean isCredentialsNonExpired() {return true;}Overridepublic boolean isEnabled() {return true;} } 发现这里改完之后是可以正常运行的。 而且发现当我们给getAuthorities()赋简单的值的时候不会出现这个问题。 Overridepublic Collection? extends GrantedAuthority getAuthorities() {ListGrantedAuthority authoritieList new ArrayList();authoritieList.add(new SimpleGrantedAuthority(ROLE_ADMIN));return authoritieList;} 而且我们在构造函数中提前将权限列表加载出来赋值给一个属性属性不一定非得名为authorities如属性名为authoritiesList。然后返回这个属性也不会报错。 Overridepublic Collection? extends GrantedAuthority getAuthorities() {return this.authoritieList;} 通过上面两个测试可以猜测下如果构造函数中提前将比较复杂的实现暴露了反系列化也不会报错。可能出现异常的原因fastjson是对不确定结果无法反系列化如果是简单的结果或在构造器中就已经知道了确定结果就不会出现反序列化的异常。  2.版本二报错信息 在使用fastJson 2.x版本的时候同时需要对redis配置类做如下修改。 BeanSuppressWarnings(value { unchecked, rawtypes })public RedisTemplateObject, Object redisTemplate(RedisConnectionFactory connectionFactory){RedisTemplateObject, Object template new RedisTemplate();template.setConnectionFactory(connectionFactory);/*java.lang.ClassCastException:* com.alibaba.fastjson.JSONObject cannot be cast to org.springframework.security.core.userdetails.UserDetails* */String[] acceptNames {org.springframework.security.core.authority.SimpleGrantedAuthority};GenericFastJsonRedisSerializer serializer new GenericFastJsonRedisSerializer(acceptNames);// 使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(serializer);// Hash的key也采用StringRedisSerializer的序列化方式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;} 修改完成之后还是会出现设置属性authorities错误同样需要对LoginUser做上述修改。 3.发现FastJson反系列的一般问题 正如上面所说的同样没有属性username和password怎么不会报错于是做了一系列测试。发现了在低版本的fastJson中对应集合类型接口方法中包含较复杂的实现不是直接显示赋值反序化可能要求必须有对应的属性。 定义了一个有不同返回值类型的几种方法来测试。 public interface CrazyDetails {ListString getApps();User getUser();String getName();String[] getNodes();CollectionString getTests();ListUser getUsers(); } 定义一个实现类 Data NoArgsConstructor AllArgsConstructor public class MosulApp implements CrazyDetails{Overridepublic User getUser() {return new User(this.appInfo.name);}private AppInfo appInfo;Overridepublic ListUser getUsers() {ListUser userList new ArrayList();for(int i 0; i this.appInfo.name.length(); i ) {User user1 new User( i);userList.add(user1);}return userList;}Overridepublic String[] getNodes() {String[] strings new String[2];strings new String[]{this.appInfo.name,this.appInfo.details};return strings;}/*private ListString apps;*///报错添加需要private ListString testsOverridepublic CollectionString getTests() {ListString list Arrays.asList(appInfo.name);return list;}Overridepublic ListString getApps() {ListString objects new ArrayList();for(int i 0; i this.appInfo.name.length(); i ) {objects.add(tt i);}return objects;}Overridepublic String getName() {return this.appInfo.name;}} 在测试发现fastJson 1.x版本对于Arrays.asList(appInfo.name);反序列化失败fastJson 2.x版本则可以反序列化成功但对于UserDetails中Collection? extends GrantedAuthority getAuthorities()中如果有比较复杂的实现fastJson 2.x版本反序列化还是会失败。所以为了保险起见最后在自定义的UserDetails中添加authorities属性除了这种方法能外应该也跟自定义的序列化器相关设置有关需要进行探索。 三、Redis和SpringSecutiry相关配置 基于上述测试最终fastJson选用2.0.22版本最后将redis配置类和SpringSecutiry中UserDetails实现类修改为如下所示。 1.redis配置类 Configuration public class RedisConfig {/*** 指定特定的连接工厂* return*//*Beanpublic RedisConnectionFactory redisConnectionFactory() {return new LettuceConnectionFactory();}*/BeanSuppressWarnings(value { unchecked, rawtypes })public RedisTemplateObject, Object redisTemplate(RedisConnectionFactory connectionFactory){RedisTemplateObject, Object template new RedisTemplate();template.setConnectionFactory(connectionFactory);/* FastJsonRedisSerializer serializer new FastJsonRedisSerializer(Object.class);*//*解决java.lang.ClassCastException:* com.alibaba.fastjson.JSONObject cannot be cast to org.springframework.security.core.userdetails.UserDetails* */String[] acceptNames {org.springframework.security.core.authority.SimpleGrantedAuthority};GenericFastJsonRedisSerializer serializer new GenericFastJsonRedisSerializer(acceptNames);// 使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(serializer);// Hash的key也采用StringRedisSerializer的序列化方式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;} } 2.LoginUser类 Data public class LoginUser implements UserDetails {private static final long serialVersionUID 1L;// 用户信息private SysUser user;// 用户权限列表private ListSysPermission permissionList;// SpringSecurity对应的权限信息private ListGrantedAuthority authorities;public LoginUser() {}public LoginUser(SysUser user, ListSysPermission permissionList) {this(user,permissionList,null);}/*** 针对fastJson中redis反序列化报错的改进* org.springframework.data.redis.serializer.SerializationException:* Could not deserialize: set authorities error; nested exception is com.alibaba.fastjson.JSONException: set authorities error** param user* param permissionList* param authorities*/public LoginUser(SysUser user, ListSysPermission permissionList, ListGrantedAuthority authorities) {//返回当前用户的权限ListGrantedAuthority authoritieList permissionList.stream().filter(permission - permission.getPermission() ! null).map(permission - new SimpleGrantedAuthority(permission.getPermission())).collect(Collectors.toList());this.user user;this.permissionList permissionList;this.authorities authoritieList;}Overridepublic Collection? extends GrantedAuthority getAuthorities() {return this.authorities;}Overridepublic String getPassword() {return user.getPassword();}Overridepublic String getUsername() {return user.getUsername();}Overridepublic boolean isAccountNonExpired() {return true;}Overridepublic boolean isAccountNonLocked() {return true;}Overridepublic boolean isCredentialsNonExpired() {return true;}Overridepublic boolean isEnabled() {return true;} }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站加速器quickq网页设计与网站建设项目教程

目录 什么是策略模式 应用场景 业务场景实现 抽象类 实现类 Context上下文 测试类 策略模式的优缺点 什么是策略模式 他将定义的算法家族、分别封装起来,让他们之间可以相互替换,从而让算法的变化不会影响到使用算法的用户。 策略模式使用的就是…

招生网站模版wordpress添加网站

星星魔方 1,魔方三要素 (1)组成部件 6个中心块和8个角块和三阶魔方同构,另外每个面还有构成五角星的十个块。 (2)可执行操作 一共12种操作,其中6种是每个层顺时针旋转90度,另外6…

记录网站建设的基本步骤邯郸做网站找谁

打开拨号盘 adb shell am start -a android.intent.action.DIAL -d tel:*该命令通过dumpsys window命令获取当前设备的窗口信息,并使用grep mCurrentFocus过滤出包含"mCurrentFocus"关键字的行,从而获取当前活动窗口或应用程序的名称和包名。…

网站的备案号在哪高校网站建设方案

【完全二叉树】【深度优先】【广度优先】Leetcode 222 完全二叉树的节点个数 :star:解法1 按照完全二叉树解法2 按照普通二叉树:深度优先遍历 后序 左右中解法3 按照普通二叉树:广度优先遍历 层序遍历 ---------------🎈🎈题目链接…

长治个人做网站新沂网站优化

标题 前言部分:一些想对观众说的话。 参考文献: 摘要: part1:最近需要推广的内容 part2: 链接,主要内容。 part3: 题解 part4: 代码(cpp版本,后续可能会更新python版本) Part1 推广的内容 ... P…

建那种外卖网站该怎么做黑龙江省建设安全监督网站

系列文章目录 前言 本例演示了如何使用 Symbolic Math Toolbox™(符号数学工具箱)推导四旋翼飞行器的连续时间非线性模型。具体来说,本例讨论了 getQuadrotorDynamicsAndJacobian 脚本,该脚本可生成四旋翼状态函数及其雅各布函数…

网站搜索引擎关键字怎么做网络策划方案

话接上一篇,我们仍使用在上篇《QtOpencv:Qt中部署opencv》创建的Qt项目来测试opencv提供的sample。 在正式开始本篇之前,我们先说做一下准备工作: 一、opencv官方文档 学习最权威和最可靠的方式,就是阅读官方文档和…

宁波手机网站建设南京网站开发南京乐识权威

我的房子在哪儿? 理解类型和变量 - 《小白学编程》系列第五讲 - 《小白学编程》系列课程过半,为满足更多同学的时间需求,课程直播时间改为了晚上八点。 昨晚八点准时开始课程的第五讲,其主题为:“我的房子在哪儿?理解…

网站色彩搭配技巧立创电子元器件商城官网

目录 1. Linux下各种资源的内存分布2. 物理地址与虚拟(线性)地址3. 程序地址空间的区域划分4. 地址映射与页表5. 缺页中断 1. Linux下各种资源的内存分布 2. 物理地址与虚拟(线性)地址 在有关进程创建的初步学习中,我们了解了fork函数创建子进程的方式。此种进程的创…

郑州高新区建设环保局网站响应式网站 英文

文章目录 1.说一下微服务架构?2.微服务优缺点3.负载均衡的实现算法4.Redis集群部署方式?5.MySQL主从复制?5.1 配置流程5.2 优缺点分析6.口头手撕快排7.队列实现栈和栈实现队列7.1 队列实现栈7.2 栈实现队列8.进程有几种状态?9.Spring Boot Actuator?10.外键、主键和索引?…

源码做网站图文教程做一款游戏app需要多少钱

Every day a Leetcode 题目来源:1109. 航班预订统计 解法1:差分数组 注意到一个预订记录实际上代表了一个区间的增量。我们的任务是将这些增量叠加得到答案。因此,我们可以使用差分解决本题。 代码: /** lc appleetcode.cn i…

网站开发流程6个阶段wordpress wp-config.php

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

注册网站那里能注册网站需要服务器

内容目录 Flume 简介 架构和基本概念 多种架构模式 Flume 安装部署 Flume 简介 Flume 是一个分布式、可靠且高可用的数据收集、聚合和传输系统,主要用于高效地处理大规模日志数据。设计之初,它主要服务于日志管理领域,但其灵活性和可扩展…

WordPress建站要花钱建设模板网站

k8s发布nacos-server注册不上问题 问题描述:分析过程: 问题描述: k8s发布nacos-server做服务公用使用,nodeport暴漏服务给客户端注册, nacos:端口 8848:30601 9848:30701 分析过程&#xff1a…

最好的手机资源网站wordpress 友情链接 代码

正题 题目大意 构造一个ai{1,−1}a_i\{1,-1\}ai​{1,−1}使得最小化∣∑i1naii2∣|\sum_{i1}^na_ii^2|∣i1∑n​ai​i2∣ 解题思路 我们发现有对于一段连续的x2−(x1)2−(x2)2(x3)24x^2-(x1)^2-(x2)^2(x3)^24x2−(x1)2−(x2)2(x3)24,那么就有x2−(x1)2−(x2)2(x3)…

emlog轻松转wordpressseo技术分享免费咨询

用户功能: 登录后要有一个首页 比如:可以看见目前的耗材消耗记录,可做成图表菜单栏在左侧显示 1.个人信息管理 可以对基本信息进行修改,(修改密码时需要验证) 2.耗材管理(耗材信息) 普通用户可以查询当前相关耗材信息[…

河北智能网站建设多少钱一个网站需要多少钱

kotlin支持面向对象编程,也有雷和对象的概念 要声明一个类需要使用class关键字 class Customer属性(Properties) 可以在类名后边添加(),在()里边声明属性 class Contact(val id: Int, var email: String)声明了不…

php网站 缓存游戏怎么开发

题目:输出一个随机数。 程序分析:使用 random 模块。 程序源代码: 实例 #!/usr/bin/python # -*- coding: UTF-8 -*-import random#生成 10 到 20 之间的随机数 print (random.uniform(10, 20)) 以上实例输出结果为: 14.4012…

国内免费推广产品的网站招商网站建设方案

目录 一、什么是网络安全 二、什么是缓冲区 三、缓冲区溢出 四、缓冲区溢出攻击的类型 一、什么是网络安全 网络安全(Network Security)指的是保护计算机网络及其相关设备、系统和数据免受未经授权访问、破坏、篡改、窃取或滥用的威胁和攻击。随着网…

网站开发的意义传统网站模板

2023.3.630 更新25天前 分享 跟随还没有人关注 改进的 Brep.TransformBy() 方法修复了工具栏内存泄漏修复了 glTF 材质导出期间的异常改进了 glTF 材质金属粗糙度设置修复了渐进式绘图和剪辑平面的错误在 Workspace.UseShaders 属性设置器中添加了缺少的 RenderContext.MakeCur…