【问题标题】:Web Application with different URLs for different Users为不同用户提供不同 URL 的 Web 应用程序
【发布时间】:2013-08-01 12:54:25
【问题描述】:

我想创建一个具有以下功能的 Struts2 Web 应用程序:

  • 如果用户 A 正在登录,那么他可以像这样访问应用程序

    http://product.com/a/login.jsp
    
  • 如果用户B正在登录,那么

    http://product.com/b/login.jsp
    

等等。

我怎样才能做到这一点?

这样做好不好?或者我可以使用子域吗?

【问题讨论】:

  • 如果 A 是购买的应用程序,那么他可以访问类似product.com/a/login.jsp 的应用程序:EEH ?
  • 它就像 Gmail。如果您有 gmail 登录名,则可以使用 yourloginname@gmail.com 登录。如果你有你的公司..那么你也可以用它登录..就像 username@company.com 两次登录后检查 url。 url会不同,数据会不同,但布局和外观是一样的!
  • 那么A和B都是用户,你的句子是“如果A已经购买了应用……?”
  • 是的错误被改变了!你能回答我的问题吗?
  • @JayPatel 所有 URL 都通过配置进行映射,无论您使用 xml 还是基于注释的配置,它都能胜任。通配符可以用于泛化这些映射,它以任何方式指向一个类,该类的实例由容器管理,并且调用应用于拦截器堆栈,但即使您提供有效配置,实例如何知道哪个用户它应该映射到?

标签: java jakarta-ee login struts2 restful-url


【解决方案1】:

我很确定它不会那样工作:在 GMail 中(你以你为例)每个用户在登录后总是会被重定向到同一个位置:

https://mail.google.com/mail/

如果您启用 Google 多重登录,它们将分别存储不同的登录凭据服务器端,并将使用不同的 cookie 客户端,具有相同的名称但不同的路径:

第一个帐户登录的 Cookie:

Name    : S 
Content : gmail=someRandomHash
Server  : mail.google.com
Path    : /mail/u/0

用于第二个帐户登录的 Cookie:

Name    : S 
Content : gmail=someRandomHash
Server  : mail.google.com
Path    : /mail/u/1

然后,当从一个帐户切换到另一个帐户时,他们会将您重定向到另一个 URL:

第一个帐户邮箱 URL

https://mail.google.com/mail/u/0/

第二个帐号邮箱地址

https://mail.google.com/mail/u/1/

在两者都通过身份验证后,您可以通过访问相对 URL 手动在不同邮箱之间切换(如果您有多个帐户,请尝试)。

结论:Google 使用不同的 Rest URL(带有一个命名变量,在本例中为 u:用户)来区分多个帐户...对于同一台 PC。 附加值是您可以在多个帐户之间切换,而无需每次都退出第一个帐户并登录到第二个帐户。

这与分离 URL 以处理不同计算机上的不同帐户无关。

【讨论】:

  • 其实我申请一个州的医院。在这个州有很多医院。所以在登录时我需要提供医院组合。医生会选择医院然后登录。但我不赢'不要在登录页面提供医院的名单。这就是为什么我想这样做!我对这种情况了解不多。那么,我该怎么办?是子域还是 URL?
  • 您应该(在您的数据库中)维护一个元组列表 {ID_AUTH,ID_HOSPITAL} ,并在入口点页面中检查它,以解码您需要为每个登录用户加载哪个医院。 ID_AUTH 是对包含每个用户的登录信息的行的引用(例如 ID_AUTH、USERNAME、ONE-WAY-HASHED-PASSWORD),而 ID_HOSPITAL 是医院行的 ID,您应该在后端拥有它。此类信息应由另一个后台 Web 应用程序或 Web 应用程序的另一个“管理”部分维护,或通过手动将它们放入数据库中。
  • 不客气。最后一点,您所描述的 REST 行为(在 URL 中使用用户名)更像 StackOverflow,但是当您应该能够看到其他用户时,这很有用,无论您是否已登录或者它是您的页;在您的情况下,只需通过在第一个操作中匹配您的详细信息将它们放入会话中,然后在所有其他操作上使用自定义拦截器(检查用户信息是否在会话中)......如果没有,则重定向到第一个。 Like described here,用 obj 而不是 bool
【解决方案2】:

您必须实施过滤器,然后检查请求并重定向到正确的视图。

不要使用根据https://issues.apache.org/jira/browse/WW-3742 弃用的:

    FilterDispatcher(Deprecated)

我建议:

    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 

首先,正如我所说,您将需要请求:

  HttpServletRequest request = ServletActionContext.getRequest();

然后找到这样的请求URL:

  String spath = request.getServletPath();

现在你解析你的 URL,然后转发到正确的视图(页面:jsp,html...)

【讨论】:

  • 我需要为每个调用的操作检查这个吗?实际上,我的布局和视图页面对所有人来说都是一样的。我正在创建一个有 1000 个客户端的网络产品。所以问?对不起,如果这是一个愚蠢的问题,但我很困惑!。
猜你喜欢
  • 2011-09-26
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 2021-03-03
  • 2011-03-25
  • 2019-04-05
  • 1970-01-01
  • 2014-02-19
相关资源
最近更新 更多