shrio教程初级shiro整合springmvc

一、前言

前面我们主要讲解了写什么,讲解通过ini文件加载,自定义realm源(ishi加密),对用户认证和权限授权。这一章开始,我们开始整合shrio到web项目中,当然还是与我们之前的springmvc与mybatis整合。这里的mybatis不强求,如果你整合的时候也可以用hibernate,只不过是另一个数据框架。

二、整合spring

2.1 基础框架

语言准备好基础框架:springmvc+mybatis的整合文件

2.2jar包导入

[html]  view plain  copy
  1. <!--======================================shrio=================================================-->  
  2.   <dependency>  
  3.       <groupId>org.apache.shiro</groupId>  
  4.       <artifactId>shiro-core</artifactId>  
  5.       <version>1.2.4</version>  
  6.   </dependency>  
  7.   <dependency>  
  8.       <groupId>org.apache.shiro</groupId>  
  9.       <artifactId>shiro-web</artifactId>  
  10.       <version>1.2.4</version>  
  11.   </dependency>  
  12.   <dependency>  
  13.       <groupId>org.apache.shiro</groupId>  
  14.       <artifactId>shiro-spring</artifactId>  
  15.       <version>1.2.4</version>  
  16.   </dependency>  
  17.   <dependency>  
  18.       <groupId>org.apache.shiro</groupId>  
  19.       <artifactId>shiro-ehcache</artifactId>  
  20.       <version>1.2.4</version>  
  21.   </dependency>  
  22.   <dependency>  
  23.       <groupId>org.apache.shiro</groupId>  
  24.       <artifactId>shiro-quartz</artifactId>  
  25.       <version>1.2.4</version>  
  26.   </dependency>  

2.3在web.xml配置filter

