@demon123
developer

Есть ли необработанные ошибки?

@WebServlet(
        description = "generator servlet",  
        urlPatterns = {"/generator"})
public class Generator extends HttpServlet {

    private static final Category LOG = Category.getInstance(Generator.class);

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        PrintWriter out = null;
        try {
            //Задаем тип страницы
            response.setContentType("text/html");

            //Для вывода
            out = response.getWriter();

            //Находим путь к файлу 'сonfig.properties'
            Properties props = new Properties();
            String propsFile = "config.properties";
            InputStream input = getClass().getClassLoader().getResourceAsStream(propsFile);

            //Если файл properties не найден
            if (input == null) {
                LOG.error("property file " + propsFile + " not found");

                out.print("<h1>Sorry, config file not found!</h1>");
                return;
            }

            props.load(input);

            //Задаем переменным значения
            String pr = props.getProperty("product");
            String clientsCount = request.getParameter("numUser");
            String otpCount = request.getParameter("numUtp");
            String lices = request.getParameter("licesee");
            String date = request.getParameter("data");
            String certPeriod = request.getParameter("certPeriod");
            String pass = props.getProperty("password");
            String lic = props.getProperty("license");

            //Задаем имя файла
            String fileName = lices + "_" + clientsCount + "_" + otpCount + "_" + date + ".lic";
            //Место хранения файла
            String outFile = props.getProperty("outFile");
            //Путь к ключу
            String keyFile = props.getProperty("keyFile");

            //Добавляем в массив данные
            ArrayList<String> snlist = new ArrayList<>();
            for (int i = 10; i < 10; i++) {
                snlist.add(pr);
                snlist.add(clientsCount);
                snlist.add(otpCount);
                snlist.add(lices);
                snlist.add(date);
                snlist.add(certPeriod);
                snlist.add(outFile);
                snlist.add(keyFile);
                snlist.add(pass);
                snlist.add(lic);
            }

            //Вставляем в config.properties данные
            props.put("ActiveOtpCount", otpCount);
            props.put("ActiveClientsCount", clientsCount);
            props.put("Licensee", lices);
            props.put("LicenseExpired", date);
            props.put("CertificatesPeriod", certPeriod);

            //Инициализация утилит
            LicenseGenerator.init();

            KeyStore ks = KeyStore.getInstance("AKS", AkSigProv.PROV_NAME);
            ks.load(new FileInputStream(keyFile), pass.toCharArray());
            String a = ks.aliases().nextElement();
            PrivateKey pk = (PrivateKey) ks.getKey(a, pass.toCharArray());
            X509Certificate cert = (X509Certificate) ks.getCertificate(a);

            //Генерируем лиценцию, и записываем в файл
            String x = LicenseGenerator.generateLicense(pr, snlist, props, cert, pk);
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream(outFile + fileName);
                fos.write(x.getBytes());
            } catch (Exception e) {
                LOG.info("Exception:" + e);
            } finally {
                fos.close();
            }
            
            //Записываем в файл
            OutputStream outStream = null;
            FileInputStream inStream = null;
            try {
                //Создаем файл
                File downloadFile = new File(outFile + fileName);
                //Считываем с файла
                inStream = new FileInputStream(downloadFile);
                out.print(x);

                //Сохраняем файл
                String headerKey = "Content-Disposition";
                String headerValue = String.format("attachment; filename=\"%s\"", downloadFile.getName());
                response.setHeader(headerKey, headerValue);

                outStream = response.getOutputStream();
                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = inStream.read(buffer)) != -1) {
                    outStream.write(buffer, 0, bytesRead);
                }
            } catch (Exception e) {
                LOG.error(e);
            } finally {
                outStream.close();
                inStream.close();
            }

        } catch (NoSuchAlgorithmException ex) {
            LOG.error(ex);
        } catch (CertificateException ex) {
            LOG.error(ex);
        } catch (Exception ex) {
            LOG.error(ex);
        } finally {
            out.close();
        }
    }
}

Код рабочий!
Всем привет, Есть ли у меня необработанные ошибки, и когда у меня возникает ошибка он записывает в лог, но он конкретно не говорит где произошла ошибка, как можно это исправить? И еще мне сделали замечание, что у меня 2 запроса и 1 ответ, а нужно сделать, чтоб было 1 запрос и 1 ответ(я сам не очень понял, что имели ввиду)?
  • Вопрос задан
  • 2261 просмотр
Пригласить эксперта
Ответы на вопрос 2
@yahorfilipcyk
У вас правда код работает? :) Или вы не совсем понимаете, что в нём происходит?
for (int i = 10; i < 10; i++) {
     snlist.add(pr);
     snlist.add(clientsCount);
     snlist.add(otpCount);
     snlist.add(lices);
     snlist.add(date);
     snlist.add(certPeriod);
     snlist.add(outFile);
     snlist.add(keyFile);
     snlist.add(pass);
     snlist.add(lic);
}

