Skip to content

Commit 694f440

Browse files
committed
Merge pull request #151 from qq254963746/develop
add mapdb FailStore and other upgrade
2 parents 3533eec + f1b797b commit 694f440

34 files changed

+760
-100
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ public class LTSSpringConfig implements ApplicationContextAware {
295295
|job.max.retry.times|可选|10|JobTracker|addConfig("job.max.retry.times", "xx")|任务的最大重试次数|
296296
|lts.monitor.url|可选||JobTracker,TaskTracker|addConfig("lts.monitor.url", "xx")|监控中心地址,也就是LTS-Admin地址,如 http://localhost:8081|
297297
|stop.working|可选|false|TaskTracker|addConfig("stop.working", "true")|主要用于当TaskTracker与JobTracker出现网络隔离的时候,超过一定时间隔离之后,TaskTracker自动停止当前正在运行的任务|
298-
|job.fail.store|可选|leveldb|JobClient,TaskTracker|addConfig("job.fail.store", "leveldb")|可选值:leveldb(默认), rocksdb, berkeleydb, FailStore实现|
298+
|job.fail.store|可选|leveldb|JobClient,TaskTracker|addConfig("job.fail.store", "leveldb")|可选值:leveldb(默认), rocksdb, berkeleydb, mapdb FailStore实现, leveldb有问题的同学,可以试试mapdb|
299299
|lazy.job.logger|可选|false|JobTracker|addConfig("lazy.job.logger", "true")|可选值:ture,false, 是否延迟批量刷盘日志, 如果启用,采用队列的方式批量将日志刷盘(在应用关闭的时候,可能会造成日志丢失)|
300300
|dataPath|可选|user.home|JobClient,TaskTracker,JobTracker|setDataPath("xxxx")|FailStore文件存储路径及其它数据存储路径|
301301
|lts.monitor.interval|可选|1|JobClient,TaskTracker,JobTracker|addConfig("lts.monitor.interval", "2")|分钟,整数,建议1-5分钟|
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.lts.web.support.csrf;
2+
3+
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
4+
import org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler;
5+
6+
import javax.servlet.http.HttpServletRequest;
7+
import javax.servlet.http.HttpServletResponse;
8+
9+
/**
10+
* A Spring MVC <code>HandlerInterceptor</code> which is responsible to enforce CSRF token validity on incoming posts
11+
* requests. The interceptor should be registered with Spring MVC servlet using the following syntax:
12+
* <p/>
13+
* <mvc:interceptors>
14+
* <bean class="com.lts.web.support.csrf.CSRFHandlerInterceptor"/>
15+
* </mvc:interceptors>
16+
*
17+
* @author Robert HG ([email protected]) on 11/10/15.
18+
*/
19+
public class CSRFHandlerInterceptor extends HandlerInterceptorAdapter {
20+
21+
@Override
22+
public boolean preHandle(HttpServletRequest request,
23+
HttpServletResponse response, Object handler) throws Exception {
24+
25+
if (handler instanceof DefaultServletHttpRequestHandler) {
26+
return true;
27+
}
28+
29+
if (request.getMethod().equalsIgnoreCase("GET")) {
30+
return true;
31+
} else {
32+
String sessionToken = CSRFTokenManager.getToken(request.getSession());
33+
String requestToken = CSRFTokenManager.getToken(request);
34+
// 检查 csrf token是否正确
35+
if (sessionToken.equals(requestToken)) {
36+
return true;
37+
} else {
38+
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Bad or missing CSRF value");
39+
return false;
40+
}
41+
}
42+
}
43+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.lts.web.support.csrf;
2+
3+
import javax.servlet.http.HttpServletRequest;
4+
import javax.servlet.http.HttpSession;
5+
import java.util.UUID;
6+
7+
/**
8+
* @author Robert HG ([email protected]) on 11/10/15.
9+
*/
10+
public final class CSRFTokenManager {
11+
12+
static final String CSRF_PARAM_NAME = "csrfToken";
13+
14+
public final static String CSRF_TOKEN_FOR_SESSION_ATTR_NAME = CSRFTokenManager.class.getSimpleName() + ".token";
15+
16+
private CSRFTokenManager() {
17+
}
18+
19+
public static String getToken(HttpSession session) {
20+
String token = null;
21+
22+
synchronized (session) {
23+
token = (String) session.getAttribute(CSRF_TOKEN_FOR_SESSION_ATTR_NAME);
24+
if (null == token) {
25+
token = UUID.randomUUID().toString();
26+
session.setAttribute(CSRF_TOKEN_FOR_SESSION_ATTR_NAME, token);
27+
}
28+
}
29+
return token;
30+
}
31+
32+
public static String getToken(HttpServletRequest request) {
33+
String token = request.getParameter(CSRF_PARAM_NAME);
34+
if (token == null || "".equals(token)) {
35+
token = request.getHeader(CSRF_PARAM_NAME);
36+
}
37+
return token;
38+
}
39+
40+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.lts.web.support.csrf;
2+
3+
import javax.servlet.http.HttpServletRequest;
4+
5+
/**
6+
* 配置在 velocity tools 中
7+
*
8+
* <input type="hidden" name="csrfToken" value="$csrfTool.getToken($request)"/>
9+
*
10+
* @author Robert HG ([email protected]) on 11/10/15.
11+
*/
12+
public class CSRFTool {
13+
public static String getToken(HttpServletRequest request) {
14+
return CSRFTokenManager.getToken(request.getSession());
15+
}
16+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.lts.web.support.xss;
2+
3+
import javax.servlet.*;
4+
import javax.servlet.http.HttpServletRequest;
5+
import java.io.IOException;
6+
7+
/**
8+
* @author Robert HG ([email protected]) on 11/10/15.
9+
*/
10+
public class XssFilter implements Filter {
11+
12+
@Override
13+
public void init(FilterConfig filterConfig) throws ServletException {
14+
15+
}
16+
17+
@Override
18+
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
19+
20+
chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);
21+
22+
}
23+
24+
@Override
25+
public void destroy() {
26+
27+
}
28+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.lts.web.support.xss;
2+
3+
import javax.servlet.http.HttpServletRequest;
4+
import javax.servlet.http.HttpServletRequestWrapper;
5+
import java.util.List;
6+
import java.util.concurrent.CopyOnWriteArrayList;
7+
import java.util.regex.Pattern;
8+
9+
/**
10+
* @author Robert HG ([email protected]) on 11/10/15.
11+
*/
12+
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
13+
14+
public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {
15+
super(servletRequest);
16+
}
17+
18+
public String[] getParameterValues(String parameter) {
19+
String[] values = super.getParameterValues(parameter);
20+
if (values == null) {
21+
return null;
22+
}
23+
int count = values.length;
24+
String[] encodedValues = new String[count];
25+
for (int i = 0; i < count; i++) {
26+
encodedValues[i] = cleanXSS(values[i]);
27+
}
28+
return encodedValues;
29+
}
30+
31+
public String getParameter(String parameter) {
32+
String value = super.getParameter(parameter);
33+
if (value == null) {
34+
return null;
35+
}
36+
return cleanXSS(value);
37+
}
38+
39+
public String getHeader(String name) {
40+
String value = super.getHeader(name);
41+
if (value == null)
42+
return null;
43+
return cleanXSS(value);
44+
}
45+
46+
private static final List<Pattern> PATTERNS = new CopyOnWriteArrayList<Pattern>();
47+
48+
static {
49+
PATTERNS.add(Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE));
50+
PATTERNS.add(Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL));
51+
PATTERNS.add(Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL));
52+
PATTERNS.add(Pattern.compile("</script>", Pattern.CASE_INSENSITIVE));
53+
PATTERNS.add(Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL));
54+
PATTERNS.add(Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL));
55+
PATTERNS.add(Pattern.compile("e­xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL));
56+
PATTERNS.add(Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE));
57+
PATTERNS.add(Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE));
58+
PATTERNS.add(Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL));
59+
}
60+
61+
private String cleanXSS(String value) {
62+
if (value != null) {
63+
for (Pattern pattern : PATTERNS) {
64+
value = pattern.matcher(value).replaceAll("");
65+
}
66+
}
67+
return value;
68+
}
69+
70+
}