[html]  view plain  copy
  1. <!--===============================================shiro过虑器================================================-->  
  2.     <!-- shiro过虑器,DelegatingFilterProx会从spring容器中找shiroFilter代理模式(律师模式) -->  
  3.     <filter>  
  4.         <filter-name>shiroFilter</filter-name>  
  5.         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
  6.         <!--设置为true有servlet容器控制filter声明周期-->  
  7.         <init-param>  
  8.             <param-name>targetFilterLifecycle</param-name>  
  9.             <param-value>true</param-value>  
  10.         </init-param>  
  11.     </filter>  
  12.     <filter-mapping>  
  13.         <filter-name>shiroFilter</filter-name>  
  14.         <url-pattern>/*</url-pattern>  
  15.     </filter-mapping>  

2.4在spring中配置filter

配置完毕web.xml,我们需要在spring设置我们filter,主要配置:(拒绝权限地址,用户认证跳转页面)1、过滤器,2、安全管理器, 3、自己定义realm
跟我们用ini配置是思想是一样的。拦截---交给shrio的filter---shrio拦截
(applicationContext-shiro.xml)
[html]  view plain  copy
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"  
  3.        xmlns:context="http://www.springframework.org/schema/context"  
  4.        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
  6.         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
  7.         http://www.springframework.org/schema/mvc  
  8.         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd  
  9.         http://www.springframework.org/schema/context  
  10.         http://www.springframework.org/schema/context/spring-context-4.0.xsd  
  11.         http://www.springframework.org/schema/aop  
  12.         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
  13.         http://www.springframework.org/schema/tx  
  14.         http://www.springframework.org/schema/tx/spring-tx-4.0.xsd ">  
  15.     <!-- Shiro 的Web过滤器 -->  
  16.     <!--1、与web.xml对应的bean-->  
  17.     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
  18.         <property name="securityManager" ref="securityManager" />  
  19.         <!-- 如果没有认证将要跳转的登陆地址,http可访问的url,如果不在表单认证过虑器FormAuthenticationFilter中指定此地址就为身份认证地址 -->  
  20.         <property name="loginUrl" value="/login.action" />  
  21.         <!-- 没有权限跳转的地址 -->  
  22.         <property name="unauthorizedUrl" value="/pages/jsp/refuse.jsp" />  
  23.         <!--过滤定义,从上而下,蒋匿名的anon放最下面-->  
  24.         <property name="filterChainDefinitions">  
  25.             <value>  
  26.                 /** anon  
  27.             </value>  
  28.         </property>  
  29.     </bean>  
  30.   
  31.     <!-- 2、安全管理器 -->  
  32.     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
  33.         <property name="realm" ref="userRealm" />  
  34.     </bean>  
  35.   
  36.     <!--3、realm-->  
  37.     <bean id="userRealm" class="com.ycy.shiro.CustomRealm"/>  
  38. </beans>  

2.4.1 shrio过滤器

上面所说的过滤器需要配置文件,配置如下

过滤器简称

对应的Java

anon

org.apache.shiro.web.filter.authc.AnonymousFilter

authc

org.apache.shiro.web.filter.authc.FormAuthenticationFilter

authcBasic

org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter

perms

org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter

port

org.apache.shiro.web.filter.authz.PortFilter

rest

org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter

roles

org.apache.shiro.web.filter.authz.RolesAuthorizationFilter

ssl

org.apache.shiro.web.filter.authz.SslFilter

user

org.apache.shiro.web.filter.authc.UserFilter

logout

org.apache.shiro.web.filter.authc.LogoutFilter



  •  Shiro-1.2.2内置的FilterChain
  • =========================================================================================================================
  •   1)Shiro验证URL时,URL匹配成功便不再继续匹配查找(所以要注意配置文件中的URL顺序,尤其在使用通配符时)
  •     故filterChainDefinitions的配置顺序为自上而下,以最上面的为准
  •   2)当运行一个Web应用程序时,Shiro将会创建一些有用的默认Filter实例,并自动地在[main]项中将它们置为可用
  •     自动地可用的默认的Filter实例是被DefaultFilter枚举类定义的,枚举的名称字段就是可供配置的名称
  •     anon---------------org.apache.shiro.web.filter.authc.AnonymousFilter
  •     authc--------------org.apache.shiro.web.filter.authc.FormAuthenticationFilter
  •     authcBasic---------org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
  •     logout-------------org.apache.shiro.web.filter.authc.LogoutFilter
  •     noSessionCreation--org.apache.shiro.web.filter.session.NoSessionCreationFilter
  •     perms--------------org.apache.shiro.web.filter.authz.PermissionAuthorizationFilter
  •     port---------------org.apache.shiro.web.filter.authz.PortFilter
  •     rest---------------org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
  •     roles--------------org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
  •     ssl----------------org.apache.shiro.web.filter.authz.SslFilter
  •     user---------------org.apache.shiro.web.filter.authz.UserFilter
  •   =========================================================================================================================
  •   3)通常可将这些过滤器分为两组
  •     anon,authc,authcBasic,user是第一组认证过滤器
  •     perms,port,rest,roles,ssl是第二组授权过滤器
  •     注意user和authc不同:当应用开启了rememberMe时,用户下次访问时可以是一个user,但绝不会是authc,因为authc是需要重新认证的
  •                        user表示用户不一定已通过认证,只要曾被Shiro记住过登录状态的用户就可以正常发起请求,比如rememberMe
  •                        说白了,以前的一个用户登录时开启了rememberMe,然后他关闭浏览器,下次再访问时他就是一个user,而不会authc
  •   =========================================================================================================================
  •   4)举几个例子
  •     /admin=authc,roles[admin]      表示用户必需已通过认证,并拥有admin角色才可以正常发起'/admin'请求
  •     /edit=authc,perms[admin:edit]  表示用户必需已通过认证,并拥有admin:edit权限才可以正常发起'/edit'请求
  •     /home=user                     表示用户不一定需要已经通过认证,只需要曾经被Shiro记住过登录状态就可以正常发起'/home'请求
  •   =========================================================================================================================
  •   5)各默认过滤器常用如下(注意URL Pattern里用到的是两颗星,这样才能实现任意层次的全匹配)
  •     /admins/**=anon             无参,表示可匿名使用,可以理解为匿名用户或游客
  •     /admins/user/**=authc       无参,表示需认证才能使用
  •     /admins/user/**=authcBasic  无参,表示httpBasic认证
  •     /admins/user/**=user        无参,表示必须存在用户,当登入操作时不做检查
  •     /admins/user/**=ssl         无参,表示安全的URL请求,协议为https
  •     /admins/user/**=perms[user:add:*]
  •         参数可写多个,多参时必须加上引号,且参数之间用逗号分割,如/admins/user/**=perms["user:add:*,user:modify:*"]
  •         当有多个参数时必须每个参数都通过才算通过,相当于isPermitedAll()方法
  •     /admins/user/**=port[8081]
  •         当请求的URL端口不是8081时,跳转到schemal://serverName:8081?queryString
  •         其中schmal是协议http或https等,serverName是你访问的Host,8081是Port端口,queryString是你访问的URL里的?后面的参数
  •     /admins/user/**=rest[user]
  •         根据请求的方法,相当于/admins/user/**=perms[user:method],其中method为post,get,delete等
  •     /admins/user/**=roles[admin]
  •         参数可写多个,多个时必须加上引号,且参数之间用逗号分割,如/admins/user/**=roles["admin,guest"]
  •         当有多个参数时必须每个参数都通过才算通过,相当于hasAllRoles()方法

2.5自定义realm的编写


realm数据库查询用户信息,将用户菜单、usercodeusername等设置在SimpleAuthenticationInfo中。


[html]  view plain  copy
  1. package com.ycy.shiro;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import com.ycy.model.ActiveUser;  
  7. import com.ycy.model.SysPermission;  
  8. import com.ycy.model.SysUser;  
  9. import com.ycy.service.SysService;  
  10. import org.apache.shiro.SecurityUtils;  
  11. import org.apache.shiro.authc.AuthenticationException;  
  12. import org.apache.shiro.authc.AuthenticationInfo;  
  13. import org.apache.shiro.authc.AuthenticationToken;  
  14. import org.apache.shiro.authc.SimpleAuthenticationInfo;  
  15. import org.apache.shiro.authz.AuthorizationInfo;  
  16. import org.apache.shiro.authz.SimpleAuthorizationInfo;  
  17. import org.apache.shiro.realm.AuthorizingRealm;  
  18. import org.apache.shiro.subject.PrincipalCollection;  
  19. import org.apache.shiro.util.ByteSource;  
  20. import org.springframework.beans.factory.annotation.Autowired;  
  21. import org.springframework.stereotype.Component;  
  22. import org.springframework.stereotype.Service;  
  23.   
  24.   
  25. /**  
  26.  *   
  27.  * <p>  
  28.  * Title: CustomRealm  
  29.  * </p>  
  30.  * <p>  
  31.  * Description:自定义realm  
  32.  * </p>  
  33.  */  
  34. public class CustomRealm extends AuthorizingRealm {  
  35.       
  36.     //注入service  
  37.     @Autowired  
  38.     private SysService sysService;  
  39.   
  40.     // 设置realm的名称  
  41.     @Override  
  42.     public void setName(String name) {  
  43.         super.setName("customRealm");  
  44.     }  
  45.   
  46.     // 用于认证  
  47.     //realm的认证方法,从数据库查询用户信息  
  48.     @Override  
  49.     protected AuthenticationInfo doGetAuthenticationInfo(  
  50.             AuthenticationToken token) throws AuthenticationException {  
  51.           
  52.         // token是用户输入的用户名和密码   
  53.         // 第一步从token中取出用户名  
  54.         String userCode = (String) token.getPrincipal();  
  55.   
  56.         // 第二步:根据用户输入的userCode从数据库查询  
  57.         SysUser sysUser = null;  
  58.         try {  
  59.             sysUser = sysService.findSysUserByUserCode(userCode);  
  60.         } catch (Exception e1) {  
  61.             e1.printStackTrace();  
  62.         }  
  63.   
  64.         // 如果查询不到返回null  
  65.         if(sysUser==null){//  
  66.             return null;  
  67.         }  
  68.         // 从数据库查询到密码  
  69.         String password = sysUser.getPassword();  
  70.           
  71.         //盐  
  72.         String salt = sysUser.getSalt();  
  73.   
  74.         // 如果查询到返回认证信息AuthenticationInfo  
  75.           
  76.         //activeUser就是用户身份信息  
  77.         ActiveUser activeUser = new ActiveUser();  
  78.           
  79.         activeUser.setUserid(sysUser.getId());  
  80.         activeUser.setUsercode(sysUser.getUsercode());  
  81.         activeUser.setUsername(sysUser.getUsername());  
  82.         //..  
  83.           
  84.         //根据用户id取出菜单  
  85.         List<SysPermission> menus  = null;  
  86.         try {  
  87.             //通过service取出菜单   
  88.             menus = sysService.findMenuListByUserId(sysUser.getId());  
  89.         } catch (Exception e) {  
  90.             e.printStackTrace();  
  91.         }  
  92.         //将用户菜单 设置到activeUser  
  93.         activeUser.setMenus(menus);  
  94.   
  95.         //将activeUser设置simpleAuthenticationInfo  
  96.         SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(  
  97.                 activeUser, password,ByteSource.Util.bytes(salt), this.getName());  
  98.   
  99.         return simpleAuthenticationInfo;  
  100.     }  
  101.       
  102.       
  103.   
  104.     // 用于授权  
  105.     @Override  
  106.     protected AuthorizationInfo doGetAuthorizationInfo(  
  107.             PrincipalCollection principals) {  
  108.           
  109.         //从 principals获取主身份信息  
  110.         //将getPrimaryPrincipal方法返回值转为真实身份类型(在上边的doGetAuthenticationInfo认证通过填充到SimpleAuthenticationInfo中身份类型),  
  111.         ActiveUser activeUser =  (ActiveUser) principals.getPrimaryPrincipal();  
  112.           
  113.         //根据身份信息获取权限信息  
  114.         //从数据库获取到权限数据  
  115.         List<SysPermission> permissionList = null;  
  116.         try {  
  117.             permissionList = sysService.findMenuListByUserId(activeUser.getUserid());  
  118.         } catch (Exception e) {  
  119.             e.printStackTrace();  
  120.         }  
  121.         //单独定一个集合对象   
  122.         List<String> permissions = new ArrayList<String>();  
  123.         if(permissionList!=null){  
  124.             for(SysPermission sysPermission:permissionList){  
  125.                 //将数据库中的权限标签 符放入集合  
  126.                 permissions.add(sysPermission.getPercode());  
  127.             }  
  128.         }  
  129.           
  130.         //查到权限数据,返回授权信息(要包括 上边的permissions)  
  131.         SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();  
  132.         //将上边查询到授权信息填充到simpleAuthorizationInfo对象中  
  133.         simpleAuthorizationInfo.addStringPermissions(permissions);  
  134.   
  135.         return simpleAuthorizationInfo;  
  136.     }  
  137.       
  138.     //清除缓存  
  139.     public void clearCached() {  
  140.         PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals();  
  141.         super.clearCache(principals);  
  142.     }  
  143.   
  144.   
  145. }  

