Как я получаю HTML ответа из HttpModule?

Вот некоторые общие опции, заказанные от простого (острота) к комплексу (огромная библиотека).

Опция 1: Фрагмент кода - Простой

Одно очень простое решение должен использовать BigInteger шестнадцатеричное представление:

new BigInteger(1, someByteArray).toString(16)

Примечание, что, так как это обрабатывает числа не произвольный строки байтов , это опустит начальные нули - это может или не может быть тем, что Вы хотите (например, 000AE3 по сравнению с 0AE3). Это также очень медленно, приблизительно [1 123] 50x медленнее по сравнению со следующей опцией.

Опция 2: Фрагмент кода - Усовершенствованный

Вот является полнофункциональным фрагментом кода, поддерживающим верхний/строчный и порядок байтов . Это оптимизировано, чтобы минимизировать сложность памяти и максимизировать производительность и должно быть совместимо со всеми современными версиями Java (5 +).

private static final char[] LOOKUP_TABLE_LOWER = new char[]{0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66};
private static final char[] LOOKUP_TABLE_UPPER = new char[]{0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46};

public static String encode(byte[] byteArray, boolean upperCase, ByteOrder byteOrder) {

    // our output size will be exactly 2x byte-array length
    final char[] buffer = new char[byteArray.length * 2];

    // choose lower or uppercase lookup table
    final char[] lookup = upperCase ? LOOKUP_TABLE_UPPER : LOOKUP_TABLE_LOWER;

    int index;
    for (int i = 0; i < byteArray.length; i++) {
        // for little endian we count from last to first
        index = (byteOrder == ByteOrder.BIG_ENDIAN) ? i : byteArray.length - i - 1;

        // extract the upper 4 bit and look up char (0-A)
        buffer[i << 1] = lookup[(byteArray[index] >> 4) & 0xF];
        // extract the lower 4 bit and look up char (0-A)
        buffer[(i << 1) + 1] = lookup[(byteArray[index] & 0xF)];
    }
    return new String(buffer);
}

public static String encode(byte[] byteArray) {
    return encode(byteArray, false, ByteOrder.BIG_ENDIAN);
}

Это по существу использует код в опции 3. Если Вы хотите видеть некоторых , микро сравнительный тест JMH , сравнивая несколько реализаций, видит здесь . Полный исходный код с лицензией Apache v2 и декодером может быть найден здесь .

Опция 3: Пользование небольшой оптимизированной библиотекой: Java байтов

При работе над моим предыдущим проектом, я создал этот небольшой инструментарий для работы с байтами в Java. Это не имеет никаких внешних зависимостей и совместимо с Java 7 +. Это включает, среди других, очень быстрого и хорошо протестированного ШЕСТНАДЦАТЕРИЧНОГО en/decoder:

import at.favre.lib.bytes.Bytes;
...
Bytes.wrap(someByteArray).encodeHex()

можно проверить его на [1 114] GitHub: Java байтов .

Опция 4: Apache Кодек палаты общин

, Конечно, существует польза 'ol кодеки свободного городского населения . ( мнение о предупреждении вперед ) При работе над проектом, обрисованным в общих чертах выше, я проанализировал код и был вполне разочарован; много дубликата неорганизованный код, устаревшие и экзотические кодеки, вероятно, только полезные для очень немногих и вполне по спроектированным и медленным реализациям популярных кодеков (конкретно Base64). Я поэтому сделал бы обоснованное решение, если Вы хотите использовать его или альтернатива. Так или иначе, если Вы все еще хотите использовать его, вот фрагмент кода:

import org.apache.commons.codec.binary.Hex;
...
Hex.encodeHexString(someByteArray));

Опция 5: Гуава Google

, Как правило, Вы уже имеете Гуава как зависимость. Раз так просто используйте:

import com.google.common.io.BaseEncoding;
...
BaseEncoding.base16().lowerCase().encode(someByteArray);

Опция 6: безопасность Spring

, Если Вы используете платформа Spring с [1 118] безопасность Spring , можно использовать следующее:

import org.springframework.security.crypto.codec.Hex
...
Hex.encode(someByteArray);

совместимость Java 9 или 'Не Использует JAXBs javax/xml/bind/DatatypeConverter'

В предыдущем Java (8, и ниже) присваивает версию коду Java для JAXB, был включен как зависимость во время выполнения. Начиная с Java 9 и модуляризация Мозаики Ваш код не может получить доступ к другому коду за пределами, он - модуль. Так знайте, если Вы получаете исключение как:

java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

при работе JVM с Java 9 +. Раз так тогда переключите реализации на любую из альтернатив выше. См. также этот вопрос .

10
задан spilliton 4 September 2009 в 18:11
поделиться

2 ответа

Забавная маленькая задача.

Вот код:

StreamWatcher.cs

    public class StreamWatcher : Stream
    {
        private Stream _base;
        private MemoryStream _memoryStream = new MemoryStream();

        public StreamWatcher(Stream stream)
        {
            _base = stream;
        }

        public override void Flush()
        {
            _base.Flush();
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            return _base.Read(buffer, offset, count);
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            _memoryStream.Write(buffer, offset, count);
            _base.Write(buffer, offset, count);
        }

        public override string ToString()
        {
            return Encoding.UTF8.GetString(_memoryStream.ToArray());
        }

        #region Rest of the overrides
        public override bool CanRead
        {
            get { throw new NotImplementedException(); }
        }

        public override bool CanSeek
        {
            get { throw new NotImplementedException(); }
        }

        public override bool CanWrite
        {
            get { throw new NotImplementedException(); }
        }

        public override long Seek(long offset, SeekOrigin origin)
        {
            throw new NotImplementedException();
        }

        public override void SetLength(long value)
        {
            throw new NotImplementedException();
        }

        public override long Length
        {
            get { throw new NotImplementedException(); }
        }

        public override long Position
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
        #endregion
    }

TitleModule.cs

public class TitleModule : IHttpModule
{
    public void Dispose()
    {
    }

    private static Regex regex = new Regex(@"(?<=<title>)[\w\s\r\n]*?(?=</title)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
    private StreamWatcher _watcher;
    public void Init(HttpApplication context)
    {
        context.BeginRequest += (o, e) => 
        {
            _watcher = new StreamWatcher(context.Response.Filter);
            context.Response.Filter = _watcher;
        };


        context.EndRequest += (o, e) =>
        {
            string value = _watcher.ToString();
            Trace.WriteLine(regex.Match(value).Value.Trim());
        };
    }
}
25
ответ дан 3 December 2019 в 15:35
поделиться

На 4GuysFromRolla есть статья, в которой рассказывается о создании фильтров HttpResponse, которые в основном представляют собой потоки, которые обрабатывают ответ перед передачей его в конечный выходной поток (перехватчик).

http: / /aspnet.4guysfromrolla.com/articles/120308-1.aspx[1213 visible

3
ответ дан 3 December 2019 в 15:35
поделиться
Другие вопросы по тегам:

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