forum.bitel.ru http://forum.bitel.ru/ |
|
проверка разрешения печати на данный принтер. http://forum.bitel.ru/viewtopic.php?f=28&t=10206 |
Страница 1 из 1 |
Автор: | bpoleg [ 20 фев 2015, 12:04 ] |
Заголовок сообщения: | проверка разрешения печати на данный принтер. |
День добрый. Есть задача ограничить печать на принтера. Что бы кассир не смог напечатать на другой принтер. при этом используется динамический днс. Как бы заранее нельзя сделать список разрешенных принтеров. Есть способ проверить ip кассира : public static void main(String args[]) throws SocketException { Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); for (NetworkInterface netint : Collections.list(nets)) { displayInterfaceInformation(netint); } } private static void displayInterfaceInformation( NetworkInterface netint) throws SocketException { System.out.printf("Display name: %s%n", netint.getDisplayName()); System.out.printf("Name: %s%n", netint.getName()); Enumeration<InetAddress> inetAddresses =netint.getInetAddresses(); for (InetAddress inetAddress : Collections.list(inetAddresses)) { System.out.printf("InetAddress: %s%n", inetAddress); } System.out.printf("%n"); } Можно ли активировать какое либо событие например вход кассира, что бы зафиксировать его ip. и потом при печати проверять его ip и ip принтера. получается два вопроса: 1. как получить экземпляр PrinterManager в скрипте печати? 2. Существует ли какое либо событие , работающее локально у кассира, желательно при входе, на которое можно повесить свой дополнительный обработчик? Спасибо. |
Автор: | dimOn [ 20 фев 2015, 14:03 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
bpoleg писал(а): 1. как получить экземпляр PrinterManager в скрипте печати? зачем там PrinterManager в этой задаче? сам объект Printer текущий передаётся в методы печати в новых скриптах: http://bgbilling.ru/v6.2/javadoc/ru/bit ... ilder.html примеры как напрямую сконструировать сам PrinterManager внутри скрипта тут есть: http://wiki.bitel.ru/index.php/%D0%9F%D ... _CashCheck bpoleg писал(а): 2. Существует ли какое либо событие , работающее локально у кассира, желательно при входе, на которое можно повесить свой дополнительный обработчик? Спасибо. Это непонятно. Что такое событие работающее локально? |
Автор: | bpoleg [ 20 фев 2015, 14:12 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
Биллинг состоит из двух частей. Серверная и клиентская. С серверной части как получить айпи адрес подключившегося пользователя? В клиентской части можно опросить сетевые интерфейсы, как уже указывал. Забыл указать версию биллинга, 5.2 |
Автор: | dimOn [ 20 фев 2015, 15:06 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
На клиенте нет никаких событий. И понятия "подключившегося пользователя" тоже нет на сервере. Каждый запрос обособленный, нет ни сессий ничего подобного, каждый раз передаётся логин-пароль и за судьбой юзера между запросами не следится. |
Автор: | bpoleg [ 20 фев 2015, 15:25 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
Если архитектура основана на вебсервисах, то это понятно. 1. Сервер не понмнит что делал клиент в предыдущий запрос, но сервер может знать откуда пришел запрос и какой пользователь его выполняет? 1.1 Подобие сессии должно быть на клиенте, как - то он должен свое состояние отслеживать? 2. При печати чека как узнать какой принтер выбран? Скрпит бгбс. получаем check = event.getCheck(); Спасибо. |
Автор: | dimOn [ 20 фев 2015, 15:51 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
Вы задаёте вопросы, но не описываете контекста совершенно. Разумеется, сервере знает откуда пришёл запрос. Другое дело делегируется ли это знание в скрипты, например. В большинстве событий есть такое, userId. Вы про какое событие сейчас? Если формирование чека то там есть тоже такое. Цитата: Подобие сессии должно быть на клиенте, как - то он должен свое состояние отслеживать? какое состояние? зачем? нет там никакой сессии. "сессия" для клиента биллинга - это текущий подключенный сервер и всё. больше состояние никакое не хранится.Цитата: 2. При печати чека как узнать какой принтер выбран? что значит "при печати чека"? в момент формирования чека? Ну тогда там же есть всё это: event.getPrinter() |
Автор: | bpoleg [ 20 фев 2015, 16:07 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
как получить принтер на который идет печать нашел: Printer pr = event.getPrinter(); print("printer(adres)="+pr.getAddress()+" port="+pr.getPort()+" title="+pr.getTitle()); Можно ли узнать пользователя, который печатает? и с каког айпи он пришел? Спасибо. |
Автор: | dimOn [ 20 фев 2015, 16:45 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
Зачем что-то искать? Вы наугад пишете что ли? Есть же полный API по всем классам. http://bgbilling.ru/v5.2/javadoc/ru/bit ... Event.html Там есть userId но скорее всего там будет USER_SERVER т.е. ноль всегда, потому что в общем случае там и юзера то нету, а раньше чек вообще асинхронно печатался. Но теоретически можно реального юзера передавать когда он есть, что-то можно придумать, наверно. Пишите в HelpDesk. Айпи не знаю как даже, это вообще задача странная. Скорее всего никак без огромных костылей. |
Автор: | bpoleg [ 20 фев 2015, 17:01 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
нашел и платеж, который печатается, нашел номер пользователя, но как найти пользователя? и откуда он пришел? |
Автор: | stark [ 20 фев 2015, 18:48 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
bpoleg писал(а): нашел и платеж, который печатается, нашел номер пользователя, но как найти пользователя? и откуда он пришел? Эта информация не передается в событие . Пока никак. Мы можем туда добавить id пользователя, но добавлять откуда он пришел - уже перебор. |
Автор: | bpoleg [ 24 фев 2015, 12:35 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
Мне кажется, что для безопасности ответ на вопрос "откуда пришел" это один из важных акцентов. Может не прав? |
Автор: | stark [ 24 фев 2015, 12:52 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
bpoleg писал(а): Мне кажется, что для безопасности ответ на вопрос "откуда пришел" это один из важных акцентов. Может не прав? Вы предлагает во все события помещать информацию "откуда пришел" ? Есть система проверки прав, есть логирование запросов, "откуда пришел" есть в access-логах. Пока в обработчиках событий это было никому не нужно, хватало только userId. Мы назначаем права на пользователя и нет ограничений откуда пришел. Если только эту информацию добавить в качестве исключения в это событие для CashCheck. |
Автор: | dimOn [ 24 фев 2015, 13:31 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
Ну добавить то можно что угодно при желании, но лично мне кажется, оно будет костылём. Ну и семантика событий этих вовсе не "юзер печатает чек", а просто формирование его вида при любой операции с чеком. Цитата: Если только эту информацию добавить в качестве исключения в это событие для CashCheck. Дело ещё в том, что в новых версиях это не событие, а просто вызов дин.кода. Все эти события упразднены (потому в 5.2 в любом случае делаться не будет ничего такого без отдельного на то указания).
|
Автор: | vkulakov [ 24 фев 2015, 15:03 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
Для решения своей задачи как-раз делал костыль с определением IP-адреса клиента. Единственное отличие - передавал адрес не в дин. код, а в xsl в личный кабинет. Далее краткое описание решения. 1. В файле web.xml добавляем новый фильтр, например, RemoteHostFilter. 2. Фильтр RemoteHostFilter имеет примерно следующее содержимое: Код: /** * <p><b>Сохранение удалённого хоста в кеше</b></p> * <p>Получает удалённый хост клиента из запроса и сохраняет в локальную переменную потока * для будущего использования.</p> */ public class RemoteHostFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; RequestDataHolder.setHost(request.getHeader("host")); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } } 3. Кеш RequestDataHolder имеет примерно следующее содержимое: Код: /** * <p><b>Сохранение данных запроса локально в каждом потоке</b></p> */ public class RequestDataHolder { private static final ThreadLocal<String> hostHolder = new ThreadLocal<String>(); public final static String getHost() { return hostHolder.get(); } public final static void setHost(String host) { hostHolder.set(host); } } 4. В любом скрипте, который обрабатывает запросы пользователей, вызвать getHost для получения адреса клиента. Идея в том, что для каждого запроса пользователя создаётся свой поток и мы можем сохранить адрес в переменной потока. Для обработки асинхронных событий такой метод использовать напрямую нельзя, для синхронных, наверное, тоже, т. к. они обрабатываются в других потоках. |
Автор: | dimOn [ 24 фев 2015, 15:55 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
кстати, интересный вариант. может сработать. эти события и дин.код в новых версиях вызываются синхронно, конечно. |
Автор: | vkulakov [ 24 фев 2015, 16:18 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
Синхронно не значит в одном потоке. Мой вариант работает только если всё исполняется в одном потоке. Для описанной проблемы нужно допиливать ещё либо искать другие варианты. |
Автор: | dimOn [ 24 фев 2015, 17:06 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
vkulakov писал(а): Синхронно не значит в одном потоке. Мой вариант работает только если всё исполняется в одном потоке. Для описанной проблемы нужно допиливать ещё либо искать другие варианты. в общем случае, конечно, не значит. но здесь обработка запросов идёт в одном потоке и многопоточности нет нигде никакой, тем более если синхронно чего-то там надо. |
Автор: | vkulakov [ 24 фев 2015, 19:47 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
Перечитал тему с начала и понял, что ничего не понял. Зачем здесь события, если в доках написано "для формирования вида чека использовать динамический код, события устарели". В общем, ждём автора топика. |
Автор: | dimOn [ 24 фев 2015, 20:15 ] |
Заголовок сообщения: | Re: проверка разрешения печати на данный принтер. |
в дин.коде того что нужно автору топика тоже нету) |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |