Erreur si session expirée et uri_mappings utilisé

Request description

Bonjour,

On constate le comportement suivant avec une erreur à la fin quand on essaie d’accéder à une url utilisant l’URI_MAPPINGS et que notre session est expirée.

Steps to reproduce

Pour l’exemple je vais utiliser Firefox et Chrome mais le navigateur n’a pas d’importance.

Sur une instance Simplicité 6.3.5 avec le module de Démo.

  1. [Firefox] Se connecter avec un compte designer.
  2. [Firefox] Modifier le paramétrage du paramètre système URI_MAPPINGS pour mettre cette valeur dans valeur remplacée :
[
	{ "source": "^/news$", "destination": "/ui/ext/DemoNews" }
]

  1. [Firefox] Faire un clear cache rouge et se reconnecter avec le compte designer.
  2. [Firefox] Ouvrir la liste des sessions en cours.
  3. [Chrome] Se connecter avec l’utilisateur user_fra du module de Demo.
  4. [Chrome] Au niveau de l’url de la page, remplacer /ui par /news :

Pas d’erreurs, on obtient un résultat similaire au suivant :

  1. [Firefox] Pour simuler l’expiration de la session de user_fra, déconnecter la session dans session en cours :

  1. [Firefox] Actualiser la liste des sessions en cours jusqu’à ce que la session de user_fra disparaisse :

  1. [Chrome] Actualiser la page.

L’erreur suivante apparait :

Elle est également présente dans les logs serveur :

  1. [Chrome] Au niveau de l’url de la page, remplacer /news par /ui/ext/DemoNews pour contourner l’URI_MAPPINGS.

L’erreur n’apparait plus et on est redirigé vers la mire de connexion de Simplicité.

  1. [Chrome] Se reconnecter avec user_fra.

Pas d’erreurs, mais on arrive sur la page d’accueil et non le contenu de /ui/ext/DemoNews.

On a donc deux comportements étranges :

1er
Si URI_MAPPINGS utilisé et session expirée alors on a une erreur et l’utilisateur n’est pas invité à se reconnecter.

2nd
Une fois reconnecté Simplicité perd le contexte et on revient sur la page d’accueil au lieu d’arriver sur le contenu de la page demandée avant la reconnexion.

Technical information

Instance /health

[Platform]
Status=OK
Version=6.3.5
BuiltOn=2026-02-20 11:40
Git=6.3/76da9078f28d66b8cde26eb7f8bed398338adb46
Encoding=UTF-8
EndpointIP=
EndpointURL=http://5713a06299a3:8080
TimeZone=Europe/Paris
SystemDate=2026-03-11 15:16:52

[Application]
ApplicationVersion=1.0.0
ContextPath=
ContextURL=http://localhost:8083
ActiveSessions=1
TotalUsers=7
EnabledUsers=5
LastLoginDate=2026-03-11 14:32:24

[Server]
ServerInfo=Apache Tomcat/9.0.115
ServerType=WEB
ServerDevMode=true
ServerCompiler=true
ServerActiveSessions=2
ServerSessionTimeout=30
CronStarted=true

[OS]
Name=Linux
Architecture=amd64
Version=6.12.54-linuxkit
DockerImageName=almalinux9
SystemEncoding=UTF-8

[JavaVM]
Version=21.0.10
Vendor=Eclipse Adoptium
VMName=OpenJDK 64-Bit Server VM
VMVersion=21.0.10+7-LTS
ScriptEngine=rhino
ScriptEngineVersion=Rhino 1.7.13 2020 09 02
HeapFree=106407
HeapSize=222208
HeapMaxSize=503808
TotalFreeSize=388007

[Cache]
ObjectCache=116
ObjectCacheMax=10000
ObjectCacheRatio=1
ProcessCache=2
ProcessCacheMax=10000
ProcessCacheRatio=0
APIGrantCache=0
APIGrantCacheMax=1000
APIGrantRatio=0

[Database]
Vendor=3
VendorName=postgresql
ProductName=PostgreSQL
ProductVersion=15.12 (Debian 15.12-1.pgdg120+1)
DriverName=PostgreSQL JDBC Driver
DriverVersion=42.7.10
DBDate=2026-03-11 15:16:52
DBDateOffset=0
DBPatchLevel=6;P03;51af22b13838925e31430a969bd336ba;5
UsingBLOBs=true

[Healthcheck]
Date=2026-03-11 15:16:53
ElapsedTime=698

OK on va regarder mais la vocation historique de l’ URI_MAPPING est de mapper des choses plutôt en zone publique (y compris en zone API) = à des endroits où il n’y a pas de notion de session

Pour ce qui est de rerouter en zone UI authentifiée il vaut mieux utiliser les permalinks

Pour le contexte, à certains moment quand l’utilisateur souhaite consulter un document on doit rediriger celui-ci vers la visionneuse de ce doc présent en GED (le doc n’est pas stocké dans Simplicité).

