Subversion Repositories SmartDukaan

Rev

Rev 2935 | Rev 2973 | 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) {
2960 chandransh 98
	    log.debug("Setting cookies in response");
2907 rajveer 99
		if (action instanceof UserAware) {
100
			List<Cookie> cookies = ((UserAware) action).getCookies();
101
			if (cookies != null) {
102
				for (Cookie cookie : cookies) {
2960 chandransh 103
				    log.debug("Adding cookie " + cookie.getName() + " to the response");
2907 rajveer 104
					response.addCookie(cookie);
105
				}
106
			}
107
		}
108
	}
109
 
110
 
781 vikas 111
	private void createCookiesMap(HttpServletRequest request) {
112
		cookiesMap  = new HashMap<String, Cookie>();
113
		Cookie[] cookies = request.getCookies();
114
		if(cookies==null)
115
			return;
1658 vikas 116
		for (Cookie cookie : cookies) {
2907 rajveer 117
			if (cookie.getName().equals(UserInterceptor.USER_ID_COOKIE_NAME)) {
1658 vikas 118
				if (cookie.getDomain() == null || cookie.getDomain().isEmpty()
119
						|| !cookie.getDomain().equals(this.cookieDomain)) 
120
				{
121
					if (!cookieDomain.isEmpty()) {
122
						cookie.setMaxAge(0);
2907 rajveer 123
						Cookie newUserCookie = new Cookie(UserInterceptor.USER_ID_COOKIE_NAME, cookie.getValue());
1658 vikas 124
						newUserCookie.setMaxAge(SECONDS_IN_YEAR); // one year
125
						newUserCookie.setPath("/");
126
						newUserCookie.setDomain(cookieDomain);
127
 
128
						HttpServletResponse response = ServletActionContext.getResponse();
129
						response.addCookie(newUserCookie);
130
						response.addCookie(cookie);
131
					}
1722 vikas 132
					else {
133
					    log.error("cookieDomain not set");
134
					}
1658 vikas 135
				}
136
			}
137
		    cookiesMap.put(cookie.getName(), cookie);
138
		}
781 vikas 139
	}
140
 
2907 rajveer 141
 
1614 rajveer 142
 
781 vikas 143
 
144
	private UserSessionInfo createAndGetSessionFromUIDCookie(HttpSession session) {
2907 rajveer 145
		userCookie = (Cookie) cookiesMap.get(UserInterceptor.USER_ID_COOKIE_NAME);
781 vikas 146
		UserSessionInfo userInfo = null;
147
		if(userCookie != null){
148
			String uidString = userCookie.getValue();
149
			if(uidString != null){
150
				try {
151
					Long receivedUID = Long.parseLong(desEncrypter.decrypt(uidString));
828 rajveer 152
                    log.info("Invalid session with user cookie : " + receivedUID);
781 vikas 153
					userInfo = new UserSessionInfo(receivedUID, session.getId());
2935 chandransh 154
					if(userInfo.getUserId() == -1){
155
					    log.error("The User for the UID cookie has been deleted in our database. So cleaning up the UID cookie.");
156
					    expireUidCookie();
157
					}
781 vikas 158
				} catch (NumberFormatException nfe) {
159
					log.error("The UID cookie contains an unparseable userID");
2935 chandransh 160
					expireUidCookie();
2473 chandransh 161
					userInfo = new UserSessionInfo();
781 vikas 162
				}
163
			}
830 vikas 164
		}
165
		else{
1614 rajveer 166
			userInfo = new UserSessionInfo();
830 vikas 167
			log.info("Invalid session without user cookie.");
781 vikas 168
		}
169
		return userInfo;
170
	}
2907 rajveer 171
 
2935 chandransh 172
    private void expireUidCookie() {
173
        Cookie newUserCookie = new Cookie(UserInterceptor.USER_ID_COOKIE_NAME, "-1"); //The value here is immaterial
174
        newUserCookie.setMaxAge(0);                     // Expire this cookie now
175
        newUserCookie.setPath("/");
176
        newUserCookie.setDomain(cookieDomain);
177
 
178
        HttpServletResponse response = ServletActionContext.getResponse();
179
        response.addCookie(newUserCookie);
180
    }
181
 
781 vikas 182
}