Skip to content

Commit 7c7c9ce

Browse files
committed
update logging
1 parent edaf540 commit 7c7c9ce

File tree

20 files changed

+332
-73
lines changed

20 files changed

+332
-73
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ a.out
77

88
# Log file
99
*.log
10+
*.log.lck
1011

1112
# BlueJ files
1213
*.ctxt

domain-driven-design/java-web/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ java-web/
3232
│ │ │ │ │ ├── Router.java # 基础路由工具设置
3333
│ │ │ │ │ ├── OrderRoutes.java # 订单路由配置
3434
│ │ │ │ ├── middleware/ # 中间件(例如:鉴权、日志、拦截等)
35-
│ │ │ │ │ └── LoggingMiddleware.java # 日志中间件
35+
│ │ │ │ │ └── LoggingFilter.java # 日志中间件,java通常使用Filter
3636
│ │ │ │ └── config/ # 应用层配置(管理服务器和应用信息)
3737
│ │ │ │ │ └── ServiceConfig.java # 服务器与环境配置
3838
│ │ │ │ └── utils/ # 实用工具

domain-driven-design/java-web/src/main/java/com/javaweborder/Application.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import com.javaweborder.interfaces.controllers.OrderController;
88
import com.javaweborder.interfaces.routes.OrderRoutes;
99
import com.javaweborder.interfaces.routes.Router;
10-
import com.javaweborder.middleware.LoggingMiddleware;
1110

1211
import javax.servlet.*;
1312
import javax.servlet.annotation.WebListener;

domain-driven-design/java-web/src/main/java/com/javaweborder/TomcatServer.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@ public static void main(String[] args) {
2727
connector.setURIEncoding("UTF-8");
2828
connector.setUseBodyEncodingForURI(true);
2929

30-
// 创建空上下文(使用当前根目录,无webapp)
31-
// Context context = tomcat.addContext("", new File(".").getAbsolutePath());
32-
3330
// 创建Web上下文,创建webapp目录
3431
File webappDir = new File("src/main/webapp");
3532
if (!webappDir.exists()) webappDir.mkdirs();
@@ -42,10 +39,6 @@ public static void main(String[] args) {
4239
classesDir.getAbsolutePath(), "/"));
4340
context.setResources(resources);
4441

45-
// 可选配置
46-
// context.addLifecycleListener(new Tomcat.FixContextListener());
47-
// context.setParentClassLoader(TomcatServer.class.getClassLoader());
48-
4942
// 显式启用注解扫描
5043
context.setAddWebinfClassesResources(true);
5144

