Skip to content

Commit 543df58

Browse files
committed
Examples_of_GoF_Design_Patterns_in_Java\'s_core_libraries.md How_to_generate_a_random_alpha-numeric_string.md 同步代码,暂未翻译完成,请不要同步到 trunk 分支上
1 parent 4b818bc commit 543df58

2 files changed

+68
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Java 源码里的设计模式
2+
3+
[维基百科](https://en.wikipedia.org/wiki/Software_design_pattern#Classification_and_list) 中,可以让你对大部分设计模式有一个概览,而且它页指出了那些设计模式是 GoF 中规范.下面列出可以从 JavaSE 和 JavaEE API 中找到的设计模式:
4+
5+
## 创建型模式
6+
7+
### 抽象工厂
8+
9+
- [javax.xml.parsers.DocumentBuilderFactory#newInstance()](http://docs.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html#newInstance%28%29)
10+
- [javax.xml.transform.TransformerFactory#newInstance()](http://docs.oracle.com/javase/6/docs/api/javax/xml/transform/TransformerFactory.html#newInstance%28%29)
11+
- [javax.xml.xpath.XPathFactory#newInstance()](http://docs.oracle.com/javase/6/docs/api/javax/xml/xpath/XPathFactory.html#newInstance%28%29)
12+
13+
### 建造者模式
14+
15+
- [java.lang.StringBuilder#append()](http://docs.oracle.com/javase/6/docs/api/java/lang/StringBuilder.html#append%28boolean%29)(非同步)
16+
- [java.lang.StringBuffer#append()](http://docs.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html#append%28boolean%29)(同步)
17+
- [java.nio.ByteBuffer#put()](http://docs.oracle.com/javase/6/docs/api/java/nio/ByteBuffer.html#put%28byte%29)(类似的还有, [CharBuffer](http://docs.oracle.com/javase/6/docs/api/java/nio/CharBuffer.html#put%28char%29), [ShortBuffer](http://docs.oracle.com/javase/6/docs/api/java/nio/ShortBuffer.html#put%28short%29), [IntBuffer](http://docs.oracle.com/javase/6/docs/api/java/nio/IntBuffer.html#put%28int%29), [LongBuffer](http://docs.oracle.com/javase/6/docs/api/java/nio/LongBuffer.html#put%28long%29), [FloatBuffer](http://docs.oracle.com/javase/6/docs/api/java/nio/FloatBuffer.html#put%28float%29)[DoubleBuffer](http://docs.oracle.com/javase/6/docs/api/java/nio/DoubleBuffer.html#put%28double%29))
18+
- [javax.swing.GroupLayout.Group#addComponent()](http://docs.oracle.com/javase/6/docs/api/javax/swing/GroupLayout.Group.html#addComponent%28java.awt.Component%29)
19+
20+
### 工厂模式
21+
22+
- [java.util.Calendar#getInstance()](http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#getInstance%28%29)
23+
- [java.util.ResourceBundle#getBundle()](http://docs.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html#getBundle%28java.lang.String%29)
24+
- [java.text.NumberFormat#getInstance()](http://docs.oracle.com/javase/6/docs/api/java/text/NumberFormat.html#getInstance%28%29)
25+
- [java.nio.charset.Charset#forName()](http://docs.oracle.com/javase/6/docs/api/java/nio/charset/Charset.html#forName%28java.lang.String%29)
26+
- [java.net.URLStreamHandlerFactory#createURLStreamHandler(String)](http://docs.oracle.com/javase/6/docs/api/java/net/URLStreamHandlerFactory.html)
27+
28+
### 原型模式
29+
30+
- [java.lang.Object#clone()](http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#clone%28%29)(类需要实现 [java.lang.Cloneable](http://docs.oracle.com/javase/6/docs/api/java/lang/Cloneable.html) 接口)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# 如何产生一个随机的字母数字串作为 session 的唯一标识符?
2+
3+
如果允许产生的随机字符串是可猜测的(随机字符串比较都短,或者使用有缺陷的随机数生成器),进而导致攻击者可能会劫持到会话的,可以使用一个相对简单随机数生成代码,如下所示:
4+
```
5+
public class RandomString {
6+
7+
private static final char[] symbols;
8+
9+
static {
10+
StringBuilder tmp = new StringBuilder();
11+
for (char ch = '0'; ch <= '9'; ++ch)
12+
tmp.append(ch);
13+
for (char ch = 'a'; ch <= 'z'; ++ch)
14+
tmp.append(ch);
15+
symbols = tmp.toString().toCharArray();
16+
}
17+
18+
private final Random random = new Random();
19+
20+
private final char[] buf;
21+
22+
public RandomString(int length) {
23+
if (length < 1)
24+
throw new IllegalArgumentException("length < 1: " + length);
25+
buf = new char[length];
26+
}
27+
28+
public String nextString() {
29+
for (int idx = 0; idx < buf.length; ++idx)
30+
buf[idx] = symbols[random.nextInt(symbols.length)];
31+
return new String(buf);
32+
}
33+
}
34+
```
35+
36+
为了安全,可以考虑使用下面这段简洁且安全的代码,不过用其作为 session 的标识符,可能略显昂贵了一点:
37+
```
38+
```

0 commit comments

Comments
 (0)