1. 程式人生 > >Apache Shiro會話超時,登入頁面跳轉到父窗體的解決方法

Apache Shiro會話超時,登入頁面跳轉到父窗體的解決方法

問題1:

在使用Apache Shiro框架做許可權驗證時,因為我的頁面是使用iframe做了一個上左右的分層,上面上log,左側是選單,具體的內容則顯示在右側。

當我點選某選單,此時如果會話超時了,則登入頁面只會顯示到右側區域,看起來不是很友好,所以需要登入頁面顯示到整個瀏覽器。

解決方法:

在登入頁面做一個跳轉,當登入頁面不是在頂層顯示,則跳轉:

window.onload = function () {
	    if (window.parent.window != window) {
	        window.top.location = "/login-main.action";
	    }
	}

問題2:

因為Shiro會記錄上一次造成會話超時的頁面,登入成功後,會直接跳轉到這個頁面,而我這裡是層級顯示,所以,如果使用Shiro的跳轉,則跳轉的頁面,將沒有log和選單欄了

解決方法:

1、重寫登入的過濾器,將Shiro記錄的頁面清除並儲存到自己定義的session中,完成跳轉。

2、在首頁,將自定義儲存的請求取出跳轉。

過濾器:

package cn.zfcr.shiro.filter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.util.SavedRequest;
import org.apache.shiro.web.util.WebUtils;
import org.springframework.stereotype.Service;

/** 
    檔名:FormAuthenticationFilter.java
    類說明:  Shiro 表單驗證過濾器擴充套件 寫入登入驗證失敗的錯誤提示
    作者:章鋒
    郵箱: 
[email protected]
日期:2017年6月22日 下午2:29:54 描述:例:章鋒-認證 版本:1.0 */ @Service public class FormAuthenticationFilter extends org.apache.shiro.web.filter.authc.FormAuthenticationFilter { public static final String DEFAULT_MESSAGE_PARAM = "message"; /** 自定義儲存到session中的請求資料的key 用於頁面跳轉 */ public static final String CUSTOM_SAVED_REQUEST = "customSavedRequest"; private String messageParam = DEFAULT_MESSAGE_PARAM; @Override protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception { SavedRequest savedRequest = WebUtils.getAndClearSavedRequest(request); Session session = subject.getSession(); session.setAttribute(CUSTOM_SAVED_REQUEST, savedRequest); return super.onLoginSuccess(token, subject, request, response); } /** * 登入失敗呼叫事件 */ @Override protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) { String className = e.getClass().getName(), message = ""; if (IncorrectCredentialsException.class.getName().equals(className) || UnknownAccountException.class.getName().equals(className)){ message = "使用者名稱或密碼錯誤, 請重試."; } else if (e.getMessage() != null && StringUtils.startsWith(e.getMessage(), "msg:")){ message = StringUtils.replace(e.getMessage(), "msg:", ""); } else{ message = "系統異常,請稍後再試!"; e.printStackTrace(); } request.setAttribute(getFailureKeyAttribute(), className); request.setAttribute(getMessageParam(), message); return true; } public String getMessageParam() { return messageParam; } }

首頁跳轉程式碼:
<s:if test="#session.customSavedRequest != null">
    <script type="text/javascript">
        var url = '${session.customSavedRequest.requestURI}?${session.customSavedRequest.queryString}';
        $("#mainFrame").attr("src", url);
    </script>
</s:if>

ok。

相關推薦

Apache Shiro會話超時登入頁面窗體解決方法

問題1: 在使用Apache Shiro框架做許可權驗證時,因為我的頁面是使用iframe做了一個上左右的分層,上面上log,左側是選單,具體的內容則顯示在右側。 當我點選某選單,此時如果會話超時了,則登入頁面只會顯示到右側區域,看起來不是很友好,所以需要登入頁面顯示到整個

Jmeter 對於從A登入頁輸入使用者名稱密碼驗證碼登入到C頁面中間經過一個B頁面該如何測試

1,右擊測試計劃,點新增---Threads---執行緒組 2,右擊執行緒組,新增---配置元件---http請求預設值(新增http請求預設值是為了方便每次新增http請求不用在輸入協議、伺服器名稱或IP、埠號) 具體配置如下 3,右擊執行緒組,新增---

form表單可以提交阻止頁面

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body&g

(javaweb)jsp登入頁面後出錯:The requested resource is not available.

想做一個簡單的登入系統,實現“輸入正確的賬號密碼後會進入首頁,錯誤則顯示警告“的功能。不過在測試時,儘管能進入登入介面,並且輸入了正確的賬號和密碼,但是點選登入時,網頁提示錯誤了,如圖 網上提供的解決方法有許多,最多還是說Tomcat的web.xml檔案配置錯

Spring Security4.1.3實現攔截登入後向登入頁面方式(redirect或forward)返回被攔截介面

