Клиентские сертификаты Java по HTTPS/SSL

Вот код с вашим требованием.

Вам нужно создать действие для фильтрации подкатегории, реализовать событие изменения выпадающего списка в jquery, в вызове события изменения AJAX получить данные.

Контроллер:

 public class ProductController : Controller
    {
        private static List<tbl_shopCategory> categories = new List<tbl_shopCategory>
        {
            new tbl_shopCategory
            {
                cat_id = 1, cat_name = "Beverage"
            },
            new tbl_shopCategory
            {
                cat_id = 2, cat_name = "Fruits"
            }
        };

        private static List<tbl_subCategory> subcategories = new List<tbl_subCategory>
        {
            new tbl_subCategory
            {
                scat_id = 1, scat_fk_cat_id = 1, scat_name = "Sub Beverage 1"
            },
            new tbl_subCategory
            {
                scat_id = 2, scat_fk_cat_id = 1, scat_name = "Sub Beverage 2"
            },

            new tbl_subCategory
            {
            scat_id = 3, scat_fk_cat_id = 2, scat_name = "Sub Fruits 1"
        },
        new tbl_subCategory
        {
            scat_id = 4, scat_fk_cat_id = 2, scat_name = "Sub Fruits 2"
        }
        };
        public ActionResult CreateProduct()
        {
            //if (Session["ad_id"] != null)
            //{
            List<tbl_shopCategory> lst = categories;
            List<tbl_subCategory> li = subcategories;
            ViewBag.cat = new SelectList(lst, "cat_id", "cat_name");
            ViewBag.scat = new SelectList(li, "scat_id", "scat_name");


            return View();
            //}
            //else
            //{
            //    return RedirectToAction("AdminSignIn");
            //}

        }

        public JsonResult GetSubCategory(int categoryId)
        {
           return Json(subcategories.Where(c => c.scat_fk_cat_id == categoryId).ToList(), JsonRequestBehavior.AllowGet) ;
        }
    }

    public class tbl_subCategory
    {
        public int scat_id { get; set; }

        [Required(ErrorMessage = "Input field required*")]
        public string scat_name { get; set; }
        public string scat_img { get; set; }
        [Required(ErrorMessage = "Input field required*")]
        public int scat_fk_cat_id { get; set; }
    }

    public class tbl_shopCategory
    {
        public int cat_id { get; set; }
        public string cat_name { get; set; }
        public string cat_img { get; set; }
    }

CreateProduct.cshtml

@using System.Collections

@{
    ViewBag.Title = "CreateProduct";
}

<h2>CreateProduct</h2>

@Html.DropDownList("Category", (IEnumerable<SelectListItem>)ViewBag.cat, string.Empty, new {})

@Html.DropDownList("SubCategory", (IEnumerable<SelectListItem>)ViewBag.scat, string.Empty, new { })

<script src="~/scripts/jquery-1.10.2.js"></script>
<script>

    $('#Category').change(function () {
        var categoryId = $('#Category').val();
        $.ajax({
            url: '/Product/GetSubCategory',
            type: 'GET',
            datatype: 'JSON',
            data: { categoryId: categoryId },
            success: function (result) {
                $('#SubCategory').html('');
                $('#SubCategory').append($('<option>Select</option>'));
                $.each(result, function (i, item) {
                    $('#SubCategory').append($('<option></option>').val(item.scat_id).html(item.scat_name));;
                });
            }
        });
    });
</script>
114
задан javanna 12 July 2011 в 10:12
поделиться

6 ответов

Finally solved it ;). Got a strong hint here (Gandalfs answer touched a bit on it as well). The missing links was (mostly) the first of the parameters below, and to some extent that I overlooked the difference between keystores and truststores.

The self-signed server certificate must be imported into a truststore:

keytool -import -alias gridserver -file gridserver.crt -storepass $PASS -keystore gridserver.keystore

These properties need to be set (either on the commandline, or in code):

