springsecurity3 登录后在extjs中使用安全实体的信息,不同页面共享数据
2013-09-17 12:35
513 查看
以前使用springsecurity3的时候登录后都是用页面标签来显示当前的用户的username,<sec:authentication property='principal.username'/>,
查询当前user的信息时都是用username来做索引查找数据库数据,使用的相当别扭,因为一般都是使用id来做索引。还有个问题就是如何在不同jsp页面共享数据。
现在把两个问题并在一起解决。
1、先说不同页面之间如何共享数据。其实就是利用session,把需要共享的数据以键值对得方式set到session里面,别的页面要用的时候再根据键get出来,
取出来
2、springsecurity3的问题,先要继承一个SavedRequestAwareAuthenticationSuccessHandler类,也可以实现AuthenticationSuccessHandler接口,我是用前者。继承要重写一个onAuthenticationSuccess方法,登录成功后就会调用这个方法,然后你可以在这个方法里写你的业务,比如更新当前用户最后登录的时间、ip、登录次数。
同时,把成功登陆的安全实体的信息set到session里面,让jsp页面可以直接从session中get出来,这样就可以不用ss3的页面标签来显示username,还可以显示这个安全实体的其他属性。
说面一下,这个成功登陆的安全实体(user)是从数据中取出来的数据,且ss3把认证后的权限信息set给了这个user的authorities成员变量。
下面上代码
SavedRequestAwareAuthenticationSuccessHandler的继承类
jsp页面,也是extjs的入口文件,需要注意的是从session中get出来的数据复制给js变量一定要在引用extjs之前,extjs里面的js才可以使用这个变量,因为解析式从上到下。
extjs 里的js应用变量
显示效果:
查询当前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 + ' 的个人信息' }); } }
显示效果:
相关文章推荐
- 0907使用write函数向共享内存中写入数据,实现不同进程间的数据信息传递
- 使用servlet实现同一用户的不同页面共享数据
- 如何将不同信息的数据对象合并显示到同一个页面上或者滚动窗口中
- 使用AJAX方法可以不刷新页面就从服务器上获得信息(文件信息,方法,数据库中的数据)
- php 使用session保存页面登录信息
- 线程之间共享数据(两个线程之间使用同一份数据),线程锁要统一,不统一的话会出现线程安全问题
- 使用ng,多个tab页面展示不同uigrid,有的页面数据没有渲染出来 Promise.all([arr1,arr2,arr3...]) 和$scope.$apply
- 使用Selenium模拟浏览器登录,并获取页面信息
- 同一个用户在不同页面共享数据的常用方法
- 使用HttpClient登录知乎获取返回页面信息
- 使用EF保存数据时 提示: 其他信息: 对一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。
- 【2015/4/18】servlet学习笔记4--同一用户怎么共享不同页面的数据。
- JSP(3):servlet 用同一用户的不同页面共享数据(session)
- 使用Date日期对象来完成,在页面上根据不同时间显示不同的问候语,如:早上好,中午好,下午好,晚上好等信息
- 使用赛孚耐数据保护解决方案在整个生命周期内确保信息安全连载二:不断发展且日益增长的数据保护需求
- 不同应用共享数据——keychain的使用
- servlet第3讲(上集)----同一用户的不同页面共享数据
- 在OQL上使用UPDLOCK锁定查询结果,安全的更新实体数据
- (安卓APP)关于使用偏好设置储存数据,首次登录应用到新手指导页,再次登录直接到主页面简单的相关实现代码
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientSc