深圳网站建设有免费的吗教育类网站建设
web/
2025/10/8 11:27:35/
文章来源:
深圳网站建设有免费的吗,教育类网站建设,视频网站搭建源码,免费创建音乐网站目录
1.统一异常处理
2.统一记录日志 1.统一异常处理 在 HomeController 类中添加请求方法#xff08;服务器发生异常之后需要统一处理异常#xff0c;记录日志#xff0c;然后转到 500 页面#xff0c;需要人工处理重定向到 500 页面#xff0c;提前把 500 页面请求访问…目录
1.统一异常处理
2.统一记录日志 1.统一异常处理 在 HomeController 类中添加请求方法服务器发生异常之后需要统一处理异常记录日志然后转到 500 页面需要人工处理重定向到 500 页面提前把 500 页面请求访问配置 RequestMapping(path /error, method RequestMethod.GET)public String getErrorPage() {return /error/500;}
在 controller 类下新建 advice 包创建 ExceptionAdvice 类
添加注解 ControllerAdvice 统一处理异常此时这个组件会扫面所有的 Bean做一个限制 ControllerAdvice(annotations Controller.class)这个组件只去扫面带有 Controller 注解的 Bean添加所有方法处理所有错误情况添加注解 ExceptionHandler 表示这个方法处理所有异常的方法—— ExceptionHandler({Exception.class})通常参数为 Exception e, HttpServletRequest request, HttpServletResponse response注入日志并且把异常记录日志想要把异常非常详细的栈的信息记录遍历栈的信息得到的是数组每次遍历得到一条异常信息打印日志然后给浏览器响应重定向到错误页面这时候还需要判断这个请求是普通请求还是异步请求浏览器访问服务器可能是普通请求希望返回网页然后重定向到 500也可能是异步请求希望返回 JSON不可以返回到页面 HTML通过 request.getHeader(x-requested-with) 获取请求返回 String如果返回值等于 XMLHttpRequest则表示为异步请求这个请求是以 XML 的形式访问希望返回 XML只有异步请求才希望返回 XML普通请求返回 HTML然后响应字符串application/plain;charsetutf-8向浏览器返回普通字符串可以是 JSON 格式需要人为的将字符串转化为 JS 对象获取输出流输出JSON字符串如果是普通请求重定向到错误页面获取项目访问路径 /error 路径
package com.example.demo.controller.advice;import com.example.demo.util.CommunityUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;//添加注解 ControllerAdvice 统一处理异常此时这个组件会扫面所有的 Bean
//做一个限制 ControllerAdvice(annotations Controller.class)这个组件只去扫面带有 Controller 注解的 Bean
ControllerAdvice(annotations Controller.class)
public class ExceptionAdvice {private static final Logger logger LoggerFactory.getLogger(ExceptionAdvice.class);//添加所有方法处理所有错误情况添加注解 ExceptionHandler 表示这个方法处理所有异常的方法ExceptionHandler({Exception.class})public void handleException(Exception e, HttpServletRequest request,HttpServletResponse response) throws IOException {//注入日志并且把异常记录日志想要把异常非常详细的栈的信息记录// 遍历栈的信息得到的是数组每次遍历得到一条异常信息打印日志logger.error(服务器发生异常: e.getMessage());for (StackTraceElement element : e.getStackTrace()) {logger.error(element.toString());}//然后给浏览器响应重定向到错误页面//这时候还需要判断这个请求是普通请求还是异步请求浏览器访问服务器可能是普通请求希望返回网页然后重定向到 500// 也可能是异步请求希望返回 JSON不可以返回到页面 HTML//通过 request.getHeader(x-requested-with) 获取请求返回 String如果返回值等于 XMLHttpRequest则表示为异步请求// 这个请求是以 XML 的形式访问希望返回 XML只有异步请求才希望返回 XML普通请求返回 HTMLString xRequestedWith request.getHeader(x-requested-with);if (XMLHttpRequest.equals(xRequestedWith)) {// 然后响应字符串application/plain;charsetutf-8向浏览器返回普通字符串//可以是 JSON 格式需要人为的将字符串转化为 JS 对象response.setContentType(application/plain;charsetutf-8);//获取输出流输出JSON字符串如果是普通请求重定向到错误页面获取项目访问路径 /error 路径PrintWriter writer response.getWriter();writer.write(CommunityUtil.getJSONString(1, 服务器异常!));} else {response.sendRedirect(request.getContextPath() /error);}}
}2.统一记录日志 可不可以利用控制器通知统一处理控制器通知在发生异常时可以统一处理而统一记录日志并不是发生异常才记录可不可以使用拦截器拦截器也是针对控制器做处理而记录日志并不是只有在控制器中记录目前我们对业务组件做日志记录使用传统方法把记录日志的内容封装到组件中在不同的业务组件service方法中调用比如在一开始记录日志在写也业务方法之前记录日志。这种方法也有弊端业务组件方法是处理业务但是在之前添加日志需求不是业务需求是系统需求所以在业务方法中耦合了系统需求是有弊端的例如现在系统需求发生变化不想在业务之前记录日志而是在之后记录日志改动比较大很麻烦解决问题的最好方法将记录日志系统需求单独实现——使用 AOP单独定义一个组件不和业务组件发生直接关系将业务组件通用逻辑封装在这个组件中
对于 AOP 的知识可以阅读之前学习的 AOP 博客Spring AOP-CSDN博客
在 pom.xml 添加依赖
!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop --
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId
/dependency 对所有业务组件记录日志在业务组件一开始记录日志新建 aspect 包创建 ServiceLogAspect 类存放切面主键
添加注解 Component、Aspect实例化 Logger声明切点所有业务组件都去处理使用前置通知在业务组件一开始记录日志记录格式用户[1.2.3.4],在[xxx],访问了[com.example.demo.service.xxx()].用户 ip 通过 request 获取获取 requestRequestContextHolder.getRequestAttributes();拼接时间new Date然后实例化访问某个类某个方法类名 方法名给方法添加 JoinPoint 连接点参数连接点指代程序植入的目标方法最后再进行全部拼接
package com.example.demo.aspect;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;Component
Aspect
public class ServiceLogAspect {//实例化 Loggerprivate static final Logger logger LoggerFactory.getLogger(ServiceLogAspect.class);//声明切点所有业务组件都去处理Pointcut(execution(* com.example.demo.service.*.*(..)))public void pointcut() {}//使用前置通知在业务组件一开始记录日志Before(pointcut())public void before(JoinPoint joinPoint) {//记录格式用户[1.2.3.4],在[xxx],访问了[com.example.demo.service.xxx()].//用户 ip 通过 request 获取获取 requestRequestContextHolder.getRequestAttributes();ServletRequestAttributes attributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request attributes.getRequest();String ip request.getRemoteHost();//拼接时间new Date然后实例化String now new SimpleDateFormat(yyyy-MM-dd HH:mm:ss).format(new Date());//访问某个类某个方法类名 方法名给方法添加 JoinPoint 连接点参数连接点指代程序植入的目标方法String target joinPoint.getSignature().getDeclaringTypeName() . joinPoint.getSignature().getName();//全部拼接logger.info(String.format(用户[%s],在[%s],访问了[%s]., ip, now, target));}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/89026.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!