七.微信の小さいプログラム、shiroはcookieを使わないでどのようにログインの状態を維持します

2929 ワード

普段はweb開発をしていますが、shiroのセッションマネージャはDefaultWebSessionManagerを採用しています.ブラウザにJESSIONIDのクッキーを書きます.DefaultWebSessionManagerでデフォルトで使用されているseesiondaoは、newサーブレットContainerSessionManager()です.もちろん、sessiondaoを自分で書き換えてredisまたはデータベースに保存することもできます.
ブラウザはこの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;
        }
    }
}