news 2026/4/23 18:39:31

面试实战 问题三十四 对称加密 和 非对称加密 spring 拦截器 spring 过滤器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
面试实战 问题三十四 对称加密 和 非对称加密 spring 拦截器 spring 过滤器

对称加密 和 非对称加密

对称加密

  • 原理:对称加密是一种加密方法,使用相同的密钥进行加密和解密数据。加密过程是通过特定的加密算法,将明文数据按照密钥规则转换为密文;解密过程则是使用相同的密钥将密文还原为明文。这种加密方法快速高效,适用于加密大量数据,但密钥的安全分发和存储至关重要,因为一旦密钥泄露,加密的数据就可能被轻易解密。
  • 应用:常用于对大量数据的加密,如文件加密、数据库加密等。例如在需要对数据库中的敏感信息进行加密存储时,可使用对称加密算法对数据进行加密,提高数据的安全性。
  • Java 加密项目中的使用:在 Java 中,常见的对称加密算法有 AES、DES 等。以下是一个 Java 实现 AES 对称加密的示例代码:
importjavax.crypto.Cipher;importjavax.crypto.KeyGenerator;importjavax.crypto.SecretKey;importjava.nio.charset.StandardCharsets;importjava.util.Base64;publicclassAESEncryptionExample{publicstaticStringencrypt(StringplainText,SecretKeysecretKey)throwsException{Ciphercipher=Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE,secretKey);byte[]encryptedBytes=cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));returnBase64.getEncoder().encodeToString(encryptedBytes);}publicstaticStringdecrypt(StringencryptedText,SecretKeysecretKey)throwsException{Ciphercipher=Cipher.getInstance("AES");cipher.init(Cipher.DECRYPT_MODE,secretKey);byte[]decodedBytes=Base64.getDecoder().decode(encryptedText);byte[]decryptedBytes=cipher.doFinal(decodedBytes);returnnewString(decryptedBytes,StandardCharsets.UTF_8);}publicstaticvoidmain(String[]args)throwsException{KeyGeneratorkeyGenerator=KeyGenerator.getInstance("AES");keyGenerator.init(128);SecretKeysecretKey=keyGenerator.generateKey();StringplainText="Hello, Java Encryption!";StringencryptedText=encrypt(plainText,secretKey);StringdecryptedText=decrypt(encryptedText,secretKey);System.out.println("Plain Text: "+plainText);System.out.println("Encrypted Text: "+encryptedText);System.out.println("Decrypted Text: "+decryptedText);}}

非对称加密

  • 原理:非对称加密算法需要一对密钥,即一把私钥和一把公钥。公钥用于加密数据,私钥用于解密数据或进行数字签名。数据使用公钥加密后,只有对应的私钥才能解密;私钥进行签名后,公钥可以验证签名的真实性。非对称加密可以避免对称加密算法中密钥传输安全性的问题,但加解密速度较慢。
  • 应用:常用于数字签名、密钥协商、身份验证等方面。例如在数字证书中,使用非对称加密算法进行签名,确保证书的真实性和完整性;在 SSL/TLS 协议中,使用非对称加密算法进行密钥协商,生成对称加密的密钥。
  • Java 加密项目中的使用:在 Java 中,常见的非对称加密算法有 RSA、ECC 等。以下是一个 Java 实现 RSA 非对称加密的示例代码:
importjavax.crypto.Cipher;importjava.nio.charset.StandardCharsets;importjava.security.*;importjava.util.Base64;publicclassRSAEncryptionExample{publicstaticKeyPairgenerateKeyPair()throwsNoSuchAlgorithmException{KeyPairGeneratorkeyPairGenerator=KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);returnkeyPairGenerator.generateKeyPair();}publicstaticStringencrypt(StringplainText,PublicKeypublicKey)throwsException{Ciphercipher=Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE,publicKey);byte[]encryptedBytes=cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));returnBase64.getEncoder().encodeToString(encryptedBytes);}publicstaticStringdecrypt(StringencryptedText,PrivateKeyprivateKey)throwsException{Ciphercipher=Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE,privateKey);byte[]decodedBytes=Base64.getDecoder().decode(encryptedText);byte[]decryptedBytes=cipher.doFinal(decodedBytes);returnnewString(decryptedBytes,StandardCharsets.UTF_8);}publicstaticvoidmain(String[]args)throwsException{KeyPairkeyPair=generateKeyPair();PublicKeypublicKey=keyPair.getPublic();PrivateKeyprivateKey=keyPair.getPrivate();StringplainText="Hello, Java Encryption!";StringencryptedText=encrypt(plainText,publicKey);StringdecryptedText=decrypt(encryptedText,privateKey);System.out.println("Plain Text: "+plainText);System.out.println("Encrypted Text: "+encryptedText);System.out.println("Decrypted Text: "+decryptedText);}}

spring 拦截器

使用方法

在 Spring 开发中使用拦截器,通常需要以下几个步骤。首先,创建一个实现HandlerInterceptor接口的拦截器类,该接口有三个方法:preHandle(在请求处理之前调用)、postHandle(在请求处理之后,视图渲染之前调用)和afterCompletion(在整个请求完成之后调用)。以下是一个简单的拦截器示例:

