使用 spring security 确定 JSP 中的安全 url

Posted

技术标签:

【中文标题】使用 spring security 确定 JSP 中的安全 url【英文标题】:Determine secure url in JSP with spring security 【发布时间】: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'/>

【问题讨论】:

【参考方案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 或过滤器(如预处理功能)了解更简洁的方法。 我用我认为最好的方法更新了这个问题

以上是关于使用 spring security 确定 JSP 中的安全 url的主要内容,如果未能解决你的问题,请参考以下文章

使用spring 3 security在jsp页面中访问我的自定义用户对象

如何配置 Spring Security 以允许在 JSP 页面中使用 hasPermission?

如何使用 Spring MVC & Security、Jasig CAS 和 JSP 视图在 Spring Boot 2 中配置 UTF-8?

使用spring security在jsp中显示用户详细信息

Spring Security,JSP 标记库错误

Spring security的CSRF令牌-我可以使用纯HTML还是需要JSP?