package jtweet.web; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import jtweet.oauth.RequestToken; import jtweet.oauth.Utils; import twitter4j.TwitterException; import com.google.appengine.repackaged.com.google.common.util.Base64; import freemarker.template.Template; import freemarker.template.TemplateException; public class LoginServlet extends JTweetServlet { private static final long serialVersionUID = 3283053002737403576L; static final Logger logger = Logger.getLogger(LoginServlet.class.getName()); public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/html; charset=UTF-8"); String action = req.getRequestURI().substring(1); if (action.equalsIgnoreCase("login")) { if (isLogin(req)) { resp.sendRedirect("/home"); return; } } else if (action.equalsIgnoreCase("logout")) { redirectLogin(req, resp); return; } else { redirectLogin(req, resp); return; } String UA = req.getHeader("User-Agent"); if (UA == null) { browser = "other"; } else if (UA.contains("MSIE 6.0")) { browser = "ie6"; } else if (UA.contains("Opera Mini")){ browser = "operamini"; }else if (UA.contains("MSIE 7.0")) { browser = "ie7"; }else if(UA.contains("UCWEB")){ browser = "UC"; }else if(UA.contains("Chrome")){ browser = "Chrome"; } else { browser = "other"; } HashMap<String, Object> root = new HashMap<String, Object>(); freemarker.template.Configuration config = new freemarker.template.Configuration(); config.setDirectoryForTemplateLoading(new File("template")); config.setDefaultEncoding("UTF-8"); root.put("browser", browser); root.put("server", req.getServerName()); String templateName = "login.ftl"; if(browser.equalsIgnoreCase("operamini")){ templateName = "mlogin.ftl"; } logger.info("UA:"+UA); logger.info("browser:"+browser); logger.info("template Name:"+templateName); Template t = config.getTemplate(templateName); try { t.process(root, resp.getWriter()); } catch (TemplateException e) { e.printStackTrace(); } } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/html; charset=UTF-8"); String action = req.getRequestURI().substring(1); String username = req.getParameter("username"); String passwd = req.getParameter("passwd"); String stayin = req.getParameter("stayin"); String oauthproxy = req.getParameter("oauthproxy"); if (action.equalsIgnoreCase("login")) { if (Utils.isEmptyOrNull(username)) redirectLogin(req, resp); HttpSession session = req.getSession(true); session.setMaxInactiveInterval(3600); if (!Utils.isEmptyOrNull(passwd)) {// normal String passwd_en = Base64.encode(passwd.getBytes("UTF-8")); init_twitter(username, passwd, req); try { twitter.verifyCredentials(); session.setAttribute("username", username); session.setAttribute("passwd", passwd_en); // 在cookie中存储加密账户信息 if (null != stayin && stayin.equals("1")) { Cookie cookie = new Cookie(JTweetServlet.ACCOUNT_COOKIE_NAME, Encrypt.encodeAccount(username, passwd)); cookie.setMaxAge(7 * 24 * 3600); cookie.setPath("/"); resp.addCookie(cookie); } detectBrowser(req); if(browser.equalsIgnoreCase("operamini")|| browser.equalsIgnoreCase("ucweb")){ resp.sendRedirect("/mhome"); }else{ resp.sendRedirect("/home"); } } catch (TwitterException e) { redirectLogin(req, resp); e.printStackTrace(); } } else {// oauth Cookie[] cookies = req.getCookies(); Cookie accountCookie = null; String[] accountString = null; for (Cookie cookie : cookies) { if (cookie.getName().equals(JTweetServlet.ACCOUNT_COOKIE_NAME)) { accountCookie = cookie; break; } } if (accountCookie != null) { accountString = Encrypt.decodeAccount(accountCookie.getValue()); } if (accountString != null) { String accessToken = accountString[2]; String accessTokenSecret = accountString[3]; twitterOAuth(accessToken, accessTokenSecret, req); try { twitter.verifyCredentials(); session.setAttribute("accessToken", accessToken); session.setAttribute("accessTokenSecret", accessTokenSecret); if(browser.equalsIgnoreCase("operamini")|| browser.equalsIgnoreCase("ucweb")){ resp.sendRedirect("/mhome"); }else{ resp.sendRedirect("/home"); } } catch (TwitterException e) { logger.log(Level.SEVERE, e.getMessage()); redirectLogin(req, resp); } } else { String callbackURL = Utils.getBaseURL(req) + "/oauth/"; try { RequestToken requestToken = new RequestToken(callbackURL); String authUrl = requestToken.getAuthUrl(); String token = requestToken.getToken(); String tokenSecret = requestToken.getTokenSecret(); Cookie cookie = new Cookie(JTweetServlet.ACCOUNT_COOKIE_NAME, Encrypt.encodeAccount(new String[] { username, "", token, tokenSecret })); cookie.setMaxAge(7 * 24 * 3600); cookie.setPath("/"); resp.addCookie(cookie); if (null != oauthproxy && oauthproxy.equals("1")) { authUrl = authUrl.replaceFirst("https://twitter.com/oauth/authorize", "/oauth/authorize"); } resp.sendRedirect(authUrl); } catch (Exception e) { logger.log(Level.SEVERE, e.getMessage()); redirectLogin(req, resp); } } } } } }