lts-admin/src/main/webapp/WEB-INF/views/templates/jobLogger.vm

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
<th>日志记录时间</th>
9595
<th data-hide="all">日志创建时间</th>
9696
<th>执行节点组</th>
97+
<th data-hide="all">执行节点标识</th>
9798
<th data-hide="phone,tablet">提交节点组</th>
9899
<th>日志类型</th>
99100
<th>执行结果</th>
@@ -114,6 +115,7 @@
114115
<td>{{row.logTime | dateFormat:'yyyy-MM-dd HH:mm:ss'}}</td>
115116
<td>{{row.gmtCreated | dateFormat:'yyyy-MM-dd HH:mm:ss'}}</td>
116117
<td>{{row.taskTrackerNodeGroup}}</td>
118+
<td>{{row.taskTrackerIdentity}}</td>
117119
<td>{{row.submitNodeGroup}}</td>
118120
<td>{{row.logType | format:'logTypeLabel'}}</td>
119121
<td>{{row.success | format:'successLabel'}}</td>
@@ -131,7 +133,7 @@
131133
{{/each}}
132134
{{if results == 0}}
133135
<tr>
134-
<td colspan="15">暂无数据</td>
136+
<td colspan="16">暂无数据</td>
135137
</tr>
136138
{{/if}}
137139
</tbody>

