日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shiro 拦截未登录的ajax_Shiro是如何拦截未登录请求的(二)

發布時間:2023/12/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shiro 拦截未登录的ajax_Shiro是如何拦截未登录请求的(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

/**

* 重寫父類獲取sessionID的方法,若請求為APP或者H5則從請求頭中取出token,若為PC端后臺則從cookie中獲取

*

* @param request

* @param response

* @return

*/

@Override

protected Serializable getSessionId(ServletRequest request, ServletResponse response){

if (!(request instanceof HttpServletRequest)) {

logger.debug("Current request is not an HttpServletRequest - cannot get session ID. Returning null.");

return null;

}

HttpServletRequest httpRequest = WebUtils.toHttp(request);

if (StringHelpUtils.isNotBlank(httpRequest.getHeader("device"))

&& (httpRequest.getHeader("device").equals("APP") || httpRequest

.getHeader("device").equals("H5"))) {

//從header中獲取token

String token = httpRequest.getHeader(AUTH_TOKEN);

// 每次讀取之后都把當前的token放入response中

HttpServletResponse httpResponse = WebUtils.toHttp(response);

if (StringHelpUtils.isNotEmpty(token)) {

httpResponse.setHeader(AUTH_TOKEN, token);

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, "header");

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, token);

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);

}

//sessionIdUrlRewritingEnabled的配置為false,不會在url的后面帶上sessionID

request.setAttribute(ShiroHttpServletRequest.SESSION_ID_URL_REWRITING_ENABLED, isSessionIdUrlRewritingEnabled());

return token;

}

return getReferencedSessionId(request, response);

}

/**

* shiro默認從cookie中獲取sessionId

*

* @param request

* @param response

* @return

*/

private Serializable getReferencedSessionId(ServletRequest request, ServletResponse response){

String id = getSessionIdCookieValue(request, response);

if (id != null) {

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,

ShiroHttpServletRequest.COOKIE_SESSION_ID_SOURCE);

} else {

//not in a cookie, or cookie is disabled - try the request URI as a fallback (i.e. due to URL rewriting):

//try the URI path segment parameters first:

id = getUriPathSegmentParamValue(request, ShiroHttpSession.DEFAULT_SESSION_ID_NAME);

if (id == null) {

//not a URI path segment parameter, try the query parameters:

String name = getSessionIdName();

id = request.getParameter(name);

if (id == null) {

//try lowercase:

id = request.getParameter(name.toLowerCase());

}

}

if (id != null) {

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,

ShiroHttpServletRequest.URL_SESSION_ID_SOURCE);

}

}

if (id != null) {

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id);

//automatically mark it valid here. If it is invalid, the

//onUnknownSession method below will be invoked and we'll remove the attribute at that time.

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);

}

// always set rewrite flag - SHIRO-361

request.setAttribute(ShiroHttpServletRequest.SESSION_ID_URL_REWRITING_ENABLED, isSessionIdUrlRewritingEnabled());

return id;

}

//copy from DefaultWebSessionManager

private String getSessionIdCookieValue(ServletRequest request, ServletResponse response){

if (!isSessionIdCookieEnabled()) {

logger.debug("Session ID cookie is disabled - session id will not be acquired from a request cookie.");

return null;

}

if (!(request instanceof HttpServletRequest)) {

logger.debug("Current request is not an HttpServletRequest - cannot get session ID cookie. Returning null.");

return null;

}

HttpServletRequest httpRequest = (HttpServletRequest) request;

return getSessionIdCookie().readValue(httpRequest, WebUtils.toHttp(response));

}

//since 1.2.2 copy from DefaultWebSessionManager

private String getUriPathSegmentParamValue(ServletRequest servletRequest, String paramName){

if (!(servletRequest instanceof HttpServletRequest)) {

return null;

}

HttpServletRequest request = (HttpServletRequest) servletRequest;

String uri = request.getRequestURI();

if (uri == null) {

return null;

}

int queryStartIndex = uri.indexOf('?');

if (queryStartIndex >= 0) { //get rid of the query string

uri = uri.substring(0, queryStartIndex);

}

int index = uri.indexOf(';'); //now check for path segment parameters:

if (index < 0) {

//no path segment params - return:

return null;

}

//there are path segment params, let's get the last one that may exist:

final String TOKEN = paramName + "=";

uri = uri.substring(index + 1); //uri now contains only the path segment params

//we only care about the last JSESSIONID param:

index = uri.lastIndexOf(TOKEN);

if (index < 0) {

//no segment param:

return null;

}

uri = uri.substring(index + TOKEN.length());

index = uri.indexOf(';'); //strip off any remaining segment params:

if (index >= 0) {

uri = uri.substring(0, index);

}

return uri; //what remains is the value

}

//since 1.2.1 copy from DefaultWebSessionManager

private String getSessionIdName(){

String name = this.getSessionIdCookie() != null ? this.getSessionIdCookie().getName() : null;

if (name == null) {

name = ShiroHttpSession.DEFAULT_SESSION_ID_NAME;

}

return name;

}

總結

以上是生活随笔為你收集整理的shiro 拦截未登录的ajax_Shiro是如何拦截未登录请求的(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。