2015-08-10 2 views
3

Я пытаюсь извлечь агент пользователя в моем пользовательском фильтре:Нет агент пользователя (getAgent) в фильтре, предшествующий ресурс

public class MyFilter extends Filter { 
    @Override 
    protected int beforeHandle(Request request, Response response) { 
     String ua = request.getClientInfo().getAgent(); 
    } 
} 

Но я всегда получаю uaнуль.

Когда запрос переходит к моей Resource, я все-таки удается извлечь агента пользователя с помощью вызова:

String ua = getRequest().getClientInfo().getAgent(); 

Вопросы:

  1. Почему это происходит?
  2. Как я могу это преодолеть?

ответ

2

Я только что проверил ваш прецедент с версией 2.3.1 Restlet, и я не могу воспроизвести вашу проблему. Не могли бы вы дать нам больше намеков на ваш контекст.

Вот что я использовал.

  • pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
            http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
        <modelVersion>4.0.0</modelVersion> 
        <groupId>org.restlet</groupId> 
        <artifactId>restlet-user-agent</artifactId> 
        <name>${project.artifactId}</name> 
        <packaging>jar</packaging> 
        <version>1.0.0-snapshot</version> 
    
        <properties> 
         <java-version>1.7</java-version> 
         <restlet-version>2.3.1</restlet-version> 
        </properties> 
    
        <dependencies> 
         <dependency> 
          <groupId>org.restlet.jse</groupId> 
          <artifactId>org.restlet</artifactId> 
          <version>${restlet-version}</version> 
         </dependency> 
        </dependencies> 
    
        <repositories> 
         <repository> 
          <id>maven-restlet</id> 
          <name>Public online Restlet repository</name> 
          <url>http://maven.restlet.com</url> 
         </repository> 
        </repositories> 
    </project> 
    
  • Фильтр

    public class MyFilter extends Filter { 
        public MyFilter() { 
         super(); 
        } 
    
        public MyFilter(Context context, Restlet next) { 
         super(context, next); 
        } 
    
        public MyFilter(Context context) { 
         super(context); 
        } 
    
        @Override 
        protected int beforeHandle(Request request, Response response) { 
         String ua = request.getClientInfo().getAgent(); 
         System.out.println("[filter] ua = " + ua); 
         return Filter.CONTINUE; 
        } 
    } 
    
  • ресурсов сервера

    public class MyServerResource extends ServerResource { 
        @Get 
        public String test() { 
         String ua = getRequest().getClientInfo().getAgent(); 
         System.out.println("[server resource] ua = " + ua); 
         return "test"; 
        } 
    } 
    
  • Применение

    public class RestletApplication extends Application { 
        @Override 
        public Restlet createInboundRoot() { 
         Router router = new Router(getContext()); 
    
         router.attach("/test", MyServerResource.class); 
         MyFilter filter = new MyFilter(getContext(), router); 
         return filter; 
        } 
    } 
    

Вот следы, которые я получил с помощью почтальону в Chrome:

[filter] ua = Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36 
[server resource] ua = Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36 

Надеется, что это поможет вам все-таки. Thierry

+0

Спасибо за ответ, я тестировал сейчас локально самостоятельно, и он, похоже, работает, поэтому он должен быть проблемой с моей производственной средой ... не может точно определить, что вызывает ее. – Igor

+0

работает локально, но когда я развертываю свой код в производственной среде, он не работает. – Igor

+0

Не могли бы вы предоставить нам более подробную информацию о вашей производственной среде? Есть ли какие-то обратные прокси? Не могли бы вы также предоставить нам фактически запрос, полученный вашим сервером Restlet (как только запрос передается через разные слои перед ним)? Благодаря! –