要在Apache Tomee和GemFire之间集成会话管理,可以使用Apache Shiro作为安全框架,并使用GemFire作为会话存储。
以下是一个简单的示例代码,演示了如何在Apache Tomee中集成Apache Shiro和GemFire:
org.apache.shiro
shiro-core
1.7.1
org.apache.shiro
shiro-web
1.7.1
org.apache.shiro
shiro-gemfire
1.7.1
io.pivotal.gemfire
gemfire
9.8.6
org.apache.shiro.session.mgt.SessionManager
接口:import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.SessionContext;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
public class GemFireSessionManager extends AbstractSessionDAO implements SessionManager {
private EnterpriseCacheSessionDAO sessionDAO;
public GemFireSessionManager() {
this.sessionDAO = new EnterpriseCacheSessionDAO();
}
@Override
public Session start(SessionContext sessionContext) {
return sessionDAO.create(sessionContext);
}
@Override
public Session getSession(SessionKey sessionKey) {
return sessionDAO.readSession(sessionKey);
}
@Override
public void update(Session session) {
sessionDAO.update(session);
}
@Override
public void delete(Session session) {
sessionDAO.delete(session);
}
}
import org.apache.shiro.cache.MemoryConstrainedCacheManager;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.mgt.WebSecurityManager;
import org.apache.shiro.web.servlet.AbstractShiroFilter;
import org.apache.shiro.web.servlet.ShiroFilterFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ShiroConfig {
@Bean
public AbstractShiroFilter shiroFilterFactoryBean() throws Exception {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager());
shiroFilterFactoryBean.setLoginUrl("/login");
shiroFilterFactoryBean.setSuccessUrl("/home");
shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");
return shiroFilterFactoryBean;
}
@Bean
public WebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setSessionManager(sessionManager());
securityManager.setCacheManager(new MemoryConstrainedCacheManager());
return securityManager;
}
@Bean
public SessionManager sessionManager() {
GemFireSessionManager sessionManager = new GemFireSessionManager();
sessionManager.setSessionDAO(new EnterpriseCacheSessionDAO());
return sessionManager;
}
}
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login")
public String doLogin(@RequestParam("username") String username,
@RequestParam("password") String password,
Model model) {
Subject currentUser = SecurityUtils.getSubject();
if (!currentUser.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
token.setRememberMe(true);
try {
currentUser.login(token);
} catch (Exception e) {
model.addAttribute