package bce.server.servlets; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import bce.jni.utils.BCEUtils; import bce.server.entities.PersistentUser; import bce.server.servicers.LoginPageServicer; import bce.server.util.SpringUtil; /** * 用于处理登陆页面请求的控制器 * * @author robins * */ @WebServlet(name = "LoginServlet", urlPatterns = { "/LoginServlet.sl" }, description = "用于处理登陆页面请求的控制器", displayName = "注册页面控制器") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; public final static String PROCESS_LOGIN = "0"; public final static String PROCESS_CLIENT_LOGIN = "1"; public final static String PROCESS_FETCH_SIZE = "2"; public final static int USER_NAME_NOT_EXISTS = 0; public final static int PASSWORD_NOT_MATCH = 1; public final static int LOGIN_CHECK_PASSED = 2; protected LoginPageServicer servicer; protected Map<String, Long> videoNameSizeMap; /** * @see javax.servlet.GenericServlet#init() */ @Override public void init() throws ServletException { super.init(); servicer = (LoginPageServicer) SpringUtil.getBean("loginPageServicer"); videoNameSizeMap = new ConcurrentHashMap<String, Long>(); } /** * @see HttpServlet#HttpServlet() */ public LoginServlet() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Encapsulated request processing layer of doPost method. * * @param request * @param response * @throws ServletException * @throws IOException */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String flag = request.getParameter("flag"); if (flag != null && flag.trim().equals(LoginServlet.PROCESS_LOGIN)) { this.processLogin(request, response); return; } else if (flag != null && flag.trim().equals(LoginServlet.PROCESS_CLIENT_LOGIN)) { this.processClientLogin(request, response); return; } else if (flag != null && flag.trim().equals(LoginServlet.PROCESS_FETCH_SIZE)) { this.processFetchVideoSize(request, response); return; } } protected void processFetchVideoSize(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String videoName = request.getParameter("vn").trim(); System.out.println("videoName = " + videoName); if (videoNameSizeMap.containsKey(videoName)) { OutputStream out = response.getOutputStream(); out.write(BCEUtils.longToBytes(videoNameSizeMap.get(videoName))); out.flush(); out.close(); return; } Socket socket = new Socket("127.0.0.1", 30000); OutputStream sOut = socket.getOutputStream(); InputStream sIn = socket.getInputStream(); // set command sOut.write(BCEUtils.intToBytes(2)); // set data length sOut.write(BCEUtils.intToBytes(videoName.getBytes("UTF-8").length)); // set data sOut.write(videoName.getBytes("UTF-8")); sOut.flush(); byte[] tmp = new byte[16]; int len; ByteArrayOutputStream buffer = new ByteArrayOutputStream(); while ((len = sIn.read(tmp)) > 0) buffer.write(tmp, 0, len); socket.close(); long videoSize = BCEUtils.bytesToLong(buffer.toByteArray()); videoNameSizeMap.put(videoName, videoSize); OutputStream out = response.getOutputStream(); out.write(BCEUtils.longToBytes(videoSize)); out.flush(); out.close(); return; } protected void processClientLogin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName = request.getParameter("u").trim(); String password = request.getParameter("p").trim(); System.out.println("userName = " + userName + ", password = " + password); PersistentUser loginUser = new PersistentUser(); int loginCheckResult = this.servicer.checkLogin(userName, password, loginUser); if (loginCheckResult == USER_NAME_NOT_EXISTS) { OutputStream out = response.getOutputStream(); out.write((USER_NAME_NOT_EXISTS + "").getBytes("UTF-8")); out.flush(); out.close(); return; } else if (loginCheckResult == PASSWORD_NOT_MATCH) { OutputStream out = response.getOutputStream(); out.write((PASSWORD_NOT_MATCH + "").getBytes("UTF-8")); out.flush(); out.close(); return; } else if (loginCheckResult == LOGIN_CHECK_PASSED) { request.getSession().setAttribute(PersistentUser.ATTRIBUTE_KEY, loginUser); System.out.println(request.getSession().getId()); OutputStream out = response.getOutputStream(); StringBuffer buf = new StringBuffer(); buf.append(LOGIN_CHECK_PASSED).append(";").append(loginUser.getUserName()).append(";").append(request.getSession().getId()); /** 命令 int 4字节/数据 int 4字节/发送的数据 string.getBytes() */ Socket socket = new Socket("127.0.0.1", 30000); OutputStream out1 = socket.getOutputStream(); InputStream in1 = socket.getInputStream(); // set command out1.write(BCEUtils.intToBytes(1)); // set data length out1.write(BCEUtils.intToBytes(0)); out1.flush(); byte[] tmp = new byte[16]; int len; ByteArrayOutputStream buffer = new ByteArrayOutputStream(); while ((len = in1.read(tmp)) > 0) buffer.write(tmp, 0, len); socket.close(); String temp = new String(buffer.toByteArray(), "UTF-8"); System.out.println(temp); buf.append(";").append(temp); out.write(buf.toString().getBytes("UTF-8")); out.flush(); out.close(); return; } else { return; } } /** * 处理自动登录 * * @param request HttpServletRequest * @param response HttpServletResponse * @throws ServletException * @throws IOException */ protected void processAutoLogin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); session.setAttribute("user", request.getParameter("u").trim()); session.setMaxInactiveInterval(120); Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setMaxAge(120); cookie.setPath("/"); response.addCookie(cookie); } /** * 处理登录请求 * * @param request HttpServletRequest * @param response HttpServletResponse * @throws ServletException * @throws IOException */ protected void processLogin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName = request.getParameter("u").trim(); String password = request.getParameter("p").trim(); String[] rememberPwd = request.getParameterValues("chkRemember"); System.out.println("userName = " + userName + ", password = " + password); PersistentUser loginUser = new PersistentUser(); int loginCheckResult = this.servicer.checkLogin(userName, password, loginUser); if (loginCheckResult == USER_NAME_NOT_EXISTS) { request.setAttribute("errorInfo", "unErr"); RequestDispatcher dispatcher = request.getRequestDispatcher("bce_user_login.jsp"); dispatcher.forward(request, response); return; } else if (loginCheckResult == PASSWORD_NOT_MATCH) { request.setAttribute("errorInfo", "pwdErr"); RequestDispatcher dispatcher = request.getRequestDispatcher("bce_user_login.jsp"); dispatcher.forward(request, response); return; } else if (loginCheckResult == LOGIN_CHECK_PASSED) { if (rememberPwd != null && rememberPwd[0].equals("checked")) this.processAutoLogin(request, response); request.getSession().setAttribute(PersistentUser.ATTRIBUTE_KEY, loginUser); request.getSession().setAttribute("flag", "0"); response.sendRedirect("MainPageServlet.sl"); return; } else { return; } } }