Subversion Repositories SmartDukaan

Rev

Rev 2907 | Rev 2960 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
781 vikas 1
package in.shop2020.serving.interceptors;
2
 
3
import java.util.HashMap;
2907 rajveer 4
import java.util.List;
781 vikas 5
import java.util.Map;
6
 
7
import in.shop2020.serving.services.UserSessionInfo;
8
import in.shop2020.serving.utils.DesEncrypter;
9
 
10
import javax.servlet.http.Cookie;
11
import javax.servlet.http.HttpServletRequest;
837 vikas 12
import javax.servlet.http.HttpServletResponse;
781 vikas 13
import javax.servlet.http.HttpSession;
14
 
1044 chandransh 15
import org.apache.log4j.Logger;
781 vikas 16
import org.apache.struts2.ServletActionContext;
2907 rajveer 17
import org.apache.struts2.StrutsStatics;
781 vikas 18
 
2907 rajveer 19
import com.opensymphony.xwork2.ActionContext;
781 vikas 20
import com.opensymphony.xwork2.ActionInvocation;
21
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
2907 rajveer 22
import com.opensymphony.xwork2.interceptor.PreResultListener;
781 vikas 23
 
2907 rajveer 24
public class UserInterceptor extends AbstractInterceptor implements PreResultListener{
781 vikas 25
 
2907 rajveer 26
	public static final int SECONDS_IN_YEAR = 60*60*24*365; 
837 vikas 27
 
781 vikas 28
	private static final long serialVersionUID = -4125815700236506235L;
1044 chandransh 29
	private static Logger log = Logger.getLogger(UserInterceptor.class);
781 vikas 30
 
2907 rajveer 31
	public static final String USER_INFO_COOKIE_NAME = "uic";
32
	public static final String USER_ID_COOKIE_NAME = "uid";
781 vikas 33
 
34
	private Map<String, Cookie> cookiesMap = null;
35
	private Cookie userCookie = null;
2907 rajveer 36
	public static DesEncrypter desEncrypter = new DesEncrypter("shop2020");
781 vikas 37
 
2907 rajveer 38
	private Cookie userinfoCookie = null;
39
 
1658 vikas 40
	private String cookieDomain = "";
41
 
42
	public void setCookieDomain(String cookieDomain) {
43
		this.cookieDomain = cookieDomain;
44
	}
45
 
781 vikas 46
	@Override
47
	public String intercept(ActionInvocation invocation) throws Exception {
48
		final Object action = invocation.getAction();
49
 
1658 vikas 50
		log.debug("inside user intercepror");
1614 rajveer 51
 
781 vikas 52
        HttpServletRequest request = ServletActionContext.getRequest();
53
        HttpSession session = request.getSession(); // Get the existing session or create a new one
54
 
2907 rajveer 55
 
781 vikas 56
		createCookiesMap(request);
57
 
2907 rajveer 58
		UserSessionInfo userInfo = (UserSessionInfo) request.getAttribute(USER_INFO_COOKIE_NAME);
59
 
60
		userCookie = cookiesMap.get(UserInterceptor.USER_ID_COOKIE_NAME);
61
		userinfoCookie = cookiesMap.get(USER_INFO_COOKIE_NAME);
1354 vikas 62
 
2907 rajveer 63
		if(userInfo == null ){
64
			if(userinfoCookie!=null){
65
				userInfo = UserSessionInfo.getUserSessionInfoFromCookieValue(userinfoCookie.getValue());
66
			}else{
67
				userInfo = createAndGetSessionFromUIDCookie(session);
1614 rajveer 68
			}
1354 vikas 69
		}
2907 rajveer 70
 
71
		request.setAttribute(USER_INFO_COOKIE_NAME, userInfo);
72
 
73
 
781 vikas 74
		if (action instanceof UserAware) {
75
        	UserAware sessionAction = (UserAware) action;
76
        	sessionAction.setSession(session);
77
        	sessionAction.setUserSessionInfo(userInfo);
78
        	sessionAction.setCookiesMap(cookiesMap);
79
        	sessionAction.setUserCookie(userCookie);
1713 vikas 80
        	sessionAction.setCookieDomainName(cookieDomain);
781 vikas 81
        }
2907 rajveer 82
 
83
		invocation.addPreResultListener(this);
84
 
781 vikas 85
		return invocation.invoke();
86
	}
87
 
1614 rajveer 88
 
2907 rajveer 89
	@Override
90
	public void beforeResult(ActionInvocation invocation, String resultCode) {
91
		ActionContext ac = invocation.getInvocationContext();
92
		HttpServletResponse response = (HttpServletResponse) ac.get(StrutsStatics.HTTP_RESPONSE);
93
		addCookiesToResponse(invocation.getAction(), response);
94
	}	
95
 
96
 
97
	private void addCookiesToResponse(Object action, HttpServletResponse response) {
98
		if (action instanceof UserAware) {
99
			List<Cookie> cookies = ((UserAware) action).getCookies();
100
			if (cookies != null) {
101
				for (Cookie cookie : cookies) {
102
					response.addCookie(cookie);
103
				}
104
			}
105
		}
106
	}
107
 
108
 
781 vikas 109
	private void createCookiesMap(HttpServletRequest request) {
110
		cookiesMap  = new HashMap<String, Cookie>();
111
		Cookie[] cookies = request.getCookies();
112
		if(cookies==null)
113
			return;
1658 vikas 114
		for (Cookie cookie : cookies) {
2907 rajveer 115
			if (cookie.getName().equals(UserInterceptor.USER_ID_COOKIE_NAME)) {
1658 vikas 116
				if (cookie.getDomain() == null || cookie.getDomain().isEmpty()
117
						|| !cookie.getDomain().equals(this.cookieDomain)) 
118
				{
119
					if (!cookieDomain.isEmpty()) {
120
						cookie.setMaxAge(0);
2907 rajveer 121
						Cookie newUserCookie = new Cookie(UserInterceptor.USER_ID_COOKIE_NAME, cookie.getValue());
1658 vikas 122
						newUserCookie.setMaxAge(SECONDS_IN_YEAR); // one year
123
						newUserCookie.setPath("/");
124
						newUserCookie.setDomain(cookieDomain);
125
 
126
						HttpServletResponse response = ServletActionContext.getResponse();
127
						response.addCookie(newUserCookie);
128
						response.addCookie(cookie);
129
					}
1722 vikas 130
					else {
131
					    log.error("cookieDomain not set");
132
					}
1658 vikas 133
				}
134
			}
135
		    cookiesMap.put(cookie.getName(), cookie);
136
		}
781 vikas 137
	}
138
 
2907 rajveer 139
 
1614 rajveer 140
 
781 vikas 141
 
142
	private UserSessionInfo createAndGetSessionFromUIDCookie(HttpSession session) {
2907 rajveer 143
		userCookie = (Cookie) cookiesMap.get(UserInterceptor.USER_ID_COOKIE_NAME);
781 vikas 144
		UserSessionInfo userInfo = null;
145
		if(userCookie != null){
146
			String uidString = userCookie.getValue();
147
			if(uidString != null){
148
				try {
149
					Long receivedUID = Long.parseLong(desEncrypter.decrypt(uidString));
828 rajveer 150
                    log.info("Invalid session with user cookie : " + receivedUID);
781 vikas 151
					userInfo = new UserSessionInfo(receivedUID, session.getId());
2935 chandransh 152
					if(userInfo.getUserId() == -1){
153
					    log.error("The User for the UID cookie has been deleted in our database. So cleaning up the UID cookie.");
154
					    expireUidCookie();
155
					}
781 vikas 156
				} catch (NumberFormatException nfe) {
157
					log.error("The UID cookie contains an unparseable userID");
2935 chandransh 158
					expireUidCookie();
2473 chandransh 159
					userInfo = new UserSessionInfo();
781 vikas 160
				}
161
			}
830 vikas 162
		}
163
		else{
1614 rajveer 164
			userInfo = new UserSessionInfo();
830 vikas 165
			log.info("Invalid session without user cookie.");
781 vikas 166
		}
167
		return userInfo;
168
	}
2907 rajveer 169
 
2935 chandransh 170
    private void expireUidCookie() {
171
        Cookie newUserCookie = new Cookie(UserInterceptor.USER_ID_COOKIE_NAME, "-1"); //The value here is immaterial
172
        newUserCookie.setMaxAge(0);                     // Expire this cookie now
173
        newUserCookie.setPath("/");
174
        newUserCookie.setDomain(cookieDomain);
175
 
176
        HttpServletResponse response = ServletActionContext.getResponse();
177
        response.addCookie(newUserCookie);
178
    }
179
 
781 vikas 180
}