From f0124e608d3d021be5e4982da0dfc195c0665b22 Mon Sep 17 00:00:00 2001 From: xiongfeng Date: Tue, 26 Aug 2025 09:08:55 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=AE=9E=E7=8E=B0=E6=8E=A5=E5=8F=A3=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=8E=A7=E5=88=B6=E3=80=81sa-tokan=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E5=99=A8=E7=B1=BB=E5=AE=9E=E7=8E=B0=20=E5=BA=95=E5=B1=82?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E6=8D=95=E8=8E=B7=E7=B1=BB=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/GlobalExceptionHandler.java | 5 +- .../exception/GlobalExceptionResolver.java | 53 +++++++++++++++++++ .../common/utils/ApplicationContextUtils.java | 16 +++--- .../xf/basedemo/config/SaTokenConfigure.java | 23 ++++++++ .../controller/business/UserController.java | 9 ++++ .../interceptor/InterceptorConfig.java | 1 + .../interceptor/StpInterfaceImpl.java | 11 ++-- .../basedemo/mappers/SysPermissionMapper.java | 2 + .../cn/xf/basedemo/mappers/SysRoleMapper.java | 2 + 9 files changed, 104 insertions(+), 18 deletions(-) create mode 100644 src/main/java/cn/xf/basedemo/common/exception/GlobalExceptionResolver.java create mode 100644 src/main/java/cn/xf/basedemo/config/SaTokenConfigure.java diff --git a/src/main/java/cn/xf/basedemo/common/exception/GlobalExceptionHandler.java b/src/main/java/cn/xf/basedemo/common/exception/GlobalExceptionHandler.java index 7ec69a3..45ef3df 100644 --- a/src/main/java/cn/xf/basedemo/common/exception/GlobalExceptionHandler.java +++ b/src/main/java/cn/xf/basedemo/common/exception/GlobalExceptionHandler.java @@ -21,7 +21,7 @@ import java.util.Map; /** * @Author: xiongfeng * @CreateTime: 2023-11-08 11:48 - * @Description: TODO 全局异常捕获类 + * @Description: TODO 全局异常捕获类(仅 Controller 层异常) * @Version: 1.0 */ @Slf4j @@ -59,7 +59,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler{ * @return */ @ExceptionHandler(LoginException.class) - public GenericResponse tokenExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) { + public GenericResponse tokenExceptionHandler(HttpServletRequest request, final LoginException e, HttpServletResponse response) { log.error("token exception", e); LoginException exception = (LoginException) e; response.setStatus(HttpStatus.FORBIDDEN.value()); @@ -95,6 +95,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler{ public ResponseEntity exceptionHandler(jakarta.servlet.http.HttpServletRequest request, final Exception e, jakarta.servlet.http.HttpServletResponse response) { Map errors = new HashMap<>(); errors.put("message", e.getMessage()); + log.error("error------{}", e); return ResponseEntity.status(SystemStatus.ERROR.getCode()).body(errors); } diff --git a/src/main/java/cn/xf/basedemo/common/exception/GlobalExceptionResolver.java b/src/main/java/cn/xf/basedemo/common/exception/GlobalExceptionResolver.java new file mode 100644 index 0000000..a857a81 --- /dev/null +++ b/src/main/java/cn/xf/basedemo/common/exception/GlobalExceptionResolver.java @@ -0,0 +1,53 @@ +package cn.xf.basedemo.common.exception; + +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.ModelAndView; + +import java.io.IOException; +import java.io.PrintWriter; + +/** + * @Description: 全局异常捕获类(所有异常(包括拦截器、Controller、视图))HandlerExceptionResolver更底层 + * @ClassName: GlobalExceptionResolver + * @Author: xiongfeng + * @Date: 2025/8/23 23:30 + * @Version: 1.0 + */ +@Slf4j +@Component +public class GlobalExceptionResolver implements HandlerExceptionResolver { + @Override + public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + response.setContentType("application/json;charset=UTF-8"); + + try (PrintWriter writer = response.getWriter()) { + if (ex instanceof LoginException) { + response.setStatus(HttpStatus.FORBIDDEN.value()); + LoginException le = (LoginException) ex; + writer.write(new ObjectMapper().writeValueAsString( + new GenericResponse(le.getCode(), null, le.getMessage()) + )); + } else if (ex instanceof BusinessException) { + BusinessException be = (BusinessException) ex; + response.setStatus(HttpStatus.BAD_REQUEST.value()); + writer.write(new ObjectMapper().writeValueAsString( + new GenericResponse(be.getCode(), null, be.getMessage()) + )); + } else { + response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); + writer.write(new ObjectMapper().writeValueAsString( + new GenericResponse(500, null, "系统异常") + )); + } + } catch (IOException ioEx) { + log.error("写响应失败", ioEx); + } + return new ModelAndView(); + } +} diff --git a/src/main/java/cn/xf/basedemo/common/utils/ApplicationContextUtils.java b/src/main/java/cn/xf/basedemo/common/utils/ApplicationContextUtils.java index 4a7801c..a677fb8 100644 --- a/src/main/java/cn/xf/basedemo/common/utils/ApplicationContextUtils.java +++ b/src/main/java/cn/xf/basedemo/common/utils/ApplicationContextUtils.java @@ -15,22 +15,18 @@ import org.springframework.stereotype.Component; @Component public class ApplicationContextUtils implements ApplicationContextAware { //放置在获取bean的时候提示空指针,将其定义为静态变量 - private static ApplicationContext context; + private static ApplicationContext applicationContext; - //类初始化完成之后调用setApplicationContext()方法进行操作 @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextUtils.context = applicationContext; + ApplicationContextUtils.applicationContext = applicationContext; } - public static ApplicationContext getContext(){ - return context; + public static T getBean(Class clazz) { + return applicationContext.getBean(clazz); } - public static Object getBean(String beanName){ - //在这一步的时候一定要注意,此时可调用这个方法的时候 - //context可能为空,会提示空指针异常,需要将其定义成静态的,这样类加载的时候 - //context就已经存在了 - return context.getBean(beanName); + public static Object getBean(String name) { + return applicationContext.getBean(name); } } diff --git a/src/main/java/cn/xf/basedemo/config/SaTokenConfigure.java b/src/main/java/cn/xf/basedemo/config/SaTokenConfigure.java new file mode 100644 index 0000000..fa44f18 --- /dev/null +++ b/src/main/java/cn/xf/basedemo/config/SaTokenConfigure.java @@ -0,0 +1,23 @@ +package cn.xf.basedemo.config; + +import cn.dev33.satoken.interceptor.SaInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @Description: sa token拦截器注册类 + * @ClassName: SaTokenConfigure + * @Author: xiongfeng + * @Date: 2025/8/24 20:30 + * @Version: 1.0 + */ +@Configuration +public class SaTokenConfigure implements WebMvcConfigurer { + // 注册 Sa-Token 拦截器,打开注解式鉴权功能 + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册 Sa-Token 拦截器,打开注解式鉴权功能 + registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**"); + } +} diff --git a/src/main/java/cn/xf/basedemo/controller/business/UserController.java b/src/main/java/cn/xf/basedemo/controller/business/UserController.java index 757ab8a..24aa2fe 100644 --- a/src/main/java/cn/xf/basedemo/controller/business/UserController.java +++ b/src/main/java/cn/xf/basedemo/controller/business/UserController.java @@ -1,5 +1,7 @@ package cn.xf.basedemo.controller.business; +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.stp.StpUtil; import cn.xf.basedemo.common.model.LoginUser; import cn.xf.basedemo.common.model.RetObj; import cn.xf.basedemo.interceptor.SessionContext; @@ -34,6 +36,7 @@ public class UserController { @Operation(summary = "用户信息", description = "用户信息") @PostMapping("/info") + @SaCheckPermission("user:info") public RetObj info(){ LoginUser loginUser = SessionContext.getInstance().get(); return RetObj.success(loginUser); @@ -51,4 +54,10 @@ public class UserController { return userService.getEsId(userId); } + @Operation(summary = "获取用户权限数据", description = "用户信息") + @GetMapping("/getPermission") + public RetObj getPermission(){ + return RetObj.success(StpUtil.getPermissionList()); + } + } diff --git a/src/main/java/cn/xf/basedemo/interceptor/InterceptorConfig.java b/src/main/java/cn/xf/basedemo/interceptor/InterceptorConfig.java index 08bdc00..2c0b13b 100644 --- a/src/main/java/cn/xf/basedemo/interceptor/InterceptorConfig.java +++ b/src/main/java/cn/xf/basedemo/interceptor/InterceptorConfig.java @@ -1,5 +1,6 @@ package cn.xf.basedemo.interceptor; +import cn.dev33.satoken.interceptor.SaInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; diff --git a/src/main/java/cn/xf/basedemo/interceptor/StpInterfaceImpl.java b/src/main/java/cn/xf/basedemo/interceptor/StpInterfaceImpl.java index c09cdfc..a2098d4 100644 --- a/src/main/java/cn/xf/basedemo/interceptor/StpInterfaceImpl.java +++ b/src/main/java/cn/xf/basedemo/interceptor/StpInterfaceImpl.java @@ -4,8 +4,6 @@ import cn.dev33.satoken.stp.StpInterface; import cn.xf.basedemo.common.utils.ApplicationContextUtils; import cn.xf.basedemo.mappers.SysPermissionMapper; import cn.xf.basedemo.mappers.SysRoleMapper; -import cn.xf.basedemo.model.domain.SysRole; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.springframework.stereotype.Component; import java.util.List; @@ -20,13 +18,14 @@ import java.util.List; @Component public class StpInterfaceImpl implements StpInterface { - private SysPermissionMapper sysPermissionMapper= (SysPermissionMapper) ApplicationContextUtils.getBean("SysPermissionMapper"); - private SysRoleMapper sysRoleMapper= (SysRoleMapper) ApplicationContextUtils.getBean("SysRoleMapper"); - + private SysPermissionMapper sysPermissionMapper = ApplicationContextUtils.getBean(SysPermissionMapper.class); + private SysRoleMapper sysRoleMapper = ApplicationContextUtils.getBean(SysRoleMapper.class); @Override public List getPermissionList(Object userId, String s) { //获取登录用户权限数据 - return sysPermissionMapper.getPermissionListByRoleId((Long) userId); + Long aLong = Long.valueOf(userId.toString()); + List permissionList = sysPermissionMapper.getPermissionListByRoleId(aLong); + return permissionList; } @Override diff --git a/src/main/java/cn/xf/basedemo/mappers/SysPermissionMapper.java b/src/main/java/cn/xf/basedemo/mappers/SysPermissionMapper.java index d8a2078..cfecd13 100644 --- a/src/main/java/cn/xf/basedemo/mappers/SysPermissionMapper.java +++ b/src/main/java/cn/xf/basedemo/mappers/SysPermissionMapper.java @@ -2,6 +2,7 @@ package cn.xf.basedemo.mappers; import cn.xf.basedemo.model.domain.SysPermission; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -11,6 +12,7 @@ import java.util.List; * @createDate 2025-08-19 21:22:03 * @Entity cn.xf.basedemo.model.domain.SysPermission */ +@Mapper public interface SysPermissionMapper extends BaseMapper { List getPermissionListByRoleId(Long useId); diff --git a/src/main/java/cn/xf/basedemo/mappers/SysRoleMapper.java b/src/main/java/cn/xf/basedemo/mappers/SysRoleMapper.java index 9eee13e..f8318c4 100644 --- a/src/main/java/cn/xf/basedemo/mappers/SysRoleMapper.java +++ b/src/main/java/cn/xf/basedemo/mappers/SysRoleMapper.java @@ -2,6 +2,7 @@ package cn.xf.basedemo.mappers; import cn.xf.basedemo.model.domain.SysRole; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -11,6 +12,7 @@ import java.util.List; * @createDate 2025-08-19 21:22:03 * @Entity cn.xf.basedemo.model.domain.SysRole */ +@Mapper public interface SysRoleMapper extends BaseMapper { List getRoleListByUserId(Long userId);