importorg.springframework.web.servlet.HandlerInterceptor;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassCustomInterceptorimplementsHandlerInterceptor{@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{// 在请求处理之前执行的逻辑System.out.println("Pre-handle method is called");returntrue;// 返回 true 表示继续执行请求处理流程}@OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,org.springframework.web.servlet.ModelAndViewmodelAndView)throwsException{// 在请求处理之后,视图渲染之前执行的逻辑System.out.println("Post-handle method is called");}@OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{// 在整个请求完成之后执行的逻辑System.out.println("After-completion method is called");}}

然后,需要将这个拦截器注册到 Spring 配置中。可以通过继承WebMvcConfigurerAdapter(Spring Boot 2.0 之前)或实现WebMvcConfigurer(Spring Boot 2.0 及之后)来完成注册:

importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(newCustomInterceptor()).addPathPatterns("/**");// 拦截所有请求}}

原理

Spring 拦截器是基于 Java 的反射机制和 Spring 的 AOP(面向切面编程)思想实现的。在 Spring MVC 中,DispatcherServlet是核心控制器,它负责接收客户端请求并将请求分发给相应的处理器。当请求到达DispatcherServlet后,DispatcherServlet会根据请求的 URL 找到对应的处理器映射器,然后通过处理器映射器找到处理该请求的处理器(通常是一个控制器方法)。在执行处理器之前,DispatcherServlet会调用拦截器的preHandle方法,如果preHandle方法返回true,则继续执行处理器;如果返回false,则请求处理流程终止。在处理器执行完成后,DispatcherServlet会调用拦截器的postHandle方法,最后在整个请求完成后调用afterCompletion方法。

应用场景

Spring 拦截器在企业级应用中有广泛的应用场景。例如,权限校验方面,在preHandle方法中可以检查用户是否具有访问某个资源的权限,如果没有权限,则可以直接返回错误信息,阻止请求继续处理;日志记录方面,可以在preHandle方法中记录请求的相关信息,如请求的 URL、请求参数等,在afterCompletion方法中记录请求的处理结果和执行时间;性能监控方面,可以在preHandle方法中记录请求开始时间,在afterCompletion方法中计算请求的执行时间,从而监控系统的性能。

spring 过滤器

介绍

Spring 过滤器是 Java Web 应用中的一种组件,它放在 web 资源之前,可以在请求抵达它所应用的 web 资源(可以是一个 Servlet、一个 Jsp 页面,甚至是一个 HTML 页面)之前截获进入的请求,并且在它返回到客户之前截获输出请求。其目的是重用代码,处于客户端与被请求资源之间,可对请求和响应进行预处理和后处理。

使用方法

以下是一个简单的 Spring 过滤器使用示例:

importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjava.io.IOException;// 使用 @WebFilter 注解来定义过滤器@WebFilter(filterName="customFilter",urlPatterns="/*")publicclassCustomFilterimplementsFilter{@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{// 初始化方法,在过滤器启动时调用System.out.println("CustomFilter initialized");}@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{// 在请求处理之前执行的逻辑System.out.println("Pre-processing request in CustomFilter");// 调用 FilterChain 的 doFilter 方法,将请求传递给下一个过滤器或目标资源chain.doFilter(request,response);// 在请求处理之后执行的逻辑System.out.println("Post-processing request in CustomFilter");}@Overridepublicvoiddestroy(){// 销毁方法,在过滤器销毁时调用System.out.println("CustomFilter destroyed");}}

要使这个过滤器生效,还需要在 Spring Boot 主类上添加@ServletComponentScan注解:

importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication@ServletComponentScanpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}

原理

Spring 过滤器基于 Java 的 Servlet 规范实现。当客户端发送请求时,请求首先会到达过滤器。过滤器接收到请求和响应对象后,可以对它们进行预处理,例如修改请求参数、设置响应头信息等。在过滤器中,通过FilterChain对象的doFilter方法将请求传递给下一个过滤器或目标资源。如果还有其他过滤器,则继续执行下一个过滤器的doFilter方法;如果没有其他过滤器,则请求会到达目标资源(如 Servlet 或 JSP)。目标资源处理完请求后,响应会沿着过滤器链反向返回,此时过滤器可以对响应进行后处理,例如修改响应内容、记录日志等。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:45:22

零基础30分钟解锁Qwen3-4B-FP8:从部署到实战的完整能力获取指南

还在为AI模型部署的技术门槛而烦恼?Qwen3-4B-FP8作为高性能轻量级语言模型,仅需消费级GPU就能实现流畅推理,为个人开发者和中小企业提供低成本的AI解决方案。本文将带你从零开始,通过问题导向的递进式学习,快速掌握模型…

作者头像 李华
网站建设 2026/4/23 16:05:57

初探Kubernetes:核心概念解析

k8s 架构K8s 属于经典的主从模型(Master-Slave 架构),由 Master 和 Node 节点构成:Master 节点:负责集群的管理,协调集群中的所有活动。例如应用的运行、修改、更新等。Node 节点:为 Kubernetes…

作者头像 李华
网站建设 2026/4/22 11:40:25

终极Visio形状库:5000+专业图形一键调用

终极Visio形状库:5000专业图形一键调用 【免费下载链接】史上最全Visio形状库分享 你是否在使用Microsoft Visio时,发现内置的形状库无法满足你的需求?你是否在寻找一个更全面、更丰富的形状库来提升你的绘图效率?那么&#xff0c…

作者头像 李华
网站建设 2026/4/17 17:12:32

MouseTester:专业鼠标性能评测工具终极指南

MouseTester:专业鼠标性能评测工具终极指南 【免费下载链接】MouseTester 项目地址: https://gitcode.com/gh_mirrors/mo/MouseTester 告别主观猜测,用数据精准评估鼠标表现 在日常使用中,你是否曾因鼠标响应延迟而在关键时刻错失良…

作者头像 李华
网站建设 2026/4/22 4:43:17

EmotiVoice技术沙龙报名开启:线下交流盛会

EmotiVoice技术沙龙报名开启:线下交流盛会 在虚拟助手越来越“懂人心”、游戏角色开始拥有情绪起伏的今天,语音合成早已不再是简单地把文字念出来。用户期待的是有温度的声音——能欢快地打招呼,也能低沉地讲述一段悲伤往事。而要实现这种拟人…

作者头像 李华