SpringMVC常用功能实现

ops/2024/9/23 20:25:18/

1. 导入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. 端口配置

server:port: 8080

3. 统一功能处理

3.1 拦截器

3.1.1 生成

java">package com.example.config;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;@Component
public class RequestInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 鉴权HttpSession session = request.getSession(false);if (session == null || session.getAttribute("username") == null) {response.setStatus(401);return false;}return true;}
}

3.1.2 注册

java">package com.example.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate RequestInterceptor requestInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(requestInterceptor).addPathPatterns("/**").excludePathPatterns("/login");}
}

3.2 统一数据返回

java">package com.example.config;import com.example.model.Result;
import com.fasterxml.jackson.databind.json.JsonMapper;
import lombok.SneakyThrows;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;import java.lang.reflect.Method;@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {private final static JsonMapper mapper = new JsonMapper();@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {// 获取执行方法Method method = returnType.getMethod();System.out.println(method.getName());return true;}@SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {if (body instanceof Result) {// 包含统一响应格式或异常处理直接返回return body;} else if (body instanceof String) {// String由于映射器原因,直接返回对象会报错,需要转换一下return mapper.writeValueAsString(Result.success(body));}return Result.success(body);}
}

3.3 统一异常处理

异常处理捕获后会从子到父依次匹配。

java">package com.example.config;import com.example.model.Result;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;@ResponseBody
@ControllerAdvice
public class ExceptionAdvice {@ExceptionHandlerpublic Object handler(Exception e) {return Result.fail("内部错误");}@ExceptionHandlerpublic Object handler(NullPointerException e) {return Result.fail("NullPointerException");}
}

3.4 执行顺序

拦截器

目标方法  统一异常处理  统一数据返回

拦截器


http://www.ppmy.cn/ops/53631.html

相关文章

【原创实现 设计模式】Spring+策略+模版+工厂模式去掉if-else,实现开闭原则,优雅扩展

1 定义与优点 1.1 定义 策略模式&#xff08;Strategy Pattern&#xff09;属于对象的⾏为模式。他主要是用于针对同一个抽象行为&#xff0c;在程序运行时根据客户端不同的参数或者上下文&#xff0c;动态的选择不同的具体实现方式&#xff0c;即类的行为可以在运行时更改。…

简单的本地局域网的前后端接口联调

由于项目被赶进度了&#xff0c;急于前后端联调接口&#xff0c;但是我又没钱买服务器&#xff08;主要我也不会部署&#xff09;&#xff0c;所以我这里就紧急找一个后端的大神朋友请教了一下&#xff1a;苏泽SuZe-CSDN博客 提示&#xff1a;这里不讲后端怎么写接口、前端怎么…

华为云安全防护,九河云综合分解优劣势分析

随着全球化的发展&#xff0c;越来越多的企业开始寻求在国际市场上扩展业务&#xff0c;这一趋势被称为企业出海。然而&#xff0c;企业在海外扩张面临诸多隐患与安全挑战&#xff0c;其中因为地域的不同&#xff0c;在安全性方面与国内相比会变得薄弱&#xff0c;从而导致被黑…

Pytest教程:Pytest插件原理

Pytest的插件系统是其强大功能的核心,它允许用户和开发者扩展和定制测试框架的行为。要深入理解Pytest插件的原理,我们需要从Pytest的架构和设计模式开始,然后深入到底层源码。 1.插件原理 1. Pytest的架构和设计模式 Pytest的设计遵循了几个关键的设计模式和原则,包括: …

Scala入门:探索大数据开发的强大工具

Scala入门&#xff1a;探索大数据开发的强大工具 Scala是一种多范式编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性&#xff0c;非常适合大数据处理和并发编程。随着大数据技术的快速发展&#xff0c;Scala已经成为数据工程师和数据科学家的首选工具之一。本文将…

基于源码详解ThreadPoolExecutor实现原理

个人博客地址 基于源码详解ThreadPoolExecutor实现原理 | iwts’s blog 内容拆分 这里算是一个总集&#xff0c;内容太多&#xff0c;拆分成几个比较重要的小的模块&#xff1a; ThreadPoolExecutor基于ctl变量的声明周期管理 | iwts’s blog ThreadPoolExecutor 工作线程…

场外期权交易流程以及参与方式是什么?

今天带你了解场外期权交易流程以及参与方式是什么&#xff1f;场外期权&#xff0c;是非标准化的期权合约&#xff0c;由买卖双方私下协商达成&#xff0c;灵活性较高。由于这种合约的条款可以根据双方的具体需求进行定制&#xff0c;因此它提供了比交易所交易的标准化期权更多…

vue-cli 搭建项目,ElementUI的搭建和使用

vue-cli 官方提供的一个脚手架&#xff0c;用于快速生成一个vue的项目模板&#xff1b;预先定义 好的目录结构及基础代码&#xff0c;就好比咱们在创建Maven项目时可以选择创建一个 骨架项目&#xff0c;这个骨架项目就是脚手架&#xff0c;我们的开发更加的快速&#xff1b; …