我正在使用Spring Security 3.1.x並已實施方法註釋證券。正如我所希望的那樣,當我在登錄時執行特定操作並且沒有權限時,我的控制檯中會有403個訪問被拒絕!完善!春季訪問拒絕處理程序可以引用彈出?
現在我想抓住這個403,並給用戶一個自定義消息彈出。我不想將用戶重定向到一個頁面,說他們沒有權利。
是否有任何方式春的訪問拒絕處理程序可以照顧彈出?或者它只能重定向到另一個頁面?也許還有其他選擇嗎?
提前致謝!
我正在使用Spring Security 3.1.x並已實施方法註釋證券。正如我所希望的那樣,當我在登錄時執行特定操作並且沒有權限時,我的控制檯中會有403個訪問被拒絕!完善!春季訪問拒絕處理程序可以引用彈出?
現在我想抓住這個403,並給用戶一個自定義消息彈出。我不想將用戶重定向到一個頁面,說他們沒有權利。
是否有任何方式春的訪問拒絕處理程序可以照顧彈出?或者它只能重定向到另一個頁面?也許還有其他選擇嗎?
提前致謝!
開箱即用Spring Security只會發送403作爲錯誤。大多數容器將爲403狀態提供默認錯誤頁面並呈現HTML頁面。在這種情況下沒有重定向,它是前鋒。
聽起來好像您正在使用JavaScript,如果可以,您可以檢測HTTP狀態是否爲403,然後顯示您的自定義消息。如果你使用JQuery它會是這個樣子
$(document).ajaxError(function(event, jqxhr, settings, exception) {
if (jqxhr.status == 403) {
// output custom error
} else {
// ...other errors...
}
});
你可以做任何你在自定義AccessDeniedHandler想,只要它提供了完整的響應。實際上,您可以指定一個錯誤頁面轉發到另一個URL,以便您可以使用Spring MVC(或其他類型的控制器)處理URL。如果您使用的是XML名稱空間,則可以使用類似這樣的方法完成:
<http>
<!-- ... -->
<access-denied-handler error-page="/403" />
</http>
然後,您可以隨意處理/ 403 URL。例如,如果你想設置的狀態,並提供一個錯誤信息,你可以創建一個Spring MVC控制器,它確實是這樣的:
@Controller
public class ErrorsController {
@RequestMapping("/403")
public void forbidden(HttpServletRequest request, HttpServletResponse response) {
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.getWritter().write("You do not have permission to perform this operation");
}
}
你的JavaScript可以再搭上403,然後用響應的正文顯示消息。當然,如果你也想,也可以將響應格式化爲JSON。
通常錯誤頁面是由應用服務器生成的。 在您的web.xml中,您可以爲不同的錯誤代碼定義自定義錯誤頁面。 然後,您的Web應用程序服務器將顯示自定義錯誤頁面,而不是原來的頁面。
粘貼這在web.xml文件
<error-page>
<error-code>403</error-code>
<location>/youraccessdeniedpage.jsp</location>
</error-page>
此外,添加攔截的URL標記你的春季安全性,使得任何人都可以看到錯誤頁面
<security:intercept-url pattern="/youraccessdeniedpage.jsp" access="permitAll"/>
在自定義錯誤頁你可以顯示任何你想要的東西,包括彈出窗口等等。
感謝您的幫助,雖然它仍然會將我重定向到另一個頁面(youraccessdeniedpage.jsp)。我通過拋出一個403 HTTP狀態並使用JavaScript來修復它:) –
要執行拒絕訪問的邏輯,您可以實現AccessDeniedHandler。這不完全是你想要的。它具有HttpServletResponse對象的句柄方法。所以你可以寫任何你想要的信息或重定向到另一頁。但主要的問題是你必須執行一個http請求並加載另一個頁面。這是Spring Security的工作方式。 但是,如果你真的想這樣做,你可以嘗試執行一個ajax請求,並檢查它是否返回403頁。
是的,這非常好,非常感謝!我現在這樣做了!對不起,我無法爲所給出的答案投票正確答案!非常感謝幫助! :) –
不用客氣 – mvb13
這正是我需要的。非常感謝。 accesDeniedHandler實現確實是一項非常棒的工作。我實際上讓accessDeniedHandler引發了403 HTTP狀態。 就像你說的,我用javascript抓住了它,並從那裏彈出一個更容易!非常感謝:D –