在web工程(最普通的Servlet&JSP)中使用shiro,卻發現每次請求Servlet時,通過shiro獲得的session id都是新的(都不一樣),不知為什么?
新建了一個普通的Java Web工程,自定義了Reaml,撰寫一個Servlet,每次請求這個Servlet時,列印subject的Session ID,可是每次都得到不同的Session ID?為什么呢?代碼哪里寫錯了嗎?代碼如下:
shiro.ini
[users]
zhang=123,admin
[roles]
admin=user:*
自定義realm
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 先不管認證
return new SimpleAuthenticationInfo("zhang", "123", this.getName());
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 先不管授權
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
return authorizationInfo;
}
}
背景關系啟動時,創建了SecurityManager
@WebListener
public class MyServletContextListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("destroyed");
}
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("initialized");
// Cookie
SimpleCookie sessionIdCookie = new SimpleCookie();
sessionIdCookie.setName("sid");
// SessionManager
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setSessionIdCookieEnabled(true);
sessionManager.setSessionIdCookie(sessionIdCookie);
// SecurityManager
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setSessionManager(sessionManager);
securityManager.setRealm(new MyRealm());
SecurityUtils.setSecurityManager(securityManager);
}
}
Servlet
@WebServlet(name = "myServlet", urlPatterns = "/login")
public class MyServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Subject subject = SecurityUtils.getSubject();
System.out.println("Session ID:"+subject.getSession().getId().toString());
}
}
在瀏覽器輸入:localhost:8080/test/login,回車,再重繪2次,控制臺輸出了3個不同的Session ID?這是為什么呢?
Session ID:b9e3faa1-55d4-4b9d-8276-50e717f179c0
Session ID:21e14dff-1079-403d-bc9b-76bde9edbc70
Session ID:90728816-9f3c-4ead-8aee-db2644635fa9
uj5u.com熱心網友回復:
你輸出一下SESSION的超時時間看看request.getSession().getMaxInactiveInterval()uj5u.com熱心網友回復:
哥們,我也是研究了很久才研究出來的,我通過看原始碼,發現本地的session,也就是不是web的,它不會通過cookie中的jsessionid來判斷是否是登錄狀態,通過看原始碼發現,是通過將subject與當前執行緒系結,來實作是否該subject已經登錄,由于我們使用的是web服務器tomcat,用的是連接池,當有請求過來的時候,會有一個執行緒來對應回應,每次請求的對應的執行緒是不一樣的,因為subject與執行緒系結的,有的執行緒沒有subject,會再次登錄,并生成session,所以sessionid不一樣,但是連接池是回圈使用的,當我們多次請求的時候,你會發現sessionid有重復的,原因就是這個執行緒的subject之前有登錄過。希望能看懂!
uj5u.com熱心網友回復:
有沒有什么相關的博客介紹這個問題?最后怎么解決這個問題的啊
uj5u.com熱心網友回復:
程式里判斷一下,別重復提交了呢uj5u.com熱心網友回復:
就問個問題,還被刪,
我也遇到樓主的問題了,請問樓主是怎么解決的呢?
uj5u.com熱心網友回復:
你這不胡扯嗎,sessionid不是web的,但默認也是通過兩種方式讀取sessionId 1、讀取的cookie的JSESSIONID2、讀取url中的JSESSIONID,這其中原理和servlet的session不一樣的嗎,重復生成sessionId肯定是客戶端沒有發送sessionID呀!
uj5u.com熱心網友回復:
同樣的問題,客戶端沒有發送session,但是我已經使用了withCredentials: true轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/52200.html
標籤:Web 開發
下一篇:Java新手
