SpringMVC常用功能实现

发布于:2024-06-30 ⋅ 阅读:(132) ⋅ 点赞:(0)

1. 导入依赖

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

2. 端口配置

server:
  port: 8080

3. 统一功能处理

3.1 拦截器

3.1.1 生成

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 {
    @Override
    public 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 注册

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 {
    @Autowired
    private RequestInterceptor requestInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(requestInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
}

3.2 统一数据返回

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();

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        // 获取执行方法
        Method method = returnType.getMethod();
        System.out.println(method.getName());
        return true;
    }

    @SneakyThrows
    @Override
    public 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 统一异常处理

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

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 {
    @ExceptionHandler
    public Object handler(Exception e) {
        return Result.fail("内部错误");
    }

    @ExceptionHandler
    public Object handler(NullPointerException e) {
        return Result.fail("NullPointerException");
    }
}

3.4 执行顺序

拦截器

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

拦截器


网站公告

今日签到

点亮在社区的每一天
去签到