2010-09-14 63 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> 

的任何缺點,上述方法是受歡迎的。 安全問題?