domain-driven-design/java-web/src/main/java/com/javaweborder/interfaces/controllers/OrderController.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,24 @@ public OrderController() {
2424

2525
// 创建订单:对应 POST /orders
2626
public void createOrder(HttpServletRequest request, HttpServletResponse response) throws IOException {
27+
OrderRequest body = new OrderRequest();
2728
try {
2829
// 解析请求体
29-
OrderRequest body = BodyParserUtils.parseRequestBody(request, OrderRequest.class);
30-
String customerName = body.getCustomerName();
30+
body = BodyParserUtils.parseRequestBody(request, OrderRequest.class);
31+
} catch (Exception e) {
32+
ResponseUtils.sendJsonError(response, 500, "请求错误:请检查参数", null);
33+
}
3134

35+
try {
36+
String customerName = body.getCustomerName();
3237
// 将订单金额转换为数字,校验是否有效
3338
double amount = parseAmount(body.getAmount());
3439
OrderDTO order = orderService.createOrder(customerName, amount);
3540
ResponseUtils.sendJsonResponse(response, 201, order, null);
3641
} catch (IllegalArgumentException e) {
3742
ResponseUtils.sendJsonError(response, 400, e.getMessage(), null);
3843
} catch (Exception e) {
39-
ResponseUtils.sendJsonError(response, 500, "内部错误:订单已存在", null);
44+
ResponseUtils.sendJsonError(response, 500, "内部错误:订单保存失败", null);
4045
}
4146
}
4247

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.javaweborder.interfaces.response;
2+
3+
public class ResponseBody {
4+
private final int status;
5+
private final Object message;
6+
7+
public ResponseBody(int status, Object message) {
8+
this.status = status;
9+
this.message = message;
10+
}
11+
12+
public int getStatus() {
13+
return status;
14+
}
15+
16+
public Object getMessage() {
17+
return message;
18+
}
19+
}

domain-driven-design/java-web/src/main/java/com/javaweborder/interfaces/routes/Router.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,12 @@ protected void service(HttpServletRequest req, HttpServletResponse resp) throws
8888
String path = req.getRequestURI().substring(req.getContextPath().length());
8989
String method = req.getMethod().toUpperCase();
9090

91-
LogUtils.logInfo("Request URI: " + req.getRequestURI());
92-
LogUtils.logInfo("Context Path: " + req.getContextPath());
93-
LogUtils.logInfo("Processed Path: " + path);
94-
LogUtils.logInfo("out Received request: " + method + " " + path);
91+
/* 关闭打印,调试再打开
92+
// LogUtils.logInfo("Request URI: " + req.getRequestURI());
93+
// LogUtils.logInfo("Context Path: " + req.getContextPath());
94+
// LogUtils.logInfo("Processed Path: " + path);
95+
// LogUtils.logInfo("out Received request: " + method + " " + path);
96+
*/
9597

9698
for (Route route : routes) {
9799
Matcher matcher = route.pattern.matcher(path);
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package com.javaweborder.middleware;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.javaweborder.interfaces.response.ResponseBody;
5+
6+
import javax.servlet.*;
7+
import javax.servlet.annotation.WebFilter;
8+
import javax.servlet.http.HttpServletRequest;
9+
import javax.servlet.http.HttpServletResponse;
10+
import java.io.IOException;
11+
import java.util.Arrays;
12+
import java.util.HashSet;
13+
import java.util.Set;
14+
15+
@WebFilter("/*") // 拦截所有请求,进行权限校验,Filter执行顺序按首字母排序
16+
public class AuthorizationFilter implements Filter {
17+
private static final ObjectMapper objectMapper = new ObjectMapper();
18+
19+
// 公开路径白名单(无需认证)
20+
private static final Set<String> ALLOWED_PATHS = new HashSet<>(Arrays.asList(
21+
"/login", "/public", "/error"
22+
));
23+
24+
@Override
25+
public void init(FilterConfig filterConfig) {
26+
System.out.println("AuthorizationFilter initialized.");
27+
}
28+
29+
@Override
30+
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
31+
throws IOException, ServletException {
32+
HttpServletRequest httpRequest = (HttpServletRequest) request;
33+
HttpServletResponse httpResponse = (HttpServletResponse) response;
34+
System.out.println("AuthorizationFilter: Filter is executing.");
35+
String path = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length());
36+
37+
// 白名单路径直接放行,根据需要设置
38+
// if (isAllowed(path)) {
39+
// chain.doFilter(request, response);
40+
// return;
41+
// }
42+
43+
try {
44+
// 1. 验证用户是否登录(示例:检查Token)
45+
String token = httpRequest.getHeader("Authorization");
46+
// 如有token就校验token
47+
if (token != null && !validateToken(token)) {
48+
sendError(httpResponse, HttpServletResponse.SC_UNAUTHORIZED, "未提供有效凭证");
49+
return;
50+
}
51+
52+
// 2. 验证用户权限(示例:检查角色或权限)
53+
String requiredRole = "admin";
54+
if (!hasPermission(token, requiredRole)) {
55+
sendError(httpResponse, HttpServletResponse.SC_FORBIDDEN, "无权访问此资源");
56+
return;
57+
}
58+
59+
// 权限验证通过,继续执行后续逻辑
60+
chain.doFilter(request, response);
61+
} catch (Exception e) {
62+
sendError(httpResponse, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "权限验证异常");
63+
}
64+
}
65+
66+
@Override
67+
public void destroy() {
68+
// 清理资源(可选)
69+
}
70+
71+
// 判断是否为公开路径
72+
private boolean isAllowed(String path) {
73+
return ALLOWED_PATHS.contains(path);
74+
}
75+
76+
// 模拟Token验证逻辑(替换为实际验证逻辑)
77+
private boolean validateToken(String token) {
78+
// 示例:检查Token有效性(如JWT解析),此处假使为true
79+
return token.startsWith("Bearer ");
80+
}
81+
82+
// 模拟权限验证逻辑(替换为实际业务逻辑)
83+
private boolean hasPermission(String token, String requiredRole) {
84+
// 示例:从Token中解析用户角色并验证
85+
String userRole = "admin"; // 实际应从数据库或缓存获取
86+
return requiredRole.equals(userRole);
87+
}
88+
89+
// 返回JSON格式错误响应
90+
private void sendError(HttpServletResponse response, int status, String message) throws IOException {
91+
response.setStatus(status);
92+
response.setContentType("application/json;charset=UTF-8");
93+
ResponseBody errorResponse = new ResponseBody(status, message);
94+
objectMapper.writeValue(response.getWriter(), errorResponse);
95+
}
96+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.javaweborder.middleware;
2+
3+
import javax.servlet.http.HttpServletResponse;
4+
import javax.servlet.http.HttpServletResponseWrapper;
5+
import java.io.CharArrayWriter;
6+
import java.io.IOException;
7+
import java.io.PrintWriter;
8+
9+
// 创建ServletResponseWrapper 用于捕获响应的状态码和输出内容,并将输出内容到CharArrayWriter中
10+
public class CustomServletResponseWrapper extends HttpServletResponseWrapper {
11+
private int httpStatus = SC_OK;
12+
private final CharArrayWriter charArray = new CharArrayWriter();
13+
private PrintWriter writer;
14+
15+
public CustomServletResponseWrapper(HttpServletResponse response) {
16+
super(response);
17+
}
18+
19+
@Override
20+
public void sendError(int sc) throws IOException {
21+
this.httpStatus = sc;
22+
setStatus(sc);
23+
}
24+
25+
@Override
26+
public void sendError(int sc, String msg) throws IOException {
27+
this.httpStatus = sc;
28+
setStatus(sc);
29+
}
30+
31+
@Override
32+
public void setStatus(int sc) {
33+
super.setStatus(sc);
34+
this.httpStatus = sc;
35+
}
36+
37+
@Override
38+
public int getStatus() {
39+
return httpStatus;
40+
}
41+
42+
@Override
43+
public PrintWriter getWriter() {
44+
if (writer == null) {
45+
writer = new PrintWriter(charArray);
46+
}
47+
return writer;
48+
}
49+
50+
public String getOutput() {
51+
return charArray.toString();
52+
}
53+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.javaweborder.middleware;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.javaweborder.interfaces.response.ResponseBody;
5+
6+
import javax.servlet.*;
7+
import javax.servlet.annotation.WebFilter;
8+
import javax.servlet.http.HttpServletResponse;
9+
import java.io.IOException;
10+
11+
// 在过滤器的 doFilter 方法中,自定义包装器来响应对象,并针对状态码进行不同处理,以返回自定义错误页面
12+
@WebFilter("/*")
13+
public class GlobalExceptionFilter implements Filter {
14+
private static final ObjectMapper objectMapper = new ObjectMapper();
15+
16+
@Override
17+
public void init(FilterConfig filterConfig) {
18+
System.out.println("GlobalExceptionFilter initialized.");
19+
}
20+
21+
@Override
22+
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
23+
throws IOException, ServletException {
24+
HttpServletResponse httpResponse = (HttpServletResponse) response;
25+
CustomServletResponseWrapper responseWrapper = new CustomServletResponseWrapper(httpResponse);
26+
System.out.println("GlobalExceptionFilter: Filter is executing.");
27+
try {
28+
chain.doFilter(request, responseWrapper);
29+
} catch (Exception e) {
30+
handleException(httpResponse, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "服务器内部错误");
31+
return;
32+
}
33+
34+
int status = responseWrapper.getStatus();
35+
if (status >= 400) {
36+
handleException(httpResponse, status, getErrorMessage(status));
37+
return;
38+
}
39+
40+
// 正常响应写入内容
41+
String content = responseWrapper.getOutput();
42+
if (!content.isEmpty()) {
43+
response.getWriter().write(content);
44+
}
45+
}
46+
47+
private String getErrorMessage(int status) {
48+
switch (status) {
49+
case 404:
50+
return "资源未找到";
51+
case 401:
52+
return "未经授权";
53+
case 403:
54+
return "禁止访问";
55+
case 500:
56+
return "服务器内部错误";
57+
default:
58+
return "请求错误";
59+
}
60+
}
61+
62+
private void handleException(HttpServletResponse response, int status, String message) throws IOException {
63+
response.reset(); // 重置响应,确保自定义内容可写入
64+
response.setStatus(status);
65+
response.setContentType("application/json;charset=UTF-8");
66+
ResponseBody errorResponse = new ResponseBody(status, message);
67+
objectMapper.writeValue(response.getWriter(), errorResponse);
68+
}
69+
70+
@Override
71+
public void destroy() {
72+
}
73+
}

0 commit comments

Comments
 (0)