On a donc fait un objet externe (API REST privée) avec le code Java suivant (simplifié au niveau de la construction de l’url externe) :

package com.simplicite.extobjects.Demo;

import com.simplicite.util.AppLog;
import com.simplicite.util.exceptions.HTTPException;
import com.simplicite.util.tools.Parameters;
import com.simplicite.webapp.tools.ServletTool;

/**
 * Handles the redirection from the /viewer URL
 */
public class ViewerRedirect extends com.simplicite.webapp.services.RESTServiceExternalObject {
    private static final long serialVersionUID = 1L;

    @Override
    public Object get(Parameters params) throws HTTPException {
    	 try {
            String docId = params.getParameter("doc-id");
            sendHttpRedirect(params, getExternalViewerUrl(docId));
            setHTTPStatus(ServletTool.HTTP_STATUS_MOVED_PERMANENTLY);
            
            return ServletTool.HTTP_STATUS_MOVED_PERMANENTLY;
        }
        catch (Exception e) {
        	AppLog.error("An http error occurred during the redirection process to the GED", e, getGrant());
            throw e;
        } 
        
        return super.get(params);
    }

    private String getExternalViewerUrl(String docId) {
        return "https://external.app.fr/"+docId;
    }
}

On a mis en place cet objet externe pour les raisons suivantes :

  • Servir d’intermédiaire entre Simplicité et la page externe. Au niveau de notre code dans Simplicité on manipule uniquement des url internes qu’on maitrise et pour aller à l’extérieur on passe par cet objet externe qui va chercher/construire la bonne url externe.

  • L’url vers la page externe peut changer, on ne peut donc pas la stocker. Il faut appeler une api tierce qui va nous fournir l’url vers la page qu’on souhaite consulter.

  • Au début dans le postSearch de l’objet métier qui avait besoin de cette url externe on faisait l’appel à l’api tierce pour récupérer l’url sans utiliser cet objet externe mais au final sur l’affichage en liste ça faisait trop de requêtes en peu de temps et à la fin on atteignait les quota fixé par jour rapidement. Avec l’objet externe en intermédiaire on fait l’appel à l’api tierce uniquement quand l’utilisateur à vraiment besoin de celle-ci pour consulter la page externe.

Je viens d’essayer avec le deeplink mais je suis pas sûr que ça va fonctionner dans notre cas.
Avec le format /ui/l/deeplink?doc-id=5639DBFC je repasse par l’UI Simplicité et j’ai cette erreur :

Avec l’url au format /ui/ext/MonObjetExterne?doc-id=5639DBFC on est bien redirigé directement vers la page externe sans repasser par l’UI Simplicité.

Au niveau du code Java de mon objet externe est-ce que je peux faire quelque chose pour avoir le même comportement avec l’url deeplink ?

Je parle des permalinks pas des deeplinks

ex sur la démo sur supplier:

L’URL /ui/l/suppliers-bim (qu’on obtient via le Copy link) accédée sans être connectée passe par la phase d’authent puis arrive bien sur le formulaire du supplier BIM

Désolé, j’ai mis deeplink mais je parlais bien du permalink.

Est-ce qu’on peut faire une redirection vers une page externe avec le permalink (retourner un http 301 avec l’url vers laquelle on souhaite rediriger sans repasser par l’UI Simplicité) ?

J’ai refait le test avec le module de Démo et avec le paramétrage et le code suivant :

package com.simplicite.extobjects.Demo;

import com.simplicite.util.AppLog;
import com.simplicite.util.exceptions.HTTPException;
import com.simplicite.util.tools.Parameters;
import com.simplicite.webapp.tools.ServletTool;

/**
 * REST service external object DemoViewer
 */
public class DemoViewer extends com.simplicite.webapp.services.RESTServiceExternalObject {
    private static final long serialVersionUID = 1L;

    @Override
    public Object get(Parameters params) throws HTTPException {
    	try {
            String docId = params.getParameter("doc-id");
            sendHttpRedirect(params, getRedirectUrl(docId));
            setHTTPStatus(ServletTool.HTTP_STATUS_MOVED_PERMANENTLY);
            
            return ServletTool.HTTP_STATUS_MOVED_PERMANENTLY;
        }
        catch (Exception e) {
            AppLog.error("An error occurred during the redirection process to the GED", e, getGrant());
        }
        
        return super.get(params);
    }
    
    private String getRedirectUrl(String docId) {
    	return String.format("https://www.google.com/search?q=%s", docId);
    }
}

Quand j’utilise l’url suivante avec permalink : http://localhost:8083/ui/l/viewer?doc-id=test

Je repasser par l’UI Simplicité et j’arrive sur une page vide :

Et j’ai cette erreur :

Avec http://localhost:8083/ui/ext/DemoViewer?doc-id=test pas de problème je suis redirigé vers la page externe sans repasser par l’UI Simplicité. C’est ce comportement que j’essaie de reproduire avec le permalink.