Browse Source

后端整合模块

detached
huangqizhen 5 months ago
parent
commit
80bd996d75
  1. 1
      pom.xml
  2. 2
      src/main/java/com/example/demo/Util/RequestWrapper.java
  3. 2
      src/main/java/com/example/demo/domain/entity/Recharge.java
  4. 5
      src/main/java/com/example/demo/security/SecurityConfig.java
  5. 88
      src/main/java/com/example/demo/security/TokenFilter.java
  6. 21
      src/main/java/com/example/demo/security/UploadFilter.java

1
pom.xml

@ -44,6 +44,7 @@
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId> <artifactId>spring-boot-starter-security</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

2
src/main/java/com/example/demo/Util/RequestWrapper.java

@ -26,7 +26,7 @@ public class RequestWrapper extends HttpServletRequestWrapper {
// 将body数据存储起来 // 将body数据存储起来
String bodyStr = getBodyString(request); String bodyStr = getBodyString(request);
body = bodyStr.getBytes(Charset.defaultCharset()); body = bodyStr.getBytes(Charset.defaultCharset());
// System.out.println(new String(body, Charset.defaultCharset()) + "+**+*+*+*++*+*+*+");
System.out.println(new String(body, Charset.defaultCharset()) + "+**+*+*+*++*+*+*+");
} }

2
src/main/java/com/example/demo/domain/entity/Recharge.java

@ -33,5 +33,5 @@ public class Recharge {
private Date endDate; private Date endDate;
private String orderCode; private String orderCode;
private String token; private String token;
private Integer rateId;
} }

5
src/main/java/com/example/demo/security/SecurityConfig.java

@ -67,9 +67,8 @@ public class SecurityConfig {
).permitAll() ).permitAll()
.anyRequest().authenticated() // 其它路径必须要登录后才能访问 .anyRequest().authenticated() // 其它路径必须要登录后才能访问
); );
// 配置Token过滤器, 将过滤器加入到执行链中
http.addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class);
// http.addFilterBefore(uploadFilter, UsernamePasswordAuthenticationFilter.class);
// http.addFilterBefore(uploadFilter, UsernamePasswordAuthenticationFilter.class); // 确保UploadFilter是第一个
http.addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class); // 然后是TokenFilter
return http.build(); return http.build();
} }

88
src/main/java/com/example/demo/security/TokenFilter.java

