出现这种问题的原因一般都是因为项目中还配置了 GlobalExceptionHandler 或者 AllExceptionHandler 大概懂这个意思就行。也就是统一异常返回。
我定义的统一异常返回是这样的:
/**
* @author kerwim
* Date: 2022/8/10 17:15
* 异常全局处理
*/
@ControllerAdvice
public class AllExceptionHandler {
//运行处理异常,处理Exception的异常
@ExceptionHandler(Exception.class)
@ResponseBody
public ResponseResult doException(Exception e){
e.printStackTrace();
return ResponseResult.errorResult(-999,"系统异常");
}
}
因为定义了这个所以没有我定义自定义的返回没有生效
我定义的返回没权限是这样的
@Component
public class AccessDeniedHandlerImpl implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request,
HttpServletResponse response,
AccessDeniedException accessDeniedException)
throws IOException, ServletException {
ResponseResult result = new ResponseResult(HttpStatus.FORBIDDEN.value(),"您的权限不足");
String json = JSON.toJSONString(result);
//处理异常
WebUtils.renderString(response,json);
}
webutils是个工具类 也列出来吧
public class WebUtils
{
/**
* 将字符串渲染到客户端
*
* @param response 渲染对象
* @param string 待渲染的字符串
* @return null
*/
public static String renderString(HttpServletResponse response, String string) {
try
{
response.setStatus(200);
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
response.getWriter().print(string);
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
}
结局方法就是 在定义一个自定义的 AccessDeniedExceptionHandler 即可
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* 全局捕获权限不足异常
*/
@ControllerAdvice
public class AccessDeniedExceptionHandler {
@ExceptionHandler(AccessDeniedException.class)
public void accessDeniedException(AccessDeniedException e) throws AccessDeniedException {
throw e;
}
}