当前位置: 首页 > news >正文

网站与装修公司自己网站怎么做优化

网站与装修公司,自己网站怎么做优化,wordpress中文维护插件,做视频网站需要什么条件注解 何谓注解#xff1f; 在Java中#xff0c;注解#xff08;Annotation#xff09;是一种特殊的语法#xff0c;用符号开头#xff0c;是 Java5 开始引入的新特性#xff0c;可以看作是一种特殊的注释#xff0c;主要用于修饰类、方法或者变量#xff0c;提供某些信…注解 何谓注解 在Java中注解Annotation是一种特殊的语法用符号开头是 Java5 开始引入的新特性可以看作是一种特殊的注释主要用于修饰类、方法或者变量提供某些信息供程序在编译或者运行时使用。 拿熟悉 的Override 注解来看。 package java.lang; import java.lang.annotation.*; Target(ElementType.METHOD) Retention(RetentionPolicy.SOURCE) public interface Override { } JDK 内置了很多注解比如 Override、Deprecated其他框架如 Spring 也内置了不少注解我们也可以自定义注解。 注解的作用 注解的主要作用是提供元数据具体可以用于以下几个方面 编译时检查如Override可以帮助编译器检查该方法是否正确重写了父类的方法。代码生成如Entity可以告诉框架生成对应的数据库表。运行时处理如Deprecated可以在运行时提醒开发者某个方法或类已经不建议使用。 注解的解析方法有哪几种 注解只有被解析之后才会生效常见的解析方法有两种 编译期直接扫描编译器在编译 Java 代码的时候扫描对应的注解并处理比如某个方法使用Override 注解编译器在编译的时候就会检测当前的方法是否重写了父类对应的方法。运行期通过反射处理像框架中自带的注解(比如 Spring 框架的 Value、Component)都是通过反射来进行处理的。也是我们自定义注解中使用最多的。 如何自定义注解 自定义注解主要包括以下几个步骤 1.定义注解使用interface关键字定义注解。2.注解元素在注解中定义元素就像在接口中定义方法。3.元注解使用元注解如Retention、Target等来描述注解的行为。 1. 定义注解 可以使用interface关键字来定义一个注解。下面是一个简单的例子 public interface MyAnnotation { String value(); int number() default 0; } 在上面的例子中 MyAnnotation 注解有两个元素 value 和 number 。其中 number 有一个默认值 0 。 2. 元注解 元注解是注解的注解用来描述注解本身的行为。常见的元注解有 Retention指明注解的保留策略。Target指明注解的使用目标。 Retention Retention指定了注解的生命周期它有三个取值 RetentionPolicy.SOURCE注解只在源代码中存在编译后就不存在了。RetentionPolicy.CLASS注解在编译后会存在于.class文件中但在运行时不会存在。RetentionPolicy.RUNTIME注解在运行时依然存在可以通过反射读取。 Target Target指定了注解可以使用的地方如类、方法、字段等。常见的取值有 ElementType.TYPE用于类、接口、枚举、注解类型。ElementType.FIELD用于字段或属性。ElementType.METHOD用于方法。ElementType.PARAMETER用于参数。ElementType.CONSTRUCTOR用于构造函数。ElementType.LOCAL_VARIABLE用于局部变量。 3. 完整的自定义注解示例 下面是一个包含Retention和Target元注解的完整自定义注解示例 import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.annotation.ElementType; // 定义注解 Retention(RetentionPolicy.RUNTIME) Target(ElementType.METHOD) public interface MyAnnotation { String value(); int number() default 0; } 4. 使用自定义注解 定义完注解后可以在代码中使用它 public class Test {MyAnnotation(value Test method, number 42) public void testMethod() { // 方法的具体实现 } } 5. 通过反射读取注解 可以使用反射机制读取并处理注解本项目中的 AOP 切面原理就是如此 import java.lang.reflect.Method; public class Main { public static void main(String[] args) throws Exception { Method method Test.class.getMethod(testMethod);if (method.isAnnotationPresent(MyAnnotation.class)) { MyAnnotation annotation method.getAnnotation(MyAnnotation.class); System.out.println(Value: annotation.value()); System.out.println(Number: annotation.number()); } } } Spring 特性 八股中的 Spring 的两大特性熟的不能再熟了吧 ●IoC控制反转 ●AOP 面向切面编程 面向切面编程 AOP 这里我们重点介绍下 AOP因为项目中使用到。 面向切面编程是一种编程范式它允许在不改变业务逻辑代码的情况下将横切关注点如日志记录、事务管理、安全检查等模块化。AOP通过定义切面Aspect和切点Pointcut来实现这一点。 Spring AOP 提供了多种方式来定义和使用切面包括 ●注解使用Aspect和相关注解如Before、After、Around等来定义切面和切点。 ●XML配置在Spring配置文件中定义切面和切点较少使用现代开发中更常用注解。 微服务架构 微服务简而言之就是单个独立的服务可以独立开发、部署和维护。而微服务架构是指的多个微服务聚合起来的系统这个系统涵盖多个微服务服务与服务之间的通讯、服务监控、服务熔断降级、服务注册、分布式配置、分布式事务等各种解决方案聚合而成的架构体系。 微服务架构有如下优点 提高开发效率团队可以并行开发不同的微服务减少了开发和发布的时间。增强可维护性小而专注的代码库更易于理解和维护降低了技术债务。灵活的技术选型不同的微服务可以根据需要使用最合适的技术栈而无需在整个系统中保持一致。持续交付和部署微服务架构支持持续集成和持续交付CI/CD使得新功能和修复能够快速上线。更好的故障隔离一个微服务的故障不会影响其他微服务的正常运行从而提高系统的可靠性。按需扩展可以独立地扩展需要高负载处理的微服务优化资源使用和成本。 鉴权基础 鉴权顾名思义就是需要进行权限认证和授权控制你写好的系统不希望谁都可以访问吧你写的牛逼的接口也不希望哪个人都可以来蹭一下访问吧那就需要认证和授权。 专业做这块的有 Spring Security 和 Shiro 这两哥们当然还有一些其他的框架也是可以做的但无非核心都在做两件事 认证授权 认证说白了就是登录传统 web 登录是通过用户名和密码用 CookieSession 的方式这种依赖于服务器本地内存微服务中显然不合适。 常见的鉴权方式有以下几种 用户名和密码 是最传统和常见的鉴权方式用户通过输入预先设置的用户名和密码进行登录需要注意密码的存储和传输安全如使用加盐哈希存储和HTTPS 传输。 多因素认证MFA 这是一种增强安全性的方法通过要求多种不同类型的验证因素来确认用户身份常见的因素包括知识因子密码、拥有因子手机验证码、生物因子指纹、面部识别。 OAuth开放授权 这是一种一种授权协议允许第三方应用以有限的权限访问用户资源而无需暴露用户的凭证。常用于社交登录和API访问控制。 JWTJSON Web Token 一种基于 JSON 的开放标准RFC 7519用于在各方之间传递声明。JWT包含用户信息和签名可用于鉴权和授权。我们这次也是采用的这种方式进行的鉴权。 项目实战中如何做鉴权认证 项目中的架构 微服务架构中通常有多个独立服务组成这些服务可能部署在不同的服务器或数据中心 鉴权机制需要在分布式环境中有效运作确保各个服务能安全通信且需要有统一认证中心我们先来看一张 PmHub 的架构图 PmHub 中有一个单独的微服务来做认证也就是认证服务 pmhub-auth对于 PmHub 而言请求一般分为 2 种 通过 API 网关的请求微服务内部请求 对于这两种请求都需要进行鉴权但方式是不一样的 PmHub 中如何做认证 微服务中的认证最多的方式是通过 JWT 令牌的方式但 JWT 实际上是无状态的也就是没法确定登录的用户啥时候过期所以大部分情况下会需要结合 Redis 来设置状态。 将生成的 JWT 字符串在 Redis 上也保存一份并设置过期时间判断用户是否登录时需要先去 Redis 上查看 JWT 字符串是否存在存在的话再对 JWT 字符串做解析操作如果能成功解析就没问题如果不能成功解析就说明令牌不合法。 PmHub 也是采取的这个逻辑这是一个简单的流程图 在认证服务中检查用户名密码的正确性正确的话就生成 JWT 字符串同时再把数据存入到 Redis 上然后返回 token 信息。登录请求先经过网关网关再转发到认证服务下面是一个具体的流程 放在系统层面上流程用例比较复杂为了方便大家理解可以看如下图 可以看到用户登录逻辑其实是涉及到多服务交互的大家可以对着代码看流程图理解起来会更深入一些。 PmHub 中如何做鉴权 鉴权或者说是授权是请求到达每个微服务后需要对请求进行权限判定看是否有权限访问通常不会放在网关中来做。还是在微服务中自己来做。 我们说过在 PmHub 中请求主要分为 2 种外部请求和内部请求下面是不同的授权思路。外部请求 PmHub 的做法是请求到达网关后通过微服务的自定义请求头拦截器可以放在公共包下面每个服务都可以引用配合自定义注解和 AOP拦截请求头获取用户和权限信息然后进行比对有权限则放行没权限则抛出异常。 内部请求 对于内部的请求来说正常是不需要鉴权的内部请求可以直接处理。问题是如果使用了 OpenFeign数据都是通过接口暴露出去的不鉴权的话又会担心从外部来的请求调用这个接口对于这个问题我们也可以自定义注解AOP然后在内部请求调用的时候额外加一个头字段加以区分。我采用的是自定义内部请求注解然后 AOP 控制拦截。 内部请求注解 /*** 内部认证注解* * author canghe*/ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface InnerAuth { /*** 是否校验用户信息*/ boolean isUser() default false; } AOP 的切面控制请求是否携带有内部请求的标识 内部请求切面   /*** 内部服务调用验证处理** author canghe*/ Aspect Component public class InnerAuthAspect implements Ordered {Around(annotation(innerAuth)) public Object innerAround(ProceedingJoinPoint point, InnerAuth innerAuth) throws Throwable { String source ServletUtils.getRequest().getHeader(SecurityConstants.FROM_SOURCE); // 内部请求验证 if (!StringUtils.equals(SecurityConstants.INNER, source)) { throw new InnerAuthException(没有内部访问权限不允许访问); }String userid ServletUtils.getRequest().getHeader(SecurityConstants.DETAILS_USER_ID); String username ServletUtils.getRequest().getHeader(SecurityConstants.DETAILS_USERNAME); // 用户信息验证 if (innerAuth.isUser() (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username))) { throw new InnerAuthException(没有设置用户信息不允许访问 ); } return point.proceed(); } 因为使用的是 OpenFeign请求通过 OpenFeign 调用也需要鉴权所以我实现了 feign.RequestInterceptor 接口来定义一个 OpenFeign 的请求拦截器在拦截器中统一为 OpenFeign 请求设置请求头信息。 /*** feign 请求拦截器** author canghe*/ Component public class FeignRequestInterceptor implements RequestInterceptor {Override public void apply(RequestTemplate requestTemplate) { HttpServletRequest httpServletRequest ServletUtils.getRequest(); if (StringUtils.isNotNull(httpServletRequest)) { MapString, String headers ServletUtils.getHeaders(httpServletRequest); // 传递用户信息请求头防止丢失 String userId headers.get(SecurityConstants.DETAILS_USER_ID); if (StringUtils.isNotEmpty(userId)) { requestTemplate.header(SecurityConstants.DETAILS_USER_ID, userId); } String userKey headers.get(SecurityConstants.USER_KEY); if (StringUtils.isNotEmpty(userKey)) { requestTemplate.header(SecurityConstants.USER_KEY, userKey); } String userName headers.get(SecurityConstants.DETAILS_USERNAME); if (StringUtils.isNotEmpty(userName)) { requestTemplate.header(SecurityConstants.DETAILS_USERNAME, userName); } String authentication headers.get(SecurityConstants.AUTHORIZATION_HEADER); if (StringUtils.isNotEmpty(authentication)) { requestTemplate.header(SecurityConstants.AUTHORIZATION_HEADER, authentication); }// 配置客户端IP requestTemplate.header(X-Forwarded-For, IpUtils.getIpAddr()); } } 以上是 PmHub 中的认证鉴权逻辑。
http://www.dnsts.com.cn/news/127276.html