一、看下內部原理 簡化後的認證過程分為7步: 使用者訪問網站,打開了一個連結(origin url)。 請求傳送給伺服器,伺服器判斷使用者請求了受保護的資源。 由於使用者沒有登入,伺服器重定向到登入頁面 填寫表單,點選登入 瀏覽器將使用者名稱密碼以表單形式傳送給伺

Markdown基礎(內含:錨點使用使用HTML頁面目錄生成)

Github樣式顯示參考:點我 之前說過用word寫文章,這次說說Markdown寫文章(推薦) 逆天推薦使用VSCode編寫 裝這個外掛寫作更方便: 內含:錨點使用,使用HTML,新頁面跳轉,目錄生成 啟用方式: H1~H3(#的個數)[部落格園只支援H1~3] # H1 ## H2 ### H3

Swift 登入頁面,條件判斷 ,頁面

原:http://www.woowen.com/swift/2014/10/04/swift%20條件判斷頁面跳轉/ 在swift中作跳轉是一件很簡單得事情,可是如果右鍵某個空間拖動然後選擇modal來關聯跳轉關係的話該如何做出程式碼判斷呢? 場景:如果我想做一個登

Spring: Controller的登入頁面

登入頁面和登入按鈕不能同時呼叫同一個方法,需要做跳轉,否則一上來就會呼叫MD5密碼驗證,導致異常org.springframework.web.util.NestedServletException @RequestMapping("/login") publ

struts入門實現頁面

struts的配置,相當簡單,我採用的是maven將struts依賴的包匯入到專案中。 第一步: ·在Eclipse下安裝MAVEN,具體教程就不詳細說了,百度安裝MAVEN。 ·然後新建maven專案 完成後,就有一個新的專案空間在左邊Package Explore

Android 如何保證App切換到後臺頁面重新開啟APP、或返回之前頁面維持其狀態不變

專案中遇到的一些小問題,記錄、分享一下。 Android 如何保證App切換到後臺,或頁面跳轉後,重新開啟APP、或返回之前頁面時,維持其頁面狀態不變? 1、問:當APP啟動後,開啟某一介面,然後點選手機HOME鍵,使應用程式退到後臺;當再次開啟App時,如何保證

生產環境vue頁面的時候js報404的問題

location ams ring webpack 懶加載 vue ati 錯誤 load() 最近上線的一個vue項目,需要各種路由跳轉,在開發和測試環境都沒問題,但是在生產環境,發現後期更新代碼的時候,有些機型(ios機型,暫未發現android有問題)跳轉路由的時候,

HTML頁面的5種方法

text div oca 詳細 頁面跳轉 com -- redirect 自動 下面列了五個例子來詳細說明,這幾個例子的主要功能是:在5秒後,自動跳轉到同目錄下的hello.html(根據自己需要自行修改)文件。1) html的實現 ?123456<head>&

Vue + ElementUi 頁面傳值的方法

element info vue 跳轉 body 9.png 分享圖片 nbsp .com       跳轉的頁面(接收):                跳轉的頁面(接收):    Vue + ElementUi 頁面跳轉傳值的方法

小程序丨頁面的四種方法

ace on() 程序 nta comment 點擊 toolbar n) itl wx.navigateTo({}) ,保留當前頁面,跳轉到應用內的某個頁面,使用 wx.navigateBack 可以返回;   示例: 1 wx.navigateTo({ 2

js 控制頁面的5種方法

js 控制頁面跳轉的5種方法 程式設計式導航:   點選跳轉路由,稱程式設計式導航,用js編寫程式碼跳轉。   History是bom中的 History.back是回退一頁 Histiory.go(1)前進一頁 History.go(-1)後退一頁 HandleCli

JS頁面的幾種方法以及註解

來介紹一下我所用的JS跳轉頁面的方法 第一種:這是最常用的了 window.location.href <script language="javascript" type="text/javascript"> window.location.href="l

jsp下頁面的幾種方法小結

1. RequestDispatcher.forward()   在伺服器端起作用,當使用forward()時,Servlet engine傳遞HTTP請求從當前的Servlet或者是JSP到另外的一個Servlet、JSP 或普通HTML檔案,也即你的form提交至a.js

ThinkPHP頁面success與error方法

首先是控制器中,可以使用下程式碼: config配置如下: 'TMPL_ACTION_ERROR' => 'Public:error', // 預設錯誤跳轉對應的模板檔案 'TMPL_ACTION_SUCCESS' => 'Public:success' , // 預設成功跳轉對應的模板檔案suc

小程式頁面的四種方法

小程式頁面跳轉的四種方法 1、wx.navigateTo({}) ,保留當前頁面,跳轉到應用內的某個頁面(下面是跳轉到test頁面的程式碼),然後從test頁面返回上一頁的時候使用 wx.navigateBack 返回; wx.navigateTo({ //

前端頁面的幾種方法

onclick跳轉 設定window的location.href屬性 onclick="window.location.href='URL'" onclick="location='URL'" 呼叫window的open方法 onclick