登陸之后跳回之前的頁面是在做登陸注冊模塊時遇到的一個需求,也是很有必要的。若用戶直接訪問登陸頁面,那可以控制它直接到首頁,但是要用戶沒有登陸直接訪問自己的購物車等需要經過身份認證的頁面,或者因為session超時,用戶需要重新登陸,那么這個時候跳回之前的頁面就是一件提升用戶體驗的事情了。實現這一功能,暫時想到兩種方法,一是用ajax的方式登陸,這樣直接在當前頁面彈窗讓用戶登錄既可,二是把用戶未登錄前的url存在session中,login成功之后先檢查session中是否存在這樣的一個url。
項目中集成了shiro,里面就有這么個功能,放在WebUtils工具類里面。
廢話了這么多,其實網上也有人寫過這么一篇關於這個功能實現的的博文,這個大神寫的shiro教程也是蠻值得一看的,只不過我在使用
SavedRequest savedRequest = WebUtils.getSavedRequest(request);的時候,savedRequest 對象一直為空,囧了一段時間,后面再群里遇到高人指點,發現是自己的配置文件沒寫好,即shiroFilter中的filterChainDefinitions,所需要攔截的url沒有寫完全,像下面這段配置
<!-- Shiro的Web過濾器 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <property name="loginUrl" value="/user-web/login" /> <property name="unauthorizedUrl" value="/unauthorized " /> <property name="filters"> <util:map> <entry key="authc"> <bean class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter" /> </entry> </util:map> </property> <property name="filterChainDefinitions"> <value> # 無需認證便可以訪問的的文件放在前面 /js/* = anon /css/* = anon /img/* = anon /images/* = anon /user-web/login = anon /logout = logout /user-web/* = authc /backend-web/* = authc </value> </property> </bean>
只有/user-web/* (除去login,這里url的匹配使用短路機制,即最先匹配原則)和/backend-web/ 后面的url,才會被允許存入到session中,這樣,當用戶沒有登陸就去訪問包含以上兩種鏈接前綴的時候,登陸成功后就會跳轉到之前的界面了。