Jelajahi Sumber

optimize: use AOP to handle exception

ggbocoder 2 tahun lalu
induk
melakukan
d2eeb47025

+ 5 - 0
pom.xml

@@ -93,6 +93,11 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-security</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+            <version>1.9.19</version>
+        </dependency>
 
 
     </dependencies>

+ 9 - 1
src/main/java/cn/seecoder/fdroidrepository/Controller/ForumPostController.java

@@ -6,12 +6,15 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Date;
 import java.util.List;
 
 @RestController
-@PreAuthorize("hasRole('ROLE_ADMIN')")
+@PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_ADMIN')" )
 @RequestMapping("/api/forum")
 public class ForumPostController {
     @Autowired
@@ -37,6 +40,11 @@ public class ForumPostController {
 
     @PostMapping("/posts")
     public ResponseEntity<String> savePost(@RequestBody ForumPost post) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        if(authentication!=null&& authentication.getName()!=null){
+            post.setUsername(authentication.getName());
+        }
+        post.setCreatedAt(new Date());
         forumPostService.savePost(post);
         return new ResponseEntity<>("Post saved successfully", HttpStatus.OK);
     }

+ 1 - 0
src/main/java/cn/seecoder/fdroidrepository/DataObject/Comment.java

@@ -14,6 +14,7 @@ import java.time.LocalDateTime;
 public class Comment {
     private Long commentId;
     private Long postId;
+    private Long targetId;
     private Long userId;
     private String content;
     private LocalDateTime createdAt;

+ 4 - 5
src/main/java/cn/seecoder/fdroidrepository/DataObject/ForumPost.java

@@ -1,11 +1,9 @@
 package cn.seecoder.fdroidrepository.DataObject;
 
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
+import lombok.*;
 
 import java.time.LocalDateTime;
+import java.util.Date;
 
 @Setter
 @Getter
@@ -14,7 +12,8 @@ import java.time.LocalDateTime;
 public class ForumPost {
     private Long postId;
     private Long userId;
+    private String username;
     private String title;
     private String content;
-    private LocalDateTime createdAt;
+    private Date createdAt;
 }

+ 7 - 1
src/main/java/cn/seecoder/fdroidrepository/Service/ServiceImpl/ForumPostServiceImpl.java

@@ -3,6 +3,7 @@ package cn.seecoder.fdroidrepository.Service.ServiceImpl;
 import cn.seecoder.fdroidrepository.DataObject.ForumPost;
 import cn.seecoder.fdroidrepository.Mapper.ForumPostMapper;
 import cn.seecoder.fdroidrepository.Service.ForumPostService;
+import cn.seecoder.fdroidrepository.security.SensitiveFilter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -15,6 +16,9 @@ public class ForumPostServiceImpl implements ForumPostService {
     @Autowired
     private ForumPostMapper forumPostMapper;
 
+    @Autowired
+    private SensitiveFilter sensitiveFilter;
+
     @Override
     public List<ForumPost> getAllPosts() {
         return forumPostMapper.findAll();
@@ -34,7 +38,9 @@ public class ForumPostServiceImpl implements ForumPostService {
 
     @Override
     public void savePost(ForumPost post) {
-        post.setCreatedAt(LocalDateTime.now());
+
+        post.setTitle(sensitiveFilter.filter(post.getTitle()));
+        post.setContent(sensitiveFilter.filter(post.getContent()));
         forumPostMapper.save(post);
     }
 }

+ 42 - 0
src/main/java/cn/seecoder/fdroidrepository/aspect/ServiceLogAspect.java

@@ -0,0 +1,42 @@
+package cn.seecoder.fdroidrepository.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 javax.xml.crypto.Data;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.logging.SimpleFormatter;
+
+@Component
+@Aspect
+public class ServiceLogAspect {
+    private static final Logger logger = LoggerFactory.getLogger(ServiceLogAspect.class);
+
+    // .*.* represents any class any method
+    // (..) represents no number limited
+    @Pointcut("execution(* cn.seecoder.fdroidrepository.Service.*.*(..))")
+    public void pointcut() {
+
+    }
+
+    @Before("pointcut()")
+    public void before(JoinPoint joinPoint){
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        HttpServletRequest request = attributes.getRequest();
+        String ip = request.getRemoteHost();
+        String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+        String target = joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName();
+        logger.info(String.format("用户[%s],在[%s],访问了[%s]。", ip, now, target));
+
+    }
+}

+ 49 - 0
src/main/java/cn/seecoder/fdroidrepository/exception/ExceptionAdvice.java

@@ -0,0 +1,49 @@
+package cn.seecoder.fdroidrepository.exception;
+
+
+
+import cn.seecoder.fdroidrepository.result.SingleResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+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.util.List;
+
+
+@ControllerAdvice(annotations = Controller.class)
+public class ExceptionAdvice {
+
+    private static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class);
+
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public SingleResult<?> handlerBindException(MethodArgumentNotValidException e){
+        logger.error("服务器发生异常: "+e.getMessage());
+        BindingResult result = e.getBindingResult();
+        if(result.hasErrors()){
+            List<FieldError> fieldErrorList = result.getFieldErrors();
+            for(FieldError fieldError: fieldErrorList){
+                logger.error(fieldError.toString());
+            }
+        }
+        return SingleResult.failure("500",e.getMessage());
+    }
+
+    @ExceptionHandler({Exception.class})
+    public SingleResult<?> handleException(Exception e, HttpServletRequest request, HttpServletResponse reponse) throws IOException {
+        logger.error("服务器发生异常: "+ e.getMessage());
+        for(StackTraceElement element: e.getStackTrace()) {
+            logger.error(element.toString());
+        }
+        return SingleResult.failure("500",e.getMessage());
+
+    }
+}