Skip to content

Commit 02c97fe

Browse files
authored
Add sentinel servlet adapter demo (#3422)
1 parent 3892514 commit 02c97fe

File tree

6 files changed

+216
-0
lines changed

6 files changed

+216
-0
lines changed

sentinel-demo/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
<module>sentinel-demo-annotation-cdi-interceptor</module>
4343
<module>sentinel-demo-motan</module>
4444
<module>sentinel-demo-transport-spring-mvc</module>
45+
<module>sentinel-demo-servlet</module>
4546
</modules>
4647

4748
<dependencies>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>sentinel-parent</artifactId>
7+
<groupId>com.alibaba.csp</groupId>
8+
<version>1.8.8</version>
9+
<relativePath>../../pom.xml</relativePath>
10+
</parent>
11+
<modelVersion>4.0.0</modelVersion>
12+
13+
<artifactId>sentinel-demo-servlet</artifactId>
14+
<packaging>war</packaging>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>javax.servlet</groupId>
19+
<artifactId>javax.servlet-api</artifactId>
20+
<version>3.0.1</version>
21+
<scope>provided</scope>
22+
</dependency>
23+
24+
<dependency>
25+
<groupId>com.alibaba.csp</groupId>
26+
<artifactId>sentinel-core</artifactId>
27+
</dependency>
28+
29+
<dependency>
30+
<groupId>com.alibaba.csp</groupId>
31+
<artifactId>sentinel-transport-simple-http</artifactId>
32+
</dependency>
33+
34+
<dependency>
35+
<groupId>com.alibaba.csp</groupId>
36+
<artifactId>sentinel-web-servlet</artifactId>
37+
<version>${project.version}</version>
38+
</dependency>
39+
</dependencies>
40+
41+
<build>
42+
<pluginManagement>
43+
<plugins>
44+
<plugin>
45+
<groupId>org.apache.maven.plugins</groupId>
46+
<artifactId>maven-war-plugin</artifactId>
47+
<version>3.3.2</version>
48+
<configuration>
49+
<warName>sentinel-demo-servlet</warName>
50+
</configuration>
51+
</plugin>
52+
</plugins>
53+
</pluginManagement>
54+
</build>
55+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.alibaba.csp.sentinel.demo.servlet.config;
2+
3+
import com.alibaba.csp.sentinel.adapter.servlet.callback.DefaultUrlBlockHandler;
4+
import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlCleaner;
5+
import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager;
6+
7+
import javax.servlet.ServletContextEvent;
8+
import javax.servlet.ServletContextListener;
9+
10+
/**
11+
* class description
12+
*
13+
* @author zhangxunwei
14+
* @date 2024/6/24
15+
*/
16+
public class SentinelConfig implements ServletContextListener {
17+
18+
@Override
19+
public void contextInitialized(ServletContextEvent servletContextEvent) {
20+
initConfig();
21+
}
22+
23+
public static void initConfig() {
24+
System.out.println("Init sentinel config");
25+
26+
WebCallbackManager.setUrlBlockHandler(new DefaultUrlBlockHandler());
27+
WebCallbackManager.setRequestOriginParser(request -> request.getHeader("S-user"));
28+
WebCallbackManager.setUrlCleaner(new MyUrlCleaner());
29+
}
30+
31+
static class MyUrlCleaner implements UrlCleaner {
32+
@Override
33+
public String clean(String originUrl) {
34+
if (originUrl.matches("/foo/\\d+")) {
35+
return "/foo/*";
36+
}
37+
38+
return originUrl;
39+
}
40+
}
41+
42+
@Override
43+
public void contextDestroyed(ServletContextEvent servletContextEvent) {
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.alibaba.csp.sentinel.demo.servlet.controller;
2+
3+
import javax.servlet.*;
4+
import javax.servlet.http.HttpServletRequest;
5+
import javax.servlet.http.HttpServletResponse;
6+
import java.io.IOException;
7+
8+
/**
9+
* class description
10+
*
11+
* @author zhangxunwei
12+
* @date 2024/6/24
13+
*/
14+
public class DefaultServlet implements Servlet {
15+
@Override
16+
public void init(ServletConfig servletConfig) throws ServletException {
17+
18+
}
19+
20+
@Override
21+
public ServletConfig getServletConfig() {
22+
return null;
23+
}
24+
25+
@Override
26+
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
27+
String path = ((HttpServletRequest) servletRequest).getPathInfo();
28+
29+
if (path.startsWith("/foo")) {
30+
handleFoo(servletRequest, servletResponse);
31+
} else if (path.startsWith("/bar")) {
32+
handleBar(servletRequest, servletResponse);
33+
} else {
34+
notFound(servletRequest, servletResponse);
35+
}
36+
}
37+
38+
private void notFound(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException {
39+
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
40+
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
41+
42+
httpServletResponse.setStatus(404);
43+
httpServletResponse.setContentType("text/plain");
44+
httpServletResponse.getWriter().write(httpServletRequest.getServletPath() + " not found.");
45+
httpServletResponse.getWriter().close();
46+
}
47+
48+
private void handleBar(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException {
49+
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
50+
51+
httpServletResponse.setStatus(200);
52+
httpServletResponse.setContentType("text/plain");
53+
httpServletResponse.getWriter().write("bar");
54+
httpServletResponse.getWriter().close();
55+
}
56+
57+
private void handleFoo(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException {
58+
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
59+
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
60+
String path = httpServletRequest.getPathInfo();
61+
String id = path.replaceAll("/foo/(\\d+)", "$1");
62+
63+
httpServletResponse.setStatus(200);
64+
httpServletResponse.setContentType("text/plain");
65+
httpServletResponse.getWriter().write("Hello " + id);
66+
httpServletResponse.getWriter().close();
67+
}
68+
69+
@Override
70+
public String getServletInfo() {
71+
return null;
72+
}
73+
74+
@Override
75+
public void destroy() {
76+
}
77+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
project.name=sentinel-demo-servlet
2+
csp.sentinel.dashboard.server=http://localhost:8081
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
5+
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
6+
7+
<servlet>
8+
<servlet-name>DefaultServlet</servlet-name>
9+
<servlet-class>com.alibaba.csp.sentinel.demo.servlet.controller.DefaultServlet</servlet-class>
10+
</servlet>
11+
12+
<servlet-mapping>
13+
<servlet-name>DefaultServlet</servlet-name>
14+
<url-pattern>/*</url-pattern>
15+
</servlet-mapping>
16+
17+
<!-- sentinel filter -->
18+
<filter>
19+
<filter-name>SentinelCommonFilter</filter-name>
20+
<filter-class>com.alibaba.csp.sentinel.adapter.servlet.CommonFilter</filter-class>
21+
<init-param>
22+
<param-name>HTTP_METHOD_SPECIFY</param-name>
23+
<param-value>true</param-value>
24+
</init-param>
25+
<init-param>
26+
<param-name>WEB_CONTEXT_UNIFY</param-name>
27+
<param-value>true</param-value>
28+
</init-param>
29+
</filter>
30+
31+
<filter-mapping>
32+
<filter-name>SentinelCommonFilter</filter-name>
33+
<url-pattern>/*</url-pattern>
34+
</filter-mapping>
35+
</web-app>
36+

0 commit comments

Comments
 (0)