@ -52,6 +52,72 @@
// filterChain.doFilter(request, response); // filterChain.doFilter(request, response);
// } // }
//} //}
//package com.example.demo.security;
//
//import com.example.demo.Util.JWTUtil;
//import com.example.demo.Util.RequestWrapper;
//import com.example.demo.Util.TokenPayload;
//import com.example.demo.domain.entity.Admin;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import jakarta.servlet.FilterChain;
//import jakarta.servlet.ServletException;
//import jakarta.servlet.http.HttpServletRequest;
//import jakarta.servlet.http.HttpServletResponse;
//import org.springframework.core.annotation.Order;
//import org.springframework.security.access.prepost.PreFilter;
//import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
//import org.springframework.security.core.context.SecurityContextHolder;
//import org.springframework.security.core.userdetails.UserDetails;
//import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
//import org.springframework.stereotype.Component;
//import org.springframework.util.ObjectUtils;
//import org.springframework.util.StringUtils;
//import org.springframework.web.filter.OncePerRequestFilter;
//import java.io.IOException;
//import java.io.InputStream;
//
//
//@Component
//public class TokenFilter extends OncePerRequestFilter {
//
// @Override
// protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
// throws ServletException, IOException {
// // 使用RequestWrapper包装原始的HttpServletRequest使其输入流可以被重复读取
// RequestWrapper requestWrapper = new RequestWrapper(request);
// // 确保请求体只被读取一次
// boolean hasRequestBody = "POST".equals(requestWrapper.getMethod());
// System.out.println("/*-/*-/*"+requestWrapper.getBodyString());
// if (hasRequestBody) {
// // 获取输入流
// InputStream inputStream = requestWrapper.getInputStream();
// // 使用Jackson ObjectMapper解析JSON
// ObjectMapper objectMapper = new ObjectMapper();
// TokenPayload tokenPayload = objectMapper.readValue(inputStream, TokenPayload.class);
//
// // 检查tokenPayload中是否存在token属性并且这个属性不为空
// String token = tokenPayload.getToken();
// if (StringUtils.hasText(token)) {
// try {
// UserDetails userDetails = JWTUtil.getUserDetailsList(token, Admin.class);
// if (!ObjectUtils.isEmpty(userDetails)) {
// // 将这个用户注册到Security中
// UsernamePasswordAuthenticationToken authenticationToken
// = new UsernamePasswordAuthenticationToken(
// userDetails, null,
// userDetails.getAuthorities());
// authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(requestWrapper));
// SecurityContextHolder.getContext().setAuthentication(authenticationToken);
// }
// } catch (Exception e) {
// e.printStackTrace();
// // Token无效可以在这里添加相应的处理逻辑例如返回401状态码等
// }
// }
// }
// filterChain.doFilter(requestWrapper, response); // 注意这里使用requestWrapper
// }
//}
package com.example.demo.security; package com.example.demo.security;
import com.example.demo.Util.JWTUtil; import com.example.demo.Util.JWTUtil;
@ -63,7 +129,7 @@ import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException; import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreFilter;
import org.springframework.core.annotation.Order;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
@ -75,31 +141,36 @@ import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@Component @Component
public class TokenFilter extends OncePerRequestFilter { public class TokenFilter extends OncePerRequestFilter {
@Override @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException { throws ServletException, IOException {
// 检查是否是上传请求
boolean isUploadRequest = request.getRequestURI().startsWith("/upload");
System.out.println(request.getRequestURI());
System.out.println(isUploadRequest);
if (isUploadRequest) {
// 如果是上传请求直接将请求传递给下一个过滤器或目标资源
filterChain.doFilter(request, response);
return;
} else {
// 使用RequestWrapper包装原始的HttpServletRequest使其输入流可以被重复读取 // 使用RequestWrapper包装原始的HttpServletRequest使其输入流可以被重复读取
RequestWrapper requestWrapper = new RequestWrapper(request); RequestWrapper requestWrapper = new RequestWrapper(request);
// 确保请求体只被读取一次 // 确保请求体只被读取一次
boolean hasRequestBody = "POST".equals(requestWrapper.getMethod()); boolean hasRequestBody = "POST".equals(requestWrapper.getMethod());
System.out.println(hasRequestBody);
if (hasRequestBody) { if (hasRequestBody) {
// 获取输入流 // 获取输入流
InputStream inputStream = requestWrapper.getInputStream(); InputStream inputStream = requestWrapper.getInputStream();
// 使用Jackson ObjectMapper解析JSON // 使用Jackson ObjectMapper解析JSON
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
TokenPayload tokenPayload = objectMapper.readValue(inputStream, TokenPayload.class); TokenPayload tokenPayload = objectMapper.readValue(inputStream, TokenPayload.class);
System.out.println(tokenPayload + "/*/*/*/*/*/*/*");
// 检查tokenPayload中是否存在token属性并且这个属性不为空 // 检查tokenPayload中是否存在token属性并且这个属性不为空
String token = tokenPayload.getToken(); String token = tokenPayload.getToken();
System.out.println(token + "*-*-*-*-*-*-*");
if (StringUtils.hasText(token)) { if (StringUtils.hasText(token)) {
try { try {
System.out.println(token + "*-*-*-*-*-*-*");
UserDetails userDetails = JWTUtil.getUserDetailsList(token, Admin.class); UserDetails userDetails = JWTUtil.getUserDetailsList(token, Admin.class);
if (!ObjectUtils.isEmpty(userDetails)) { if (!ObjectUtils.isEmpty(userDetails)) {
// 将这个用户注册到Security中 // 将这个用户注册到Security中
@ -115,8 +186,9 @@ public class TokenFilter extends OncePerRequestFilter {
// Token无效可以在这里添加相应的处理逻辑例如返回401状态码等 // Token无效可以在这里添加相应的处理逻辑例如返回401状态码等
} }
} }
System.out.println(token + "*-*-*-*-*-*");
} }
filterChain.doFilter(requestWrapper, response); // 注意这里使用requestWrapper
// 非上传请求继续执行过滤器链
filterChain.doFilter(requestWrapper, response);
}
} }
} }

21
src/main/java/com/example/demo/security/UploadFilter.java

@ -4,21 +4,34 @@
//import jakarta.servlet.ServletException; //import jakarta.servlet.ServletException;
//import jakarta.servlet.http.HttpServletRequest; //import jakarta.servlet.http.HttpServletRequest;
//import jakarta.servlet.http.HttpServletResponse; //import jakarta.servlet.http.HttpServletResponse;
//import org.springframework.core.annotation.Order;
//import org.springframework.stereotype.Component;
//import org.springframework.web.filter.OncePerRequestFilter; //import org.springframework.web.filter.OncePerRequestFilter;
//import org.springframework.web.multipart.MultipartResolver;
// //
//import java.io.IOException; //import java.io.IOException;
// //
//
//@Component
//public class UploadFilter extends OncePerRequestFilter { //public class UploadFilter extends OncePerRequestFilter {
// //
// private final MultipartResolver multipartResolver;
//
// public UploadFilter(MultipartResolver multipartResolver) {
// this.multipartResolver = multipartResolver;
// }
//
// @Override // @Override
// protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) // protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
// throws ServletException, IOException { // throws ServletException, IOException {
// //
// // 检查请求是否为上传请求这里假设上传请求的路径以 "/upload" 开头 // // 检查请求是否为上传请求这里假设上传请求的路径以 "/upload" 开头
// boolean isUploadRequest = request.getRequestURI().startsWith("/upload"); // boolean isUploadRequest = request.getRequestURI().startsWith("/upload");
//
// if (isUploadRequest) {
// // 如果是上传请求直接将请求传递给下一个过滤器或目标资源
// System.out.println(isUploadRequest);
// System.out.println("MultipartResolver: " + multipartResolver);
// if (isUploadRequest ) {
// System.out.println("执行upload-------------------------------");
// // 如果是上传请求且Content-Type为multipart/form-data直接将请求传递给下一个过滤器或目标资源
// filterChain.doFilter(request, response); // filterChain.doFilter(request, response);
// } else { // } else {
// // 如果不是上传请求执行一些自定义逻辑 // // 如果不是上传请求执行一些自定义逻辑
@ -28,6 +41,4 @@
// filterChain.doFilter(request, response); // filterChain.doFilter(request, response);
// } // }
// } // }
//
//
//} //}
Loading…
Cancel
Save