shiro实现账号同一时间只能在一处登录(非单点登录)详解编程语言

<bean id="myRealm" class="com.sys.shiro.MyRealm" /> 
 
    <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.MemorySessionDAO"> 
    </bean> 
 
<bean id="sessionManager" 
        class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> 
        <property name="globalSessionTimeout" value="1800000" /> 
        <property name="deleteInvalidSessions" value="true" /> 
        <property name="sessionValidationSchedulerEnabled" value="true" /> 
        <property name="sessionValidationInterval" value="1800000" /> 
        <property name="sessionIdCookie" ref="sessionIdCookie" /> 
        <property name="sessionDAO" ref="sessionDAO"/> 
    </bean> 
 
 
<!-- Shiro默认会使用Servlet容器的Session,可通过sessionMode属性来指定使用Shiro原生Session --> 
    <!-- 即<property name="sessionMode" value="native"/>,详细说明见官方文档 --> 
    <!-- 这里主要是设置自定义的单Realm应用,若有多个Realm,可使用'realms'属性代替 --> 
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> 
        <property name="cacheManager" ref="shiroCacheManager" /> 
        <property name="realm" ref="myRealm" /> 
        <property name="sessionManager" ref="sessionManager" /> 
    </bean>
/*** 
     * 实现用户登录 
     *  
     * @param username 
     * @param password 
     * @return 
     */ 
    @RequestMapping(value = "doLogin") 
    public ModelAndView Login(String username, String password) { 
        ModelAndView mav = new ModelAndView(); 
        User user = loginService.getUser(username); 
        if (user == null) { 
            mav.setViewName("login"); 
            mav.addObject("msg", "用户不存在"); 
            return mav; 
        } 
        if (!user.getPassword().equals(password)) { 
            mav.setViewName("login"); 
            mav.addObject("msg", "账号密码错误"); 
            return mav; 
        } 
        Collection<Session> sessions = sessionDao.getActiveSessions(); 
        for (Session session : sessions) { 
 
            System.out.println("登录用户" + session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY)); 
            if (session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY) != null) { 
                mav.setViewName("login"); 
                mav.addObject("msg", "该用户已登录"); 
                return mav; 
            } 
        } 
 
        /* 
         * SecurityUtils.getSecurityManager().logout(SecurityUtils.getSubject()) 
         * ; 
         */ 
        // 登录后存放进shiro token 
        UsernamePasswordToken token = new UsernamePasswordToken(user.getName(), user.getPassword()); 
        Subject subject = SecurityUtils.getSubject(); 
        subject.login(token); 
 
        // 登录成功后会跳转到successUrl配置的链接,不用管下面返回的链接。 
        mav.setViewName("redirect:home"); 
        return mav; 
    }

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/11481.html

(0)
上一篇 2021年7月19日 11:14
下一篇 2021年7月19日 11:17

相关推荐

发表回复

登录后才能评论