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);