shiro sessionId 冲突

podd 2020-03-17 01:59:05
在同一个服务器上部署2个springboot shiro项目,登录第一个项目,第二个项目就被重定向的登录页,sessionId的名字设置的是不一样,但好像不起作用

@Configuration
@DependsOn(value = "applicationContextProvider")
public class ShiroConfig {

@Bean
public ShiroFilterFactoryBean shirFilter(DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setLoginUrl("/login");
shiroFilterFactoryBean.setSuccessUrl("/index");
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
//数据库存储过滤接口信息
OpenApiSetService openApiSetService = (OpenApiSetService) ApplicationContextProvider.getBean("openApiSetService");
Map<String, String> filterMap = openApiSetService.loadFilterChainDefinitions();

shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
shiroFilterFactoryBean.setSecurityManager(securityManager);
return shiroFilterFactoryBean;
}

@Bean
public ShiroRealm shiroRealm() {
ShiroRealm shiroRealm = new ShiroRealm();
shiroRealm.setName("mpm");
shiroRealm.setCacheManager(cacheManager());
return shiroRealm;
}

@Bean
public FilterRegistrationBean securityFilterChain(AbstractShiroFilter securityFilter) {
FilterRegistrationBean registration = new FilterRegistrationBean(securityFilter);
registration.setName("shiroFilter");
registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.FORWARD);
return registration;
}

@Bean
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(shiroRealm());
securityManager.setCacheManager(cacheManager());
securityManager.setRememberMeManager(cookieRememberMeManager());
return securityManager;
}

@Bean
@ConditionalOnMissingBean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
return defaultAdvisorAutoProxyCreator;
}

@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor
= new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}

@Bean
public EhCacheManager cacheManager() {
EhCacheManager ehCacheManager = new EhCacheManager();
ehCacheManager.setCacheManagerConfigFile("classpath:ehcache.xml");
return ehCacheManager;
}

@Bean("sessionIdCookie")
public SimpleCookie simpleCookie() {
SimpleCookie simpleCookie = new SimpleCookie("sid");
simpleCookie.setHttpOnly(true);
simpleCookie.setMaxAge(604800);
return simpleCookie;
}

@Bean
public CookieRememberMeManager cookieRememberMeManager() {
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="));
cookieRememberMeManager.setCookie(simpleCookie());
return cookieRememberMeManager;
}

}
...全文
101 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
【资源说明】 1、基于SpringBoot的高并发选课系统源码+项目说明(毕设).zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 ## 项目简介 本项目主要解决在高校选课场景下,保证选课系统在大量读写压力下不宕机,以及选课时尽可能提高选课QPS,给学生一个良好的选课体验,完成上述功能同时保证选课安全 ## 技术选型 前端:Bootstrap、JQuery、Thymeleaf 后端:SpringBoot、Shiro、JPA、Caffeine 中间件:Redis、RabbitMQ、Druid 数据库:MySQL ## 优化思路 ### 页面查看 解决思路:从Redis缓存中查看数据,减少数据库访问 从数据可见性角度来讲,分为对所有人可见的公有信息,和只有自己可见的私有信息 ### 登陆 1. 学生可能多次登陆系统,第一次登陆时将学生信息加载进Redis,减少后续登陆时对数据库的访问 2. 通过单例模式构建全局唯一类,根据sessionID保存学生学号,供后续使用 ### 选课 **_此功能为整个系统的重点优化之处,_** 主要分为两大步骤,选课安全验证和执行选课操作 #### **选课安全验证** 1. IP限流,每分钟可以访问三次,与学号绑定,通过Redis实现 ```java Integer sno = StudentIDUtils.getStudentIDFromMap(); Integer count = (Integer) redisService.get("ip-", String.valueOf(sno)); if (count == null) { //一分钟内可以访问三次 redisService.set("ip-", String.valueOf(sno), 1, 1, TimeUnit.MINUTES); }else if (count < 3){ redisService.incr("ip-"+sno, 1); }else { throw new GlobalException(CodeMsg.COUNT_OVER); } ``` 2. 判断是否存在该课程,从Redis中查看 3. 判断是否在规定选课时限范围内,从Redis中查看 4. 若满足上述步骤,根据课程号生成其md5值,暴露秒杀地址 5. 执行选课操作时验证秒杀地址是否正确 #### 执行选课操作 1. 通过本地标记判断是否有余量,若有,执行后续 2. 判断是否重选,通过查看Redis是否有对应缓存来实现 3. 判断上课时间是否冲突,构造冲突判断算法,遍历Redis中已选课程进行验证 4. 库存预减,当库存为0时,将该授课计划添加到本地缓存中,本地缓存通过Caffeine构建 ```java Long num = redisService.hdecr("forPlanCount", String.valueOf(pno), 1); // LOGGER.info("redis中读取pno={} 的授课计划余量为{}", pno, num); if(num < 0){ //没余量,写入本地缓存中 caffeineCache.put(pno, true); throw new GlobalException(CodeMsg.PlAN_OVER); } ``` 5. 选课请求压入MQ,异步执行,流量削峰,消费端消费选课信息,将结果写入数据库,结果写入数据库这一步采用事务机制,先插入结果,后减余量,减少事务期间锁持有时间,优化数据库读写性能 6. 返回执行成功标识,但结果需要到选课查询页面确认 #### 预加载 ```java @Service public class ChooseServiceImpl implements ChooseService, InitializingBean { @Override public void afterPropertiesSet() throws Exception { //预加载相关操作 } } ``` 通过上述代码所示,Spring

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