Ещё замечания: вы вызываете response.getWriter() и response.getOutputStream() из одного и того же объекта ответа. Причём закрываете и OutputStream, и Writer. Оба объекта ссылаются на один и тот же Stream. Нужно выбрать что-то одно. Также вы записываете лицензию в файл, потом читаете этот же файл и отсылаете содержимое клиенту. Не проще отправить клиенту содержимое String x, а не читать его из файла?
Насчёт исключений... Не нужно везде писать catch (Exception ex). Отлавливайте те исключения, которые могут вам о чём-то сказать и вы сможете предпринять какие-то действия.
И ещё, будьте человеком :) разнесите разные функционально блоки кода в отдельные методы, а то ж сложно разбираться в простынях кода. Я даже не пробовал разбираться, что ваш код на самом деле делает. Поэтому замечания перечислены далеко не все, есть подозрения.
Ответ написан
@demon123 Автор вопроса
developer
@WebServlet(
        description = "generator servlet",
        urlPatterns = {"/generator"})
public class Generator extends HttpServlet {

    private static final Category LOG = Category.getInstance(Generator.class);

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        PrintWriter out = null;
        try {
            //Задаем тип страницы
            response.setContentType("text/html");

            //Для вывода
            out = response.getWriter();

            //Находим путь к файлу 'сonfig.properties'
            Properties props = new Properties();
            String propsFile = "config.properties";
            InputStream input = getClass().getClassLoader().getResourceAsStream(propsFile);
            
            //Если файл properties не найден
            if (input == null) {
                LOG.error("property file " + propsFile + " not found");

                out.print("<h1>Sorry, config file not found!</h1>");
                return;
            }

            props.load(input);

            //Задаем переменным значения
            String pr = props.getProperty("product");
            String clientsCount = request.getParameter("numUser");
            String otpCount = request.getParameter("numUtp");
            String lices = request.getParameter("licesee");
            String date = request.getParameter("data");
            String certPeriod = request.getParameter("certPeriod");
            String pass = props.getProperty("password");
            String lic = props.getProperty("license");

            //Задаем имя файла
            String fileName = lices + "_" + clientsCount + "_" + otpCount + "_" + date + ".lic";
            //Место хранения файла
            String outFile = props.getProperty("outFile");
            //Путь к ключу
            String keyFile = props.getProperty("keyFile");

            //Добавляем в массив данные
            ArrayList<String> snlist = new ArrayList<>();
            for (int i = 10; i < 10; i++) {
                snlist.add(pr);
                snlist.add(clientsCount);
                snlist.add(otpCount);
                snlist.add(lices);
                snlist.add(date);
                snlist.add(certPeriod);
                snlist.add(outFile);
                snlist.add(keyFile);
                snlist.add(pass);
                snlist.add(lic);
            }

            //Вставляем в config.properties данные
            props.put("ActiveOtpCount", otpCount);
            props.put("ActiveClientsCount", clientsCount);
            props.put("Licensee", lices);
            props.put("LicenseExpired", date);
            props.put("CertificatesPeriod", certPeriod);

            //Инициализация утилит
            LicenseGenerator.init();

            KeyStore ks = KeyStore.getInstance("AKS", AkSigProv.PROV_NAME);
            ks.load(new FileInputStream(keyFile), pass.toCharArray());
            String a = ks.aliases().nextElement();
            PrivateKey pk = (PrivateKey) ks.getKey(a, pass.toCharArray());
            X509Certificate cert = (X509Certificate) ks.getCertificate(a);

            //Генерируем лиценцию, и записываем в файл
            String x = LicenseGenerator.generateLicense(pr, snlist, props, cert, pk);

            saveLicense(response, x, outFile, fileName);

        } catch (Exception ex) {
            LOG.error(response, ex);
        } finally {
            out.close();
        }
    }

    public void saveLicense(HttpServletResponse response, String x, String outFile, String fileName)
            throws IOException, ServletException {
        PrintWriter out = null;
        FileOutputStream fos = null;
        try {

            fos = new FileOutputStream(outFile + fileName);
            fos.write(x.getBytes());

            String headerKey = "Content-Disposition";
            String headerValue = String.format("attachment; filename=\"%s\"", fileName);
            response.setHeader(headerKey, headerValue);
            out.write(x);

        } catch (IOException ex) {
            LOG.error(response, ex);
        } finally {
            out.close();
            fos.close();
        }
    }
}

Исправил кое-что, что можно еще исправить?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы