springsecurity3 登入後在extjs中使用安全實體的資訊,不同頁面共享資料

君墨痕發表於2013-09-17

以前使用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
														+ ' 的個人資訊'
											});
								}
							}

顯示效果:




相關文章