<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; }