Как мне изменить ответ на запрос на параметры http в приложении Spring MVC 2.5? -- java поле с участием http поле с участием spring-mvc пол Связанный проблема

How do I change the response for a HTTP OPTIONS request in a Spring MVC 2.5 application?


3
vote

проблема

русский

Это звучит как тривиальный вопрос, но каким-то образом я не могу понять это.

У меня есть приложение Spring MVC. Я не поддерживаю никаких HTTP-методов, кроме Get и Post. У меня есть следующий набор во всех моих контроллерах бобами:

 <код> <property name="supportedMethods" value="GET,POST"/>   

Однако запрос на опции, отправленные в мое приложение, отправляет ответы, который показывает all http-то, как разрешено.

Как изменить ответ на параметры, чтобы показать только полученные методы, как разрешено? Я знаю, что я могу сделать это в сервлете, переопределив <код> doOptions метода, но я не уверен в приложении весны MVC. Должен ли я продлить <код> DispatcherServlet и переопределить <код> doOptions ?

Приложение использует пружинный MVC 2.5.6 с помощью контроллеров на основе SimpleFormController и Confign на основе XML.

Английский оригинал

This sounds like a trivial question but somehow I can't seem to figure it out.

I have a Spring MVC application. I don't support any http methods except GET and POST. I have the following set in all my controllers beans:

<property name="supportedMethods" value="GET,POST"/> 

However, an OPTIONS request sent to my application sends back a response that shows all http methods as allowed.

How do I change the OPTIONS response to show only GET and POST methods as allowed? I know I could do this in a servlet by overriding the doOptions method, but I am not sure about a Spring MVC application. Do I have to extend the DispatcherServlet and override doOptions?

The application is using Spring mvc 2.5.6 with SimpleFormController based controllers and xml based config.

</div
        
   
   

Список ответов

1
 
vote
vote
Лучший ответ
 

Я думаю, что вы можете вызвать <код> WebContentGenerator#setSupportedMethods , который получает в качестве входного параметра, массив строк, содержащих поддерживаемые методы. <Код> WebContentGenerator - это базовый класс для контроллеров пружины 2.x, поэтому вам просто нужно вызывать этот метод во время конструкции вашего контроллера, который, безусловно, расширяет его. Вы также можете использовать конструктор WebContentGenerator, который получает строковые варярги (поддерживаемые методы) в качестве входного параметра.

К сожалению, <код> doOptions метод в <Код> FrameworkServlet класса вызывает <код> public function __construct($config = array()) { $options = array( 'driver' => 'mysqli', 'host' => 'localhost', 'user' => 'username', 'password' => 'password', 'database' => 'database', 'prefix' => 'jos_' ); //parent construct will handle setting the DB $config['dbo']=JDatabase::getInstance( $options ); parent::__construct($config); } 0 <Кода> public function __construct($config = array()) { $options = array( 'driver' => 'mysqli', 'host' => 'localhost', 'user' => 'username', 'password' => 'password', 'database' => 'database', 'prefix' => 'jos_' ); //parent construct will handle setting the DB $config['dbo']=JDatabase::getInstance( $options ); parent::__construct($config); } 1 класс. Опублика этого метода основана на объявленных методах в сервлете, что-то подобное:

 <код> public function __construct($config = array()) {     $options = array(         'driver'   => 'mysqli',         'host'     => 'localhost',         'user'     => 'username',         'password' => 'password',         'database' => 'database',         'prefix'   => 'jos_'     );      //parent construct will handle setting the DB     $config['dbo']=JDatabase::getInstance( $options );      parent::__construct($config); } 2  

ДиспетчерСерсерлет класс (и его базовый класс Frameworkservled) объявляет все эти методы: <Код> WebContentGenerator#setSupportedMethods13 , <код> public function __construct($config = array()) { $options = array( 'driver' => 'mysqli', 'host' => 'localhost', 'user' => 'username', 'password' => 'password', 'database' => 'database', 'prefix' => 'jos_' ); //parent construct will handle setting the DB $config['dbo']=JDatabase::getInstance( $options ); parent::__construct($config); } 4 , <код> public function __construct($config = array()) { $options = array( 'driver' => 'mysqli', 'host' => 'localhost', 'user' => 'username', 'password' => 'password', 'database' => 'database', 'prefix' => 'jos_' ); //parent construct will handle setting the DB $config['dbo']=JDatabase::getInstance( $options ); parent::__construct($config); } 5 , <код> public function __construct($config = array()) { $options = array( 'driver' => 'mysqli', 'host' => 'localhost', 'user' => 'username', 'password' => 'password', 'database' => 'database', 'prefix' => 'jos_' ); //parent construct will handle setting the DB $config['dbo']=JDatabase::getInstance( $options ); parent::__construct($config); } 6 / код> и т. Д., Итак, вывод <код> public function __construct($config = array()) { $options = array( 'driver' => 'mysqli', 'host' => 'localhost', 'user' => 'username', 'password' => 'password', 'database' => 'database', 'prefix' => 'jos_' ); //parent construct will handle setting the DB $config['dbo']=JDatabase::getInstance( $options ); parent::__construct($config); } 7 не то, что вы хотите. Я думаю, что единственный способ подклассный диспетченер.

 

I think you could invoke WebContentGenerator#setSupportedMethods which receives as input parameter an array of strings containing supported methods. WebContentGenerator is the base class for spring 2.x controllers, so you just need to invoke this method during the construction of your controller that surely extends it. You also could use the Constructor of WebContentGenerator that receives a string varargs (supported methods) as input parameter.

Unfortunately, the doOptions method in FrameworkServlet class invokes super.doOptions(request, response); of HttpServlet class. The ouput of this method is based on the declared methods in the servlet, something like this:

Method[] methods = getAllDeclaredMethods(this.getClass());  for (int i = 0; i < methods.length; i++) {     Method m = methods[i];      if (m.getName().equals("doGet")) {         ALLOW_GET = true;         ALLOW_HEAD = true;     }     if (m.getName().equals("doPost"))         ALLOW_POST = true;     if (m.getName().equals("doPut"))         ALLOW_PUT = true;     if (m.getName().equals("doDelete"))         ALLOW_DELETE = true; } 

The DispatcherServlet class (and its base class FrameworkServlet) declares all these methods: doPut, doDelete, doGet, doPost etc., so the output of doOptions is not what you desire. I think the only way is subclassing the DispatcherServlet.

</div
 
 
     
     
2
 
vote

Предостережение: я не обрабатывал сообщения параметров.

В вашем обработчике запроса (аннотирован с @Controller). Вы можете использовать RequestMethod.Options, чтобы обрабатывать запрос на опции. Например, вы можете использовать

 <код> public function __construct($config = array()) {     $options = array(         'driver'   => 'mysqli',         'host'     => 'localhost',         'user'     => 'username',         'password' => 'password',         'database' => 'database',         'prefix'   => 'jos_'     );      //parent construct will handle setting the DB     $config['dbo']=JDatabase::getInstance( $options );      parent::__construct($config); } 8  
 

Caveat: I have not handled OPTIONS messages.

In your request handler (annotated with @Controller) you can use RequestMethod.OPTIONS to handle an Options request. For example you might use

  ... stuff ...     @RequestMapping(RequestMethod.OPTIONS)     public String processOptions()   {   ... stuff ...   }
</div
 
 
 
 
1
 
vote

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

Подход @RequeStmapping (requestmethod.Options) не будет работать сразу, используя диспетченирвар из коробки с момента его суперкласса, Framewordservlet, первых делегатов в свой суперкласс, httpservlet, как отмечено выше, которое сканирует сервлет, чтобы увидеть, если он реализует Методы doxxx и устанавливают верхний заголовок соответственно. Но после вызова Super.dooptions (...) Затем есть эти строки:

 <код> if (this.dispatchOptionsRequest) {      processRequest(request, response); }   

И есть SetDispatchOptionsrequest (Boolean), который можно использовать для установки значения DispatchTionsrequest для True. Только тогда DispatcherServlet передает контроллеру запрос параметров в соответственно аннотированный метод.

Мне нужно было сделать это, чтобы позволить запросу параметров вернуть разные значения на основе разрешений текущего пользователя. Таким образом, путем подклассов DispatcherServlet и настройка этого параметра в его конструкторе по умолчанию я наконец смогли получить вызов в моем контроллере для запросов HTTP-параметров и обрабатывать его самостоятельно.

И еще одна мысль, в этом методе контроллера вы можете объявить параметр типа httpservletresponse, а весна будет передавать вам экземпляр. После того, как вы можете позвонить сброс (), чтобы очистить кнопку «Разрешить заголовок», и катите свой собственный по мере необходимости.

(Примечание: аналогичная скороговорка имела в Frameworkservlet для поддержки HTTP Trace с помощью SetDispatchtracerequest, если вы планируете получать эти запросы до ваших методов контроллера, аннотированные с @Requestmapping (requestmethod.trace)).

 

I know that this is a bit old but I've found additional info on this question that I hope will help others in the future.

The @RequestMapping(RequestMethod.OPTIONS) approach won't work immediately using the DispatcherServlet out of the box since its superclass, FrameworkServlet, first delegates to its superclass, HttpServlet, as noted above which scans the servlet to see if it implements the doXXX methods and sets the Allow header accordingly. But following the call to super.doOptions(...) it then has these lines:

if (this.dispatchOptionsRequest) {      processRequest(request, response); } 

And there is a setDispatchOptionsRequest(boolean) that can be used to set the dispatchOptionsRequest value to true. Only then will the DispatcherServlet pass to the controller the OPTIONS request to an appropriately annotated method.

I needed to do this to allow the OPTIONS request to return different values based upon authorizations of the current user. So by subclassing DispatcherServlet and setting that parameter in its default constructor I was finally able to receive the call in my controller for http OPTIONS requests and handle it on my own.

And one more thought, in that controller method you can declare a parameter of type HttpServletResponse and Spring will hand the instance to you. Once had you can call reset() to purge the Allow header already set and roll your own as needed.

(Note: A similar patter is had in FrameworkServlet for http TRACE support via a setDispatchTraceRequest if you plan on getting those requests through to your controller methods annotated with @RequestMapping(RequestMethod.TRACE)).

</div
 
 

Связанный проблема

1  Apache Vamel: Как проверить, например, набор набора <customObject>  ( Apache camel how to test for instance of setcustomobject ) 
Кто-нибудь знает, как тестировать для различных типов коллекции в маршруте? <код> // This processor returns a Collection of 2 Sets // 1. Set<GoodMessage> //...

0  Передаваемые данные из другого потока, медленно последовательная связь с библиотекой Java и RxTx  ( Transmitting data from another thread slow serial link with java and rxtx libra ) 
<Р> Хорошо, я постараюсь быть как можно более ясно с моей проблемой. Я передача последовательных данных по veeeeeeery медленного радиоканала (с помощью UART-ко...

2  Изменить формат дата в DTO JSON на возвращении через @Responsebode  ( Change date format in dto json on returning through responsebody ) 
Я просто хочу изменить формат даты в моем DTO, возвращенный @Responseboodbody Мой вопрос не Этот вопрос как мой выход Список JSON и я печатаю его по почте...

2  Мой бар jmenu не показывает  ( My jmenu bar is not showing up ) 
Мой jmenubar не показывает, когда я запускаю свое приложение. Как я могу это исправить ?? Поэтому, когда я бегу свой Jframe, мне нужно увидеть мой jmenubar ...

1  Содержание XML преобразования передается с POST на объект Java, атрибут внутри элемента: REST  ( Rest convert xml content passed with post to a java object attribute inside th ) 
<Р> Я работаю с REST сервисов и я хочу передать XML-текст запроса POST. Мой сервер реализован в JAVA. Давайте предположим, что я посылаю этот XML: <код> <ran...

4  403 доступ запрещен на указанный URL в Tomcat 7.0.52  ( 403 access denied to specified url in tomcat 7 0 52 ) 
Я недавно мигрировал сервер Tomcat из <код> 7.0.49 на <код> 7.0.52 . В Tomcat он содержит 2 веб-приложений, которые работали ранее, после миграции на эту вер...

0  карта JSON на провал строки в Java  ( Json map to string failure in java ) 
В Java я пытаюсь преобразовать карту в JSon строку. используя код ниже <код> private void sendResponse(Map<String, String> responseMap) throws IOException {...

1  Как вызвать мой метод reзов API, интегрированный с Redis на Windows?  ( How to invoke my restful api method integrated with redis on windows ) 
Я пытаюсь запустить образец весеннего загрузочного приложения с Redis. Я использую завод соединения JEDIS и установив его на заводе подключения шаблона Redis....

16  Обычная задача Android (эквивалент Cronjob)  ( Android regular task cronjob equivalent ) 
Последний раз, когда этот вопрос был задан (другим пользователем), ответ ответа был: Если это работает в беговой активности, вы можете использовать таймер ...

0  Прямоугольник и круг Collision Java, используя .Наиград  ( Rectangle and circle collision java using intersection ) 
Я делаю игру на прорыв для школьного проекта. Единственная проблема, которую я бегу в, это мяч, подпрыгивая, когда мяч и кирпичи сталкиваются. Я использовал B...

0  Случайные 7-значные номера на andich android  ( Random 7 digit numbers on click android ) 
Я хотел бы, чтобы вы помогли мне в этом коде. Я могу генерировать случайные числа, но не в точном количестве. Вопрос: Как я могу генерировать 7 случайных ци...

-1  Как добавить JTable для JPanel  ( How to add a jtable to a jpanel ) 
Мой вопрос может показаться немного глупо, но каждый раз, когда я использую качели, у меня проблемы с таблицами. Таким образом, я работаю над школьным проекто...

40  Можете ли вы сказать во время выполнения, если вы запускаете Java из банки?  ( Can you tell on runtime if youre running java from within a jar ) 
У меня есть приложение, которое некоторые из моих пользователей работают от Eclipse, и другие запускают его, используя файл JAR. Я хочу, чтобы некоторые дей...

16  Enum внутри jsp [дубликат]  ( Enum inside a jsp ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

1  Установка поля _ID с использованием SQLite & ContentProvider в Android  ( Setting the id field using sqlite contentprovider in android ) 
Я пытаюсь настроить ContentProvider в приложении Android, чтобы держать информацию о домах. Я хотел бы иметь возможность установить поле _id, чтобы быть таким...

Связанный проблема

1  Apache Vamel: Как проверить, например, набор набора <customObject> 
0  Передаваемые данные из другого потока, медленно последовательная связь с библиотекой Java и RxTx 
2  Изменить формат дата в DTO JSON на возвращении через @Responsebode 
2  Мой бар jmenu не показывает 
1  Содержание XML преобразования передается с POST на объект Java, атрибут внутри элемента: REST 
4  403 доступ запрещен на указанный URL в Tomcat 7.0.52 
0  карта JSON на провал строки в Java 
1  Как вызвать мой метод reзов API, интегрированный с Redis на Windows? 
16  Обычная задача Android (эквивалент Cronjob) 
0  Прямоугольник и круг Collision Java, используя .Наиград 
0  Случайные 7-значные номера на andich android 
-1  Как добавить JTable для JPanel 
40  Можете ли вы сказать во время выполнения, если вы запускаете Java из банки? 
16  Enum внутри jsp [дубликат] 
1  Установка поля _ID с использованием SQLite & ContentProvider в Android