It looks like you've encountered a complex issue with OFBiz's AJAX call
handling, specifically how the `*SetTimeZoneFromBrowser*` request is
failing due to URL pattern mismatches, leading to a  *405 error* .

 *Issue Breakdown *
- The request `*SetTimeZoneFromBrowser*` is defined in `
*common-controller.xml*`, making it globally available.
- JavaScript attempts to execute it via a *relative URL*, causing
inconsistencies when combined with REST-style URLs.
- The `*ControlServlet*` fails to recognize the request format, leading to
the  405 error .

*Proposed Solution*
- Instead of using relative calls, '*a dedicated webapp*' (`common-js`) is
suggested for handling these requests, ensuring proper routing.
- The webapp would act as a relay, avoiding exposure of `framework/common`
and separating theming from functional requests.
- Example fix:
  ```js
  $.ajax({
      url: "/common-js/control/SetTimeZoneFromBrowser",
      type: "POST",
      async: false,
  });
  ```
  --------------------------------------------------------------


Implementing a  *switch-case structure*  can help manage different AJAX
requests effectively, but it needs additional adjustments to fully resolve
the '405 error issue' you described in Apache OFBiz. Below is a 'full
implementation strategy' that addresses the problem while ensuring security
and proper request routing.

---

Suggest Solution: Using a Dedicated WebApp with Dynamic Routing

Since the issue arises due to 'incorrect request routing in REST-style
URLs', we will:
1.  Use a dedicated web app (`commonext`)  to handle such AJAX requests.
2.  Implement a switch-case structure in JavaScript  to dynamically adjust
request URLs.
3. Ensure security by managing authentication separately  for the web app.

---

 Step-by-Step Implementation

 1. Configure the Dedicated WebApp (`commonext`)
Modify `webapp.xml` to set up a new web app that will act as a relay for
common requests.

------------------------  xml


*<web-app name="commonext" location="commonext" app-bar-display="true">
<security security-constraint="true"/></web-app>*
------------------------

2. Define Request Handlers in `commonext-controller.xml`
Create handler mappings in `commonext-controller.xml` to process requests
properly.







*---------------------------xml<request-map uri="SetTimeZoneFromBrowser">
  <security https-required="true" auth-required="false"/>    <event
type="service" name="setTimeZoneService"
invoke="org.ofbiz.common.SetTimeZone"/>    <response name="json"
type="json"/></request-map>----------------------------*

 3. Update the JavaScript AJAX Calls
Modify the AJAX call in JavaScript to ensure requests are directed through
`commonext`.













*------------------------ jsfunction getRequestUrl(requestType) {    switch
(requestType) {        case "timezone":            return
"/commonext/control/SetTimeZoneFromBrowser";        case "inventory":
      return "/commonext/control/GetStockDetails";        case "order":
        return "/commonext/control/FetchOrderStatus";        default:
      return "/commonext/control/DefaultHandler";    }}*











*$.ajax({    url: getRequestUrl("timezone"),    type: "POST",    async:
false,    success: function(response) {        console.log("Request
successful!", response);    },    error: function(error) {
console.log("Error in request!", error);    }});*
-----------------------------------

 4. Address Authentication Issue
Since separate web apps maintain independent sessions, use  token-based
authentication or a cookie-based method.

-  Option 1: SSO (Single Sign-On)
  - Implement an  OAuth-based authentication system .
  - Users authenticate once, and tokens are passed across multiple web apps.

-  Option 2: Secure Cookie-Based Authentication
  - Generate a security token upon login.
  - Store the token in a  HTTP-only, secure cookie .
  - Validate the token before processing requests in `commonext`.

---

###  *Expected Results *
>> AJAX requests will no longer fail due to incorrect REST-style URL
handling.
>>  Requests will be correctly routed via `commonext`, resolving the '405
error'.
>> Authentication is properly handled without exposing core framework
security.

This approach provides a 'scalable and maintainable solution' for handling
common OFBiz AJAX requests while ensuring security compliance.
with regards
Arifa Hashmi

On Fri, 2 May 2025 at 13:39, Nicolas Malin <nicolas.ma...@nereide.fr> wrote:

>   Hi all,
>
> I'm in front of a particular issue where the fix isn't really easy and
> need to share :) .
>
> I detected a problem with some ajax call did by js script that failed
> with error 405 like :
>
> https://demo-next.ofbiz.apache.org/webtools/control/entity/find/SetTimeZoneFromBrowser
>
> To reproduce just display the page
> https://demo-next.ofbiz.apache.org/webtools/control/entity/find/Party
> and analyze network traffic.
>
> Ok the reason :
>
> SetTimeZoneFromBrowser is a request define in common-controller.xml, so
> available on all component. In js the call is realize by :
> ```js
>              $.ajax({
>                  url: "SetTimeZoneFromBrowser",
>                  type: "POST",
>                  async: false,...
> ```
> So the navigator use the relative url to execute the call. In general
> case we have a page like
> https://demo-next.ofbiz.apache.org/$component/control/$request so js
> script realized their call with
> https://demo-next.ofbiz.apache.org/$component/control/$request-js . Like
> each request-js are present on common-controller.xml all component that
> include it can response.
>
> With rest url, the uri pattern is more complex and the script js that
> generate a relative call like we have upper :
>
> https://demo-next.ofbiz.apache.org/webtools/control/entity/find/SetTimeZoneFromBrowse
> .
> The ControlServlet behind failed to retrieve the correct request and
> generate a http error 405
>
>
> How to fix :
> After different tries, I propose to remove all relative call and create
> a dedicate webapp for that.
> ```js
>          $.ajax({
>                  url: "/common-js/control/SetTimeZoneFromBrowser",
>                  type: "POST",
>                  async: false,...
> ```
> Open a new webapp on commonext to do that and redirect all relative call
> to it.
> I propose to implement it on commonext because framework/common need to
> keep without exposure. Common-theme is dedicate expose theming
> information and not a direct relay to common request. So commonext seems
> to be the better solution to be a relay for common request manage by the
> common-controller.
>
> The problem with this solution, all webapp are their session separate,
> so access to a json request through commonext generate an security issue
> if the request have auth enable. We can enable the sso on ofbiz for that
> but do we need that for all OFBiz webapp by defaut. We can imagine a
> spotted solution to use cookies system like autologin with more
> security, only on commonext to be sure to allow the functionality on
> many configuration.
>
> Thanks to take this read time and if you have any sharing on it to found
> the better solution.
>
> Nicolas
>

Reply via email to