-Djavax.net.ssl.keyStoreType=pkcs12
-Djavax.net.ssl.trustStoreType=jks
-Djavax.net.ssl.keyStore=clientcertificate.p12
-Djavax.net.ssl.trustStore=gridserver.keystore
-Djavax.net.debug=ssl # very verbose debug
-Djavax.net.ssl.keyStorePassword=$PASS
-Djavax.net.ssl.trustStorePassword=$PASS

Working example code:

SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
URL url = new URL("https://gridserver:3049/cgi-bin/ls.py");
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslsocketfactory);
InputStream inputstream = conn.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

String string = null;
while ((string = bufferedreader.readLine()) != null) {
    System.out.println("Received " + string);
}
95
ответ дан 24 November 2019 в 02:33
поделиться

Переменная должна быть где-то определена. Я бы объявил его как глобальную переменную в MyLib.c , а затем объявил бы только как extern в main.c .

Что происходит? что для обоих MyLib.c и main.c компилятору сообщается, что переменная существует и является int , но что это где-то еще ( extern ). Это нормально, но тогда оно должно быть где-то еще, и когда ваш компоновщик пытается связать все файлы вместе, он не может найти, что Переменная на самом деле нигде не находится, поэтому он сообщает вам, что это не так. не существует.

Попробуйте следующее:

MyLib.c:

int Variable;

MyLib.h:

extern int Variable;

main.c:

21
ответ дан 24 November 2019 в 02:33
поделиться

Я использую пакет HTTP-клиента Apache commons для этого в моем текущем проекте, и он отлично работает с SSL и самозаверяющим сертификатом (после его установки в cacerts, как вы упомянули). Взгляните на это здесь:

http://hc.apache.org/httpclient-3.x/tutorial.html

http://hc.apache.org/httpclient-3.x/sslguide .html

4
ответ дан 24 November 2019 в 02:33
поделиться

Хотя это не рекомендуется, вы также можете полностью отключить проверку сертификата SSL:

import javax.net.ssl.*;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;

public class SSLTool {

  public static void disableCertificateValidation() {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] { 
      new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() { 
          return new X509Certificate[0]; 
        }
        public void checkClientTrusted(X509Certificate[] certs, String authType) {}
        public void checkServerTrusted(X509Certificate[] certs, String authType) {}
    }};

    // Ignore differences between given hostname and certificate hostname
    HostnameVerifier hv = new HostnameVerifier() {
      public boolean verify(String hostname, SSLSession session) { return true; }
    };

    // Install the all-trusting trust manager
    try {
      SSLContext sc = SSLContext.getInstance("SSL");
      sc.init(null, trustAllCerts, new SecureRandom());
      HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
      HttpsURLConnection.setDefaultHostnameVerifier(hv);
    } catch (Exception e) {}
  }
}
81
ответ дан 24 November 2019 в 02:33
поделиться

Я думаю, у вас проблема с сертификатом сервера, это недействительный сертификат (я думаю, это то, что означает "handshake_failure" в данном случае):

Импортируйте сертификат сервера в свой trustcacerts хранилище ключей на клиентской JRE. Это легко сделать с помощью keytool :

keytool
    -import
    -alias <provide_an_alias>
    -file <certificate_file>
    -keystore <your_path_to_jre>/lib/security/cacerts
4
ответ дан 24 November 2019 в 02:33
поделиться

Если вы имеете дело с вызовом веб-сервиса с использованием фреймворка Axis, есть гораздо более простой ответ. Если вы хотите, чтобы ваш клиент мог вызывать веб-службу SSL и игнорировать ошибки сертификата SSL, просто поместите это утверждение перед вызовом любой веб-службы:

System.setProperty("axis.socketSecureFactory", "org.apache.axis.components.net.SunFakeTrustSocketFactory");

Применяются обычные оговорки о том, что это очень плохая вещь для использования в производственной среде.

Я нашел это на вики Axis.

13
ответ дан 24 November 2019 в 02:33
поделиться
Другие вопросы по тегам:

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