使用SpringSecurity进行操作 产生一个上下文栈 SecurityContext ----》自动存储到session域中 通过SecurityContext l可以获得认证对象 Authentication --->封装principal(主角)属性 principal就是当前用户对象User ----->包含用户相关信息:SecurityContext-----》 Authentication---》User----->username
一、编写显示用户登录用户名的controller控制器(两种方法)
(1)第一种较麻烦
(2)第二种较简洁
//显示用户名
@Controller
public class ShowUserNameController {
@RequestMapping("/showUserName")
public void showUserName(HttpServletRequest request){
//(1)第一种
//获得session对象
HttpSession session = request.getSession();
//session域中获得登录信息,从而获得酥油的属性名
Enumeration attributeNames = session.getAttributeNames();
while (attributeNames.hasMoreElements()){
//打印获得储存用户登录的session名称SPRING_SECURITY_CONTEXT
System.out.println(attributeNames.nextElement());
}
//SPRING_SECURITY_CONTEXT就是存储用户登录信息的seesion 名称
Object spring_security_context = session.getAttribute("SPRING_SECURITY_CONTEXT");
// 获取的是安全框架上下文对象
SecurityContext securityContext = (SecurityContext) spring_security_context;
// 获得认证信息
Authentication authentication = securityContext.getAuthentication();
//用户详情
Object principal = authentication.getPrincipal();
//获取用户名
User user = (User) principal;
user.getUsername();
//(2)获取用户名的第二种方式
SecurityContext context = SecurityContextHolder.getContext();
//第二种方式省略了(// 获取的是安全框架上下文对象securityContext对象之前的所有代码),用SecurityContextHolder.getContext();代替则:
// (securityContext=context)所以可以代替。然后剩下的获得用户认证信息代码与第一种完全一致,此处省略,编写完毕后编写web文件
}
二、编写web文件获取显示用户名
<%--在显示登录的用户名的地方,用el表达是书写取值--%>
${sessionScope.SPRING_SECURITY_CONTEXT.authentication.principal.username}