Mercurial Hosting > luan
comparison src/luan/modules/http/HttpServicer.java @ 810:022ff91bde60
fix session pages
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 08 Sep 2016 18:25:43 -0600 |
parents | 9c13a15a4002 |
children | 95cbe23a96fb |
comparison
equal
deleted
inserted
replaced
809:09d518d313b7 | 810:022ff91bde60 |
---|---|
3 import java.io.InputStream; | 3 import java.io.InputStream; |
4 import java.io.BufferedInputStream; | 4 import java.io.BufferedInputStream; |
5 import java.io.PrintWriter; | 5 import java.io.PrintWriter; |
6 import java.io.IOException; | 6 import java.io.IOException; |
7 import java.util.Map; | 7 import java.util.Map; |
8 import java.util.LinkedHashMap; | |
8 import java.util.Set; | 9 import java.util.Set; |
9 import java.util.List; | 10 import java.util.List; |
10 import java.util.ArrayList; | 11 import java.util.ArrayList; |
11 import java.util.Arrays; | 12 import java.util.Arrays; |
12 import java.util.Iterator; | 13 import java.util.Iterator; |
13 import java.util.Enumeration; | 14 import java.util.Enumeration; |
14 import java.util.concurrent.Executor; | 15 import java.util.concurrent.Executor; |
15 import java.util.concurrent.Executors; | 16 import java.util.concurrent.Executors; |
17 import java.util.concurrent.atomic.AtomicInteger; | |
16 import javax.servlet.ServletOutputStream; | 18 import javax.servlet.ServletOutputStream; |
17 import javax.servlet.ServletException; | 19 import javax.servlet.ServletException; |
18 import javax.servlet.http.Cookie; | 20 import javax.servlet.http.Cookie; |
19 import javax.servlet.http.HttpServletRequest; | 21 import javax.servlet.http.HttpServletRequest; |
20 import javax.servlet.http.HttpServletResponse; | 22 import javax.servlet.http.HttpServletResponse; |
21 import javax.servlet.http.HttpSession; | |
22 import javax.servlet.http.Part; | 23 import javax.servlet.http.Part; |
23 import org.slf4j.Logger; | 24 import org.slf4j.Logger; |
24 import org.slf4j.LoggerFactory; | 25 import org.slf4j.LoggerFactory; |
25 import org.eclipse.jetty.util.MultiPartInputStream; | 26 import org.eclipse.jetty.util.MultiPartInputStream; |
26 import luan.Luan; | 27 import luan.Luan; |
38 | 39 |
39 | 40 |
40 public final class HttpServicer { | 41 public final class HttpServicer { |
41 private static final Logger logger = LoggerFactory.getLogger(HttpServicer.class); | 42 private static final Logger logger = LoggerFactory.getLogger(HttpServicer.class); |
42 | 43 |
44 public static long sessionTimeout = 60*60*1000L; // one hour | |
45 private static AtomicInteger sessionCounter = new AtomicInteger(); | |
46 private static Map<String,LuanState> sessionMap = new LinkedHashMap<String,LuanState>() { | |
47 protected boolean removeEldestEntry(Map.Entry<String,LuanState> eldest) { | |
48 return (Long)eldest.getValue().registry().get("sessionTimeout") < System.currentTimeMillis(); | |
49 } | |
50 }; | |
51 | |
43 public static boolean service(LuanState luan,HttpServletRequest request,HttpServletResponse response,String modName) | 52 public static boolean service(LuanState luan,HttpServletRequest request,HttpServletResponse response,String modName) |
44 throws LuanException | 53 throws LuanException |
45 { | 54 { |
46 LuanFunction fn; | 55 LuanFunction fn; |
47 synchronized(luan) { | 56 synchronized(luan) { |
52 if( mod.equals(Boolean.FALSE) ) | 61 if( mod.equals(Boolean.FALSE) ) |
53 return false; | 62 return false; |
54 if( !(mod instanceof LuanFunction) ) | 63 if( !(mod instanceof LuanFunction) ) |
55 throw new LuanException( "module '"+modName+"' must return a function" ); | 64 throw new LuanException( "module '"+modName+"' must return a function" ); |
56 if( Boolean.TRUE.equals(per_session_pages.rawGet(mod)) ) { | 65 if( Boolean.TRUE.equals(per_session_pages.rawGet(mod)) ) { |
57 HttpSession session = request.getSession(); | 66 LuanState sessionLuan = null; |
58 LuanState sessionLuan = (LuanState)session.getAttribute("luan"); | 67 Cookie cookie = getCookie(request,"session"); |
68 if( cookie != null ) | |
69 sessionLuan = sessionMap.get(cookie.getValue()); | |
59 if( sessionLuan!=null ) { | 70 if( sessionLuan!=null ) { |
60 luan = sessionLuan; | 71 luan = sessionLuan; |
61 } else { | 72 } else { |
62 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); | 73 LuanCloner cloner = new LuanCloner(LuanCloner.Type.COMPLETE); |
63 luan = (LuanState)cloner.clone(luan); | 74 luan = (LuanState)cloner.clone(luan); |
64 session.setAttribute("luan",luan); | 75 luan.registry().put( "sessionTimeout", System.currentTimeMillis() + sessionTimeout ); |
76 String key = Integer.toString(sessionCounter.incrementAndGet()); | |
77 setCookie(request,response,"session",key,false,null); | |
78 sessionMap.put(key,luan); | |
65 } | 79 } |
66 fn = (LuanFunction)PackageLuan.require(luan,modName); | 80 fn = (LuanFunction)PackageLuan.require(luan,modName); |
67 } else { | 81 } else { |
68 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); | 82 LuanCloner cloner = new LuanCloner(LuanCloner.Type.INCREMENTAL); |
69 luan = (LuanState)cloner.clone(luan); | 83 luan = (LuanState)cloner.clone(luan); |