【问题标题】:Determine secure url in JSP with spring security使用 spring security 确定 JSP 中的安全 url
【发布时间】:2011-04-12 03:21:17
【问题描述】:

像许多网站一样,我在我网站的每个网页上都有一个登录弹出窗口。这些页面中的大多数都是 http(非安全)。但是登录机制必须发布到一个安全的 url。这一切都很好。问题在于各种开发环境、暂存环境和不同生产环境中的安全 url 变化。

所以没什么大不了的,我只是为每个环境都有一个带有安全主机和端口的属性文件。现在有没有办法用正确的上下文和 jsession id(如果需要)和 c:url 通常做的其他事情来编码 url?

例如:

<form method="post" action="${rootHttpsUrl}/login">

我可能认为这可以修改 url 以添加正确的上下文、会话信息(如果需要)等:

<form method="post" action="<c:url value='${rootHttpsUrl}/login'/>">

但这不起作用,因为 c:url 看到 https://some-url.com 并认为这是一个外部链接。所以我可以自己修改网址:

<form method="post"
action="<%=response.encodeURL(${rootHttpsUrl}${pageContext.request.contextPath}/login)%>">

但是像这样转义到 java 代码不会让 java 看到 rootHttpsUrl jsp 变量(我如何将它暴露给 java?)。有没有办法从 JSP 中调用 encodeURL?

那么这里最好的解决方案是什么?我正在使用 Spring、Spring webmvc 和 Spring Security v3.0。理想情况下有类似的东西

<c:url value='/login' secure='true'/>

更新:我想出的最好办法是为每个环境都有一个属性文件,其中包含 https 主机和端口的属性。然后我将它添加到模型中并引用任何像这样的安全 URL:

https://${httpsHostAndPort}<c:url value='/login'/>

【问题讨论】:

    标签: spring jsp spring-mvc spring-security jstl


    【解决方案1】:

    在浏览了 2 个小时后,这个页面真的很有帮助。

    我的问题是在我的 Spring 安全 Web 应用程序中禁用 js 和 css 文件的缓存。 但同时在特定会话“内”缓存这些文件。

    为每个请求传递一个唯一的 ID 是建议的方法之一。

    这就是我所做的:- 而不是

    <script language="javascript" src="js/home.js"></script>
    

    我用过

    <script language="javascript" src="js/home.js?id=${pageContext.session.id}"></script>
    

    欢迎对上述方法提出任何缺点。 安全问题?

    【讨论】:

      【解决方案2】:

      自己硬编码。

      action="${rootHttpsUrl}/login;jsessionid=${pageContext.session.id}"
      

      【讨论】:

      • 是的,我们还需要上下文,但很容易添加。但是,除非必要(未启用 cookie),否则我不希望公开会话 ID。我想我至少在寻找一种仅在必要时添加会话 ID 的标准方法......
      • 您可以在每个 HttpServletRequest#isRequestedSessionIdFromURL() 下使用来确定客户端是否通过 URL 传递会话 ID(因此可能不支持 cookie)。
      • 这与 HttpServletRequest#encodeURL 的问题相同,它为我们完成了所有工作。如何在 JSP 页面中使用它?我可以做一个 ,但是我不能访问 JSP 变量......或者我可以吗?
      • 您可以使用pageContext.findAttribute("rootHttpsUrl")在scriptlet中获取${rootHttpsUrl}。我虽然不是scriptlet的粉丝,但我看不到其他方式。 Spring 家伙可能会借助 servlet 或过滤器(如预处理功能)了解更简洁的方法。
      • 我用我认为最好的方法更新了这个问题
      猜你喜欢
      • 2014-10-18
      • 2018-11-22
      • 2016-10-16
      • 2012-03-03
      • 2016-08-07
      • 2011-09-07
      • 2016-04-19
      • 2016-05-18
      • 2014-02-05
      相关资源
      最近更新 更多