2010-09-14 64 views
0

与许多网站一样,我的网站每个网页都有一个登录弹出窗口。大多数这些页面都是http(不安全)。但登录机制必须发布到一个安全的网址。所有这些都很好。问题在于各种开发环境,分期和不同生产环境中的安全url更改。使用spring安全确定JSP中的安全url

因此,没有太大的协议,我只需要为安全主机和端口的每个环境提供一个属性文件。现在有没有一种方法来编码URL的正确的上下文和jsession id(如果需要)和其他事情c:url通常会做?

例如:

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

我可能会想如果需要的话,等这将致力于修改URL添加正确的背景下,会议信息:

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

但不工作因为c:url看到https://some-url.com并认为它是外部链接。所以,我可以只修改URL自己:(?我怎么揭露这JAVA)

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

但逃到Java代码一样,不会让Java的看到rootHttpsUrl JSP变量。有没有办法从JSP内调用encodeURL?

那么这里最好的解决方案是什么?我使用Spring,Spring webmvc和Spring Security v3.0。理想的情况是有一些像

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

更新:我想出的最好是有一个属性文件与https的主机和端口属性每个环境。然后,我添加到模型中,并引用任何安全网址是这样的:

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

回答

0

硬编码它自己。

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

是的,我们也需要上下文,但很容易添加。但是,除非必要,我不希望会话ID暴露(cookie未启用)。我想我至少在寻找一种标准的方式来添加会话ID只在必要时... – 2010-09-14 17:51:11

+0

你可以在每个['HttpServletRequest#isRequestedSessionIdFromURL()'](http://download.oracle.com/javaee/5/API /的javax/servlet的/ HTTP/HttpServletRequest的。html#isRequestedSessionIdFromURL%28%29)来确定客户端是否通过URL传递会话ID(因此可能不支持cookie)。 – BalusC 2010-09-14 17:57:52

+0

这就是HttpServletRequest#encodeURL的问题,它为我们完成所有工作。我如何在JSP页面中使用它?我可以做一个<%= %>,但是我不能访问JSP变量......或者我可以吗? – 2010-09-14 18:01:39

0

经过2个小时的浏览各种替代方案,这个页面真的很有帮助。

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

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

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

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

我用

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

的任何缺点,上述方法是受欢迎的。 安全问题?