springsecurity3 登入後在extjs中使用安全實體的資訊,不同頁面共享資料
以前使用springsecurity3的時候登入後都是用頁面標籤來顯示當前的使用者的username,<sec:authentication property='principal.username'/>,
查詢當前user的資訊時都是用username來做索引查詢資料庫資料,使用的相當彆扭,因為一般都是使用id來做索引。還有個問題就是如何在不同jsp頁面共享資料。
現在把兩個問題並在一起解決。
1、先說不同頁面之間如何共享資料。其實就是利用session,把需要共享的資料以鍵值對得方式set到session裡面,別的頁面要用的時候再根據鍵get出來,
request.getSession().setAttribute("currentUserId", user.getId());
request.getSession().setAttribute("currentUserName", user.getName());
取出來
Integer temp= (Integer)request.getSession().getAttribute("currentUserId");
String temp2= (String)request.getSession().getAttribute("currentUserName");
2、springsecurity3的問題,先要繼承一個SavedRequestAwareAuthenticationSuccessHandler類,也可以實現AuthenticationSuccessHandler介面,我是用前者。繼承要重寫一個onAuthenticationSuccess方法,登入成功後就會呼叫這個方法,然後你可以在這個方法裡寫你的業務,比如更新當前使用者最後登入的時間、ip、登入次數。
同時,把成功登陸的安全實體的資訊set到session裡面,讓jsp頁面可以直接從session中get出來,這樣就可以不用ss3的頁面標籤來顯示username,還可以顯示這個安全實體的其他屬性。
說面一下,這個成功登陸的安全實體(user)是從資料中取出來的資料,且ss3把認證後的許可權資訊set給了這個user的authorities成員變數。
下面上程式碼
SavedRequestAwareAuthenticationSuccessHandler的繼承類
/**
* @Description : 描述
* @author YangXuan
* @email 364105996@qq.com
* @date Aug 18, 2013 11:21:19 PM
*/
public class AuthenticationSuccessHandler extends
SavedRequestAwareAuthenticationSuccessHandler {
protected final Log logger = LogFactory.getLog(this.getClass());
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
@SuppressWarnings("unused")
private RequestCache requestCache = new HttpSessionRequestCache();
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws ServletException, IOException {
System.out
.println("---------------login successfully , you can extends this class to achive what you want !");
User user = (User) new SecurityUtilImpl().getUserDetails();
User temp = this.updateUser(user, request);
this.userService.modify(temp);
response.setContentType("text/javascript");
response.getWriter().print(user.getPassword());
request.getSession().setAttribute("currentUserId", user.getId());
request.getSession().setAttribute("currentUserName", user.getName());
super.onAuthenticationSuccess(request, response, authentication);
}
public User updateUser(User user, HttpServletRequest request) {
String lastIp = new CommonUtilImpl().getClientIP(request);
int count = user.getLoginCount() + 1;
user.setLoginCount(count);
user.setLastLoginIp("aaa");
user.setLastLoginIp(lastIp);
user.setLastLoginTime(new Date());
return user;
}
}
jsp頁面,也是extjs的入口檔案,需要注意的是從session中get出來的資料複製給js變數一定要在引用extjs之前,extjs裡面的js才可以使用這個變數,因為解析式從上到下。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="sec"
uri="http://www.springframework.org/security/tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
Integer temp= (Integer)request.getSession().getAttribute("currentUserId");
String temp2= (String)request.getSession().getAttribute("currentUserName");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<script type="text/javascript">
var basePath='<%=basePath%>';
var adminFolder = basePath + 'admin/';
var imagePath = basePath + 'extjs/images/';
var currentUser = "<sec:authentication property='principal.username'/>";
var currentUserId='<%=temp%>';
var currentUserName='<%=temp2%>';
</script>
<link rel="stylesheet" type="text/css"
href="<%=basePath%>/extjs/resources/css/ext-all.css">
<script type="text/javascript"
src="<%=basePath%>/extjs/ext-all-debug.js"></script>
<script type="text/javascript"
src="<%=basePath%>/extjs/ext-lang-zh_CN.js"></script>
<!-- app應用的入口 -->
<script type="text/javascript" src="<%=basePath%>admin/app.js"></script>
</head>
<body>
</body>
</html>
extjs 裡的js應用變數
items : [{
xtype : 'toolbar',
items : [{
id : 'currentUser',
scale : 'medium',
text : '當前使用者 : ' + currentUserName,
icon : imagePath + 'user.png',
menu : [{
xtype : 'button',
text : '個人資訊',
scale : 'medium',
icon : imagePath + 'user.png',
handler : function() {
Ext.create('yang.view.sysManage.SelfInfo',
{
title : ' ' + currentUserName
+ ' 的個人資訊'
});
}
}
顯示效果:
相關文章
- vue2專案中調取登入介面登入以後獲取個人資訊以後,儲存在哪裡,怎麼在不同的頁面展示想要的資訊?Vue
- 登入頁面(動態地與資料庫匹配使用者資訊)資料庫
- 關於mpvue中同路由不同頁面共享資料的解決方案Vue路由
- 簡單的使用者登入頁面與後臺資料庫的互動資料庫
- asp.net 在使用母版頁的子頁面cs後臺程式碼中控制母版頁中的登入控制元件顯示ASP.NET控制元件
- 在session過期後如何跳轉到登入頁面Session
- 登入頁面使用ReactiveCocoaReact
- WebForm登入頁面(連線資料庫)WebORM資料庫
- 在 ASP.NET 中實現不同角色的使用者使用不同登入介面的方法ASP.NET
- Flutter 入門與實戰(二十七):使用 GetIt 同步不同頁面間資料Flutter
- 【Android】在Activity頁面中如何實現Fragment資料的緩載入AndroidFragment
- 實現不同頁面不同頁首
- struts2實現登入後跳轉回本頁面
- 在登入資料庫的使用!sql資料庫SQL
- 前後端分離,html頁面中怎麼獲取當前登入使用者資訊,並寫入html頁面的指定位置?後端HTML
- ubuntu16.04登入後黑屏再次回到登入頁面Ubuntu
- 直播原始碼網站,新使用者登入時的註冊頁面和登入頁面原始碼網站
- 使用Vue寫一個登入頁面Vue
- Web頁面中的“門”—Web端登入頁的設計Web
- 簡單的網頁登入頁面網頁
- jwt登入後重新整理頁面 使用者資訊為什麼也會重新整理JWT
- PbootCMS登入後頁面載入緩慢怎麼辦boot
- 資訊系統在共享和安全中發展
- Laravel 自定義登入註冊頁面並使用 Ajax 進行資料傳輸Laravel
- Vue學習:實現使用者沒有登陸時,訪問後自動跳轉登入頁面Vue
- javaWeb登入註冊頁面JavaWeb
- jquery登入頁面效果圖jQuery
- Vue(二)使用Element-ui元件庫渲染後臺系統登入頁面VueUI元件
- 在不同的資料庫中解析SQLServer資料資料庫SQLServer
- 使用 jQuery Ajax 在頁面滾動時從伺服器載入資料jQuery伺服器
- windows10系統更新補丁後卡死在登入頁面怎麼解決Windows
- ExtJs頁面佈局詳解JS
- 「手把手」利用websocket實現手機掃碼登陸後,同步登陸資訊到web端頁面Web
- app直播原始碼,平臺登入頁面實現和修改密碼頁面實現APP原始碼密碼
- Select Top在不同資料庫中的使用用法資料庫
- PbootCMS網站後臺登入頁面樣式怎麼修改boot網站
- 自定義登入和登出頁面
- Vue-router實現單頁面應用在沒有登入情況下,自動跳轉到登入頁面Vue