lts-core/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,5 +115,10 @@
115115
<artifactId>hessian</artifactId>
116116
<scope>provided</scope>
117117
</dependency>
118+
<dependency>
119+
<groupId>org.mapdb</groupId>
120+
<artifactId>mapdb</artifactId>
121+
<scope>provided</scope>
122+
</dependency>
118123
</dependencies>
119124
</project>
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.lts.core.commons.io;
2+
3+
import java.io.InputStream;
4+
5+
/**
6+
* @author Robert HG ([email protected])
7+
*/
8+
public class UnsafeByteArrayInputStream extends InputStream {
9+
10+
protected byte buf[];
11+
12+
protected int pos;
13+
14+
protected int mark = 0;
15+
16+
protected int count;
17+
18+
public UnsafeByteArrayInputStream(byte buf[]) {
19+
this.buf = buf;
20+
this.pos = 0;
21+
this.count = buf.length;
22+
}
23+
24+
public UnsafeByteArrayInputStream(byte buf[], int offset, int length) {
25+
this.buf = buf;
26+
this.pos = offset;
27+
this.count = Math.min(offset + length, buf.length);
28+
this.mark = offset;
29+
}
30+
31+
public int read() {
32+
return (pos < count) ? (buf[pos++] & 0xff) : -1;
33+
}
34+
35+
public int read(byte b[], int off, int len) {
36+
if (b == null) {
37+
throw new NullPointerException();
38+
} else if (off < 0 || len < 0 || len > b.length - off) {
39+
throw new IndexOutOfBoundsException();
40+
}
41+
42+
if (pos >= count) {
43+
return -1;
44+
}
45+
46+
int avail = count - pos;
47+
if (len > avail) {
48+
len = avail;
49+
}
50+
if (len <= 0) {
51+
return 0;
52+
}
53+
System.arraycopy(buf, pos, b, off, len);
54+
pos += len;
55+
return len;
56+
}
57+
58+
public long skip(long n) {
59+
long k = count - pos;
60+
if (n < k) {
61+
k = n < 0 ? 0 : n;
62+
}
63+
64+
pos += k;
65+
return k;
66+
}
67+
68+
public int available() {
69+
return count - pos;
70+
}
71+
72+
public boolean markSupported() {
73+
return true;
74+
}
75+
76+
public void mark(int readAheadLimit) {
77+
mark = pos;
78+
}
79+
80+
public void reset() {
81+
pos = mark;
82+
}
83+
84+
}

0 commit comments

Comments
 (0)