相关文章:

  • 阿里云买域名后怎么做网站营销型网站需要备案吗
  • 德州极速网站建设 小程序易语言编程可以做网站么
  • jsp做的网站难吗百度一下你就知道了官网
  • 常州知名网站网站建设制作人员招聘要求
  • 怎么做淘宝客网站优化介绍学校网站怎么做
  • 上海门户网站开发关于 公司网站建设的通知
  • 桥拓云智能建站手机怎么注册自己的网站
  • 山东建设厅执业资格注册中心网站建站宝盒源码
  • 深圳网站排名优化公司太原公司网站建立
  • wordpress仿站抓取软件用户登录入口
  • 微信网站小游戏设计免费素材网站
  • 网站建设花费录什么费用网站排名必做阶段性seo策略
  • 双色调网站wordpress左右两栏
  • 做网站改变图片位置贵州省住房和城乡建设厅网站首页
  • 东莞做网站 动点官网网页设计要多少钱
  • 沙井网站建设网站建设 中企动力南通
  • 高校网站建设汇报网络公司名字大全集
  • 淘客返利网站怎么做德兴市网站建设服务公司
  • 网站制作还花钱北京产品设计公司有哪些
  • 上海网站设计案例国外 网站网站
  • 汶上做网站舟山市建设局网站
  • php的网站模板手机怎么进入国外网站
  • 免费行情网站大全下载网站建站与优化
  • 网站后期维护费用怎样版费东莞怎样做网站建设
  • 专业网站建设咨询个人网站建设如何选服务器
  • 怎么做可以聊天的网站wordpress 主题next
  • 江西企业网站建设价格网络广告营销方案策划内容
  • 深圳罗湖做网站的公司哪家好淮北论坛招聘兼职
  • 网站后台管理系统教程seo排名优化培训价格
  • 浙江省住房和城乡建设部网站西安做网站南通公司