七.微信の小さいプログラム、shiroはcookieを使わないでどのようにログインの状態を維持します
2929 ワード
普段はweb開発をしていますが、shiroのセッションマネージャはDefaultWebSessionManagerを採用しています.ブラウザにJESSIONIDのクッキーを書きます.DefaultWebSessionManagerでデフォルトで使用されているseesiondaoは、newサーブレットContainerSessionManager()です.もちろん、sessiondaoを自分で書き換えてredisまたはデータベースに保存することもできます.
ブラウザはこのJESSIONIDアクセス項目を携帯し、shiroはJESSIONIDに基づいてセッション(実は両者が等しい)を分析し、このセッションに基づいてセッションDaoのメソッドを呼び出し、セッションを見つけます.
しかし、最近微信ウィジェットを作っていると、ウィジェットがwebブラウザのようにクッキーを書くことができないことに気づいた.それは、リクエストごとにJESSIONIDを持参し、shiro分析リクエストクッキーを書き換える方法で、クッキーを分析せずにリクエストに指定されたパラメータをsessionIdとして分析させるしかありません.
アプレット
まずウィジェットのコードを見て、リクエストヘッダにtokenパラメータという名前を設定します(他の名前でもいいです)
セッションマネージャをカスタマイズし、getSessionIdメソッドを書き換える
DefaultWebSessionManagerを継承し、getSessionIdメソッドを書き換えます.論理的には、リクエストヘッダにtokenがある場合はtokenを解析し、親を呼び出すメソッドはなく、元の分析cookieのパラメータに従って
ブラウザはこのJESSIONIDアクセス項目を携帯し、shiroはJESSIONIDに基づいてセッション(実は両者が等しい)を分析し、このセッションに基づいてセッションDaoのメソッドを呼び出し、セッションを見つけます.
しかし、最近微信ウィジェットを作っていると、ウィジェットがwebブラウザのようにクッキーを書くことができないことに気づいた.それは、リクエストごとにJESSIONIDを持参し、shiro分析リクエストクッキーを書き換える方法で、クッキーを分析せずにリクエストに指定されたパラメータをsessionIdとして分析させるしかありません.
アプレット
まずウィジェットのコードを見て、リクエストヘッダにtokenパラメータという名前を設定します(他の名前でもいいです)
var header;
header = {
'content-type': 'application/x-www-form-urlencoded;charset=utf-8',
'token': 'e1cacec2-044a-4d16-8d7b-dfa6e9accc83a'
};
wx.request({
// url: 'http://localhost:8090/focus/resource/getCurrentUserResourceTree',
url: 'http://localhost:8090/hhh',
//
data: {},
//get /POST
method: 'get',
header: header,
success: function (res) {
// that.setData({
// // sucess this wx.request() this . getdata this,
// videos: res.data
// })
//res.data ajax data,
console.log(res.data)
}
})
セッションマネージャをカスタマイズし、getSessionIdメソッドを書き換える
DefaultWebSessionManagerを継承し、getSessionIdメソッドを書き換えます.論理的には、リクエストヘッダにtokenがある場合はtokenを解析し、親を呼び出すメソッドはなく、元の分析cookieのパラメータに従って
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;
}
}
}