注意:先前的我们springmvc整合项目时候,先加载审springmvc:scan扫描是配置在springmvc里面,这个需要重新配置到spring
  
  
[html] view plain copy
  1. <span style="font-size:10px;"><param-value>classpath:spring/applicationContext-*.xml</param-value></span>  
配置
[html] view plain copy
  1. <span style="font-size:10px;">  <context:component-scan base-package="com.ycy"/></span>  
到这个applicationContext-*.xml中里面,因为这个是第一加载顺序。

三、shrio实现登录退出实例

上面已经实现了整合,说白了就是加一个shrio的拦截器而已。真正的实现还没做,我们以登录退出来做一个实例。

3.1登录

使用FormAuthenticationFilter过虑器实现 ,原理如下:

将用户没有认证时,请求loginurl进行认证,用户身份和用户密码提交数据到loginurl

FormAuthenticationFilter拦截住取出request中的username和password(两个参数名称是可以配置的)

FormAuthenticationFilter调用realm传入一个token(username和password)

realm认证时根据username查询用户信息(在Activeuser中存储,包括 userid、usercode、username、menus)。

如果查询不到,realm返回null,FormAuthenticationFilter向request域中填充一个参数(记录了异常信息)


3.1.1  LoginController

[html]  view plain  copy
  1. <pre style="font-family: Consolas; background-color: rgb(255, 255, 255);"><span style="font-size:12px;"></span><pre name="code" class="html"><span style="font-size:12px;">package com.ycy.controller;  
  2.   
  3. import com.ycy.Exception.CustomException;  
  4. import com.ycy.model.ActiveUser;  
  5. import com.ycy.service.SysService;  
  6. import org.apache.shiro.authc.IncorrectCredentialsException;  
  7. import org.apache.shiro.authc.UnknownAccountException;  
  8. import org.springframework.beans.factory.annotation.Autowired;  
  9. import org.springframework.stereotype.Controller;  
  10. import org.springframework.web.bind.annotation.RequestMapping;  
  11.   
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpSession;  
  14.   
  15. /**  
  16.  *   
  17.  * <p>Title: LoginController</p>  
  18.  * <p>Description: 登陆和退出</p>  
  19.  */  
  20. @Controller  
  21. public class LoginController {  
  22.       
  23.     @Autowired  
  24.     private SysService sysService;  
  25.     //用户登陆提交方法  
  26.     /*@RequestMapping("/login")  
  27.     public String login(HttpSession session,String usercode,String password,String randomcode)throws Exception{  
  28.   
  29.         //校验验证码  
  30.         //从session获取正确的验证码  
  31.         String validateCode = (String)session.getAttribute("validateCode");  
  32.         if(!randomcode.equals(validateCode)){  
  33.             //抛出异常:验证码错误  
  34.             throw new CustomException("验证码 错误 !");  
  35.         }  
  36.         //用户身份认证  
  37.         ActiveUser activeUser = sysService.authenticat(usercode, password);  
  38.         //记录session  
  39.         session.setAttribute("activeUser", activeUser);  
  40.         //重定向到商品查询页面  
  41.         return "redirect:/first";  
  42.     }  
  43.   
  44.     //用户退出  
  45.     @RequestMapping("/logout")  
  46.     public String logout(HttpSession session)throws Exception{  
  47.         //session失效  
  48.         session.invalidate();  
  49.         //重定向到商品查询页面  
  50.         return "redirect:/items/queryItems";  
  51.   
  52.     }*/  
  53.     @RequestMapping("/login")  
  54.     public  String login(HttpServletRequest request)throws Exception{  
  55.         //如果登录失败从request中获取认证异常信息,shrioLoginFailure就是shiro异常类的全限定名  
  56.         String exceptionClassName = (String) request.getAttribute("shiroLoginFailure");  
  57.         //根据shrio返回的异常路径判断,抛出指定异常信息  
  58.         if (exceptionClassName!=null){  
  59.             if(UnknownAccountException.class.getName().equals(exceptionClassName)){  
  60.                 //抛出异常  
  61.                 throw new CustomException("账户不存在");  
  62.             }else if(IncorrectCredentialsException.class.getName().equals(exceptionClassName)){  
  63.                 throw new CustomException("用户名/密码错误");  
  64.             } else {  
  65.                 throw new Exception("未知错误");  
  66.             }  
  67.         }  
  68.         return "login";  
  69.     }  
  70.   
  71.       
  72.   
  73. }  
  74. </span>  

 
 
 
 

