-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
executable file
·235 lines (184 loc) · 5.53 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>«Session» på kryss av devicer</title>
<script src="http://gnab.github.io/remark/downloads/remark-0.6.0.min.js" type="text/javascript"> </script>
<script type="text/javascript">
var referenceWidth = 1280;
</script>
<style type="text/css" media="screen">
@import url(http://fonts.googleapis.com/css?family=Roboto+Slab);
@import url(http://fonts.googleapis.com/css?family=Roboto);
body { font-family: 'Roboto'; font-size: 1.5em }
h1, h2, h3 {
font-family: 'Roboto Slab';
font-weight: 400;
margin-bottom: 0;
margin-top: 10px;
}
h1 { font-size: 2.5em; }
h2 { font-size: 1.6em; margin-top: 30px; line-height: 1.6em; }
h3 { font-size: 1.6em; }
.inverse {
background: #272727;
color: #777872;
text-shadow: 0 0 20px #333;
}
.inverse h1, .inverse h2 {
color: #f3f3f3;
}
pre {
border-left: 0.4em solid #d7d7d7;
padding: 1em !important;
}
code {
background: transparent !important;
}
a {
color: #fd5157;
text-decoration: none;
}
.task {
float: right;
font-size: 0.9em;
padding-top: 0.6em;
}
.task a {
color: #080;
text-decoration: none;
}
.right {
float: right;
margin-left: 1em;
}
.pushdown {
margin-top: 12em;
}
p img[alt="danrobert"]{
width: 30%;
}
</style>
</head>
<body>
<textarea id="source">
class: center, middle, inverse
# «Session» på kryss av devicer
### by [@eivinhb](http://twitter.com/eivinhb)
---
# Bilselgeren
Som bilselger
skal jeg når som helst kunne beregne pris på lån og forsikring
slik at jeg alltid kan gjøre et salg
![danrobert](https://a2-images.myspacecdn.com/images03/23/2faf3f62372849d197749f4b6436e82d/full.jpg)
???
# Kravene
- Lilleweb kan ikke være på innlogget side
- TTL: Innlogget bruker blir alltid utlogget etter ca 1 time
- Mye styr å måtte logge inn for å få en pris
- Storeweb er på innlogget side
- Desktop
- Skjema på storeweb skal prepopuleres fra lilleweb
---
# Tekniske rammer
- Java-backend
- To servere i par bak BigIP
- Session bør unngåes
- Sticky session er vanligst
- Ingen database
- Nye databaser opprettes ikke for alle prosjekter
---
# Hazelcast
### pros
- Minnebasert cluster Key/Value-map
- Krever ingen database eller serveroppsett
- 1 jar dependency rett i java backend
- Auto eviction på TTL
- Dynamic state, like java elsewhere.
### cons
- Data blir ikke persistert, ingen garantert løsning (men det kan backes av en DB).
---
class: middle
### Lag Hazelcast-instance
``` java
public class CacheManagerFactory {
public HazelcastInstance createCacheManager() {
HazelcastInstance instance = Hazelcast.newHazelcastInstance(
new Config()
.setInstanceName(cacheName)
.setGroupConfig(new GroupConfig(username, password))
.addMapConfig(
new MapConfig("DRAFTS")
.setMaxIdleSeconds(12 * TIME)
.setTimeToLiveSeconds(12 * TIME)));
}
return instance;
}
}
```
---
### Wrap Hazelcast med CRUD-metoder for din applikasjon
``` java
@Repostitory public class DraftRepository{
@Inject private HazelcastInstance instance;
public void store(String token, String object){
instance.getMap("DRAFTS").put(token, object);
}
public String fetch(String token){
String res = instance.getMap("DRAFTS").get(token);
if(res != null){
try{
new JSONObject(res);
return res;
} catch(Exception e){
instance.getMap("DRAFTS").remove(token);
}
}
return null;
}
}
```
---
### Jersey resource
```
@Produces("application/json")
public DraftResource{
@Inject DraftRepository repo;
@POST
public Response store(@HeaderParam("X-REQUESTED-BY") String token, String object){
Validate.notNull(token, "token missing");
repo.store(token, object);
return Response.ok().build();
}
@GET @RolesAllowed("AUTHORISED") //Løses gjerne av web.xml eller Webseal
public Response fetch(@Context Bruker bruker){
String obj = repo.fetch(bruker.getToken());
if(obj == null) return Response.ok("{}").build();
return Response.ok(obj).build();
}
}
```
---
### Lage et token og sikkerhet
- SHA-1 hash av remoteUser (normalt en e-post)
- Statisk salt, random generert og ganske langt
- Mange 1000 iterasjoner
- Substring av resultat regnet som godt nok
- Put fra åpne sider sjekker ikke data og vil alltid returnere http 200 OK.
- Fetch fra innloggede sider sjekker alltid data mot json-object. function() et al. vil kaste Json-exception.
---
class: center, middle, inverse
# Demo
---
class: center, middle, inverse
# That´s it?
## Ja, selvfølgelig! Kast ut DB2, PostgreSQL, Redis eller hva du bruker for mellomlagring og kjør Hazelcast for din sesjon på kryss av sesjoner og deviser!
---
class: center, middle, inverse
### Ingen spørsmål.
</textarea>
<script>
var slideshow = remark.create({ highlightLanguage: 'java', ratio:"16:9"});
</script>
</body>
</html>