package bce.server.servlets; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.net.URLEncoder; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import bce.java.entities.BCEPrivateKey; import bce.server.entities.PersistentPrivateKey; import bce.server.entities.PersistentUser; import bce.server.servicers.MainPageServicer; import bce.server.util.SpringUtil; /** * 用于处理书城主页请求的控制器 * * @author robins * */ @WebServlet(name = "MainPageServlet", urlPatterns = { "/MainPageServlet.sl" }, description = "用于处理书城主页请求的控制器", displayName = "主页控制器") public class MainPageServlet extends HttpServlet { private static final long serialVersionUID = 1L; private final static String USER_LOGOUT = "1"; private final static String APPLY_NEW_PRIVATE_KEY = "2"; private final static String DOWNLOAD_PRIVATE_KEY = "3"; private final static String DOWNLOAD_PARAMS_FILE = "4"; MainPageServicer servicer; /** * @see HttpServlet#HttpServlet() */ public MainPageServlet() { super(); } /** * @see javax.servlet.GenericServlet#init() */ @Override public void init() throws ServletException { super.init(); servicer = (MainPageServicer) SpringUtil.getBean("mainPageServicer"); } /** * @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); } /** * 处理请求的方法 * * @param request HttpServletRequest * @param response HttpServletResponse * @throws ServletException * @throws IOException */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PersistentUser user = (PersistentUser) request.getSession().getAttribute(PersistentUser.ATTRIBUTE_KEY); String flag = request.getParameter("flag"); if (user != null && flag == null) { List<PersistentPrivateKey> dataList = this.servicer.prepareBCEData(user); request.setAttribute("dataList", dataList); RequestDispatcher dispatcher = request.getRequestDispatcher("bce_user_main.jsp"); dispatcher.forward(request, response); return; } else if (flag != null && MainPageServlet.USER_LOGOUT.equals(flag.trim())) { request.getSession().removeAttribute(PersistentUser.ATTRIBUTE_KEY); request.getSession().removeAttribute("havePassLoginCheck"); request.getSession().removeAttribute("user"); request.getSession().invalidate(); response.sendRedirect("bce_user_login.jsp"); return; } else if (flag != null && MainPageServlet.APPLY_NEW_PRIVATE_KEY.equals(flag.trim())) { String password = request.getParameter("pwd"); String vcodeInRequest = request.getParameter("vc"); String vcodeInSession = (String) request.getSession().getAttribute("vcode"); if (!this.servicer.isValidPassword(password, user)) { PrintWriter out = response.getWriter(); out.println("{\"result\":\"fail\", \"reason\":\"wrong password\"}"); out.flush(); out.close(); return; } if (!this.servicer.isValidVcode(vcodeInRequest, vcodeInSession)) { PrintWriter out = response.getWriter(); out.println("{\"result\":\"fail\", \"reason\":\"wrong vcode\"}"); out.flush(); out.close(); return; } PersistentPrivateKey privateKey = this.servicer.applyBCEPrivateKey(user); response.setContentType("application/json;charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("{\"result\":\"success\", \"pkId\":\"" + privateKey.getPrivateKeyId() + "\", \"sysId\":\"" + privateKey.getBelongedBCESystem().getBceSystemId() + "\", \"uname\":\"" + privateKey.getBelongedUser().getUserName() + "\", \"legal\":\"" + (privateKey.getIsLegal() == 1? "Yes" : "No") + "\"}"); out.flush(); out.close(); return; } else if (flag != null && MainPageServlet.DOWNLOAD_PRIVATE_KEY.equals(flag.trim())) { String pkId = request.getParameter("pkId"); if (pkId == null) return; Integer privateKeyId = Integer.parseInt(pkId); BCEPrivateKey privateKey = this.servicer.prepareBCEPrivateKey(privateKeyId); response.setContentType("application/octet-stream"); String fileName = URLEncoder.encode("BCEPK-" + privateKeyId + ".key", "UTF-8"); response.addHeader("Content-Disposition","attachment; filename=" + fileName); OutputStream out = response.getOutputStream(); out.write(privateKey.toBytes()); out.flush(); out.close(); return; } else if (flag != null && MainPageServlet.DOWNLOAD_PARAMS_FILE.equals(flag.trim())) { String sysId = request.getParameter("sysId"); if (sysId == null) return; Integer systemId = Integer.parseInt(sysId); File paramsFile = this.servicer.prepareBCEClientParams(systemId); FileInputStream fis = new FileInputStream(paramsFile); byte[] buffer = new byte[1024]; int marker; response.setContentType("application/octet-stream"); String fileName = URLEncoder.encode(paramsFile.getName(), "UTF-8"); response.addHeader("Content-Disposition", "attachment; filename=" + fileName); OutputStream out = response.getOutputStream(); while ((marker = fis.read(buffer)) > 0) { out.write(buffer, 0, marker); } out.flush(); out.close(); return; } } }