3.1.2 配置applicationContext-shiro.xml

[html]  view plain  copy
  1. package com.ycy.controller;  
  2.   
  3. import com.ycy.Exception.CustomException;  
  4. import com.ycy.model.ActiveUser;  
  5. import com.ycy.service.SysService;  
  6. import org.apache.shiro.authc.IncorrectCredentialsException;  
  7. import org.apache.shiro.authc.UnknownAccountException;  
  8. import org.springframework.beans.factory.annotation.Autowired;  
  9. import org.springframework.stereotype.Controller;  
  10. import org.springframework.web.bind.annotation.RequestMapping;  
  11.   
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpSession;  
  14.   
  15. /**  
  16.  *   
  17.  * <p>Title: LoginController</p>  
  18.  * <p>Description: 登陆和退出</p>  
  19.  */  
  20. @Controller  
  21. public class LoginController {  
  22.       
  23.     @Autowired  
  24.     private SysService sysService;  
  25.     //用户登陆提交方法  
  26.     /*@RequestMapping("/login")  
  27.     public String login(HttpSession session,String usercode,String password,String randomcode)throws Exception{  
  28.   
  29.         //校验验证码  
  30.         //从session获取正确的验证码  
  31.         String validateCode = (String)session.getAttribute("validateCode");  
  32.         if(!randomcode.equals(validateCode)){  
  33.             //抛出异常:验证码错误  
  34.             throw new CustomException("验证码 错误 !");  
  35.         }  
  36.         //用户身份认证  
  37.         ActiveUser activeUser = sysService.authenticat(usercode, password);  
  38.         //记录session  
  39.         session.setAttribute("activeUser", activeUser);  
  40.         //重定向到商品查询页面  
  41.         return "redirect:/first";  
  42.     }  
  43.   
  44.     //用户退出  
  45.     @RequestMapping("/logout")  
  46.     public String logout(HttpSession session)throws Exception{  
  47.         //session失效  
  48.         session.invalidate();  
  49.         //重定向到商品查询页面  
  50.         return "redirect:/items/queryItems";  
  51.   
  52.     }*/  
  53.     @RequestMapping("/login")  
  54.     public  String login(HttpServletRequest request)throws Exception{  
  55.         //如果登录失败从request中获取认证异常信息,shrioLoginFailure就是shiro异常类的全限定名  
  56.         String exceptionClassName=(String)request.getAttribute("shiroLoginFailure");  
  57.         //根据shrio返回的异常路径判断,抛出指定异常信息  
  58.         if (exceptionClassName!=null){  
  59.             if(UnknownAccountException.class.getName().equals(exceptionClassName)){  
  60.                 //抛出异常  
  61.                 throw new CustomException("账户不存在");  
  62.             }  
  63.         }else if(IncorrectCredentialsException.class.getName().equals(exceptionClassName)){  
  64.                 throw new CustomException("用户名/密码错误");  
  65.         }  
  66.         return "login";  
  67.     }  
  68.   
  69.       
  70.   
  71. }  



3.1.3 加入首页数据

[html]  view plain  copy
  1. //系统首页  
  2. @RequestMapping("/first")  
  3. public String first(Model model)throws Exception{  
  4.     //从shiro的session中取出activeUser  
  5.     Subject subjectSecurityUtils.getSubject();  
  6.     ActiveUser activeUser=(ActiveUser)subject.getPrincipal();  
  7.     //通过model传送到页面  
  8.     model.addAttribute("activeUser",activeUser);  
  9.     return "first";  
  10. }  

3.2 退出

退出我们已经用shiro的。很简单
[html]  view plain  copy
  1. <!--请求logout,shrio擦除sssion-->  
  2.           /logout=logout  

展示页面:



整个流程还是比较坑爹,如果有什么不懂,请加入qq群咨询。100%回答


3.3 总结登录退出实例5步走

1、web.xml配置shiroFileter拦截器
2、applicationContext-shiro配置:1、首先配置 shiroFileter  2、设置securityManager 3、设置过滤表达式 4、设置我们自己的realm
3、再配置loginController,根据异常返回用户认证错误信息
4、配置FristController,从securityUtil.getInstance(),加入环境。然后获取subject主体,再用属性注入到实体
5、在frist.jsp 获取controller传入的activeUser数据展示。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值