大家好,又见面了,我是你们的朋友全栈君。
最近在开发一个项目,测试的人员给我说IOS的登录不上去,由于我和他不是一起的,不能面对面的调试,我就自己找问题喽。
没成想正让我找到了。
问题一:
使用IE浏览器访问的时候sessionID一直变化,其他的浏览器没问题。
找了半天原因,发现IE登录的时候路径一样的会自动缓存数据,压根就不进你的后台,直接就是没登录,sessionID一直变化也是正常的,这个问题在参数后面加个时间戳就解决了。
问题二:
我以为IOS也是这个问题,后来让测试的去测,发现不是这个问题,IOS能正常登录进入后台,但是登录成功后再访问就是未登录,也就是说不是这个问题。
我又继续找问题,我就每次访问后台打印sessionID,结果坑爹的事情出现了,任何浏览器都访问不上,每次sessionID都在变化,把我给急的,代码恢复问题还是没有解决,我勒个擦。
最后我把打印给去掉了,然后就好了??????
后来查了一下资料,发现sessionID每次调用 request.getSession() session都会变,然后因为用了Shiro的框架,它里面的sessionID因为外部的session发生变化自身的也会发生变化,然后自然就认为你没登录喽。
总结
当然我遇到的问题就这两个,都给我解决了,也算是一种经验吧,感觉我这两个问题有点扯,特别是第二个哈,但是怕有人遇到和我一样的问题结果还找不到原因白白浪费时间,所以也写上了,咱不要面子搞了一个这么脑残的问题还写出来了,浪费了我几个小时的时间,引以为戒啊。
说到这,IOS端的问题还是没有解决啊!!!!
所以请求哪位大佬有没有遇到相似的问题,求助!!!!!
2020-08-29更新
问题解决之后一直没怎么关注了,现在分享解决方案。
1.后台登录后主动返回生成的sessionID给前端。
2.前端存储,每次请求的时候带上,我是放在请求头中。
3.后台修改shiro获取sessionId的方式,不从cookies中拿,从header中拿。
前端代码怎么处理的都可以,就不分享了,主要是后端
1.继承 DefaultWebSessionManager,实现自定义TOKEN获取方式
代码语言:javascript复制public class StatelessSessionManager extends DefaultWebSessionManager {
/**
* 这个是服务端要返回给客户端,
*/
public final static String TOKEN_NAME = "TOKEN";
/**
* 这个是客户端请求给服务端带的header
*/
public final static String HEADER_TOKEN_NAME = "token";
public final static Logger LOG = LoggerFactory.getLogger(StatelessSessionManager.class);
private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request";
/**
* 重写getSessionId,分析请求头中的指定参数,做用户凭证sessionId
*/
@Override
protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
String id = WebUtils.toHttp(request).getHeader(HEADER_TOKEN_NAME);
//System.out.println("id:" id);
if (StringUtils.isEmpty(id)) {
//如果没有携带id参数则按照父类的方式在cookie进行获取
// System.out.println("super:" super.getSessionId(request, response));
return super.getSessionId(request, response);
} else {
//如果请求头中有 authToken 则其值为sessionId
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, REFERENCED_SESSION_ID_SOURCE);
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id);
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
return id;
}
}
}
2.接管shiro的SessionManage,在配置shiro的java类中加入如下代码
代码语言:javascript复制 /**
* shiro session的管理
*/
@Bean
public DefaultWebSessionManager sessionManager() {
StatelessSessionManager sessionManager = new StatelessSessionManager();
sessionManager.setGlobalSessionTimeout(tomcatTimeout * 1000);
sessionManager.setSessionDAO(sessionDAO());
Collection<SessionListener> listeners = new ArrayList<SessionListener>();
listeners.add(new BDSessionListener());
sessionManager.setSessionListeners(listeners);
return sessionManager;
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/160440.html原文链接:https://javaforall.cn