关于sessonid的问题

来源:17-1 权限操作记录模块接口开发

371425

2020-03-23

public class ShiroSession extends DefaultWebSessionManager {
//定义的请求头中使用的标记key,用来传递 token
private static final String AUTH_TOKEN = “authToken”;
private static final String REFERENCED_SESSION_ID_SOURCE = “Stateless request”;
public ShiroSession() {
super();
//设置 shiro session 失效时间,默认为30分钟,这里现在设置为15分钟
setGlobalSessionTimeout(MILLIS_PER_MINUTE * 15);
}
/**
* 获取sessionId,原本是根据sessionKey来获取一个sessionId
* 重写的部分多了一个把获取到的token设置到request的部分。这是因为app调用登陆接口的时候,是没有token的,登陆成功后,产生了token,我们把它放到request中,返回结
* 果给客户端的时候,把它从request中取出来,并且传递给客户端,客户端每次带着这个token过来,就相当于是浏览器的cookie的作用,也就能维护会话了
*/
protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
//获取请求头中的 AUTH_TOKEN 的值,如果请求头中有 AUTH_TOKEN 则其值为sessionId。shiro就是通过sessionId 来控制的
String sessionId = WebUtils.toHttp(request).getHeader(AUTH_TOKEN);
if (StringUtils.isEmpty(sessionId)){
//如果没有携带id参数则按照父类的方式在cookie进行获取sessionId
return super.getSessionId(request, response);
} else {
//请求头中如果有 authToken, 则其值为sessionId
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, REFERENCED_SESSION_ID_SOURCE);
//sessionId
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, sessionId);
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
return sessionId;
}
}
}
老师:shiro中我重写了DefaultWebSessionManager 这个 session 但是发现一个问题 就是只要这个session在有效期内 我就可以把我的sessionid给别人的账号 也可以登陆系统 :我想要的结果是 我的sessionid 不能让别人使用
这个问题怎么解决呢?

第二个问题 我登陆成功了 我怎么根据sessionid 获取用户的信息呢?

写回答

2回答

371425

提问者

2020-03-24

app 访问也可以获取到ip吗?

0
1
Jimin
拿不到ip可以使用设备id,肯定有可以做唯一标识的id
2020-03-24
共1条回复

Jimin

2020-03-23

你好,可以针对这个sessionid,往redis或其他介质里存储一些用户信息及访问信息(比如ip),然后每次使用时,取出这些信息验证之前信息里的ip和本次请求的ip是否一致,一致才验证通过,否则就重新登录,验证通过使用里面的用户信息就可以了

0
0

Java开发企业级权限管理系统

源于企业真实Java项目,涉及大量高级技巧,覆盖权限管理开发技术

2261 学习 · 1347 问题

查看课程