Shiro + SSM(框架) + Freemarker(jsp)
阿新 • • 發佈:2017-07-11
pro debug == 返回 hash ignorecas version token turn 判斷請求是否為Ajax請求
Shiro + SSM(框架) + Freemarker(jsp)講解的權限控制Demo,還不趕快去下載?
我們知道Ajax不能做頁面redirect
和forward
跳轉,所以Ajax請求假如沒登錄,那麽這個請求給用戶的感覺就是沒有任何反應,而用戶又不知道用戶已經退出或是 Session 超時了。這個時候如何解決?
Shiro 教程,Ajax請求攔截跳轉頁面方案
在登錄攔截器中,如我們自己定義的LoginFilter
中,先行判斷下,是否為 Ajax 請求,如果是 Ajax 請求並且沒有相關權限,采用Response
輸出一段 JSON 數據返回即可。
判斷請求是否為Ajax請求
/**
* 是否是Ajax請求
* @param request
* @return
*/
public static boolean isAjax(ServletRequest request){
String header = ((HttpServletRequest) request).getHeader("X-Requested-With");
if("XMLHttpRequest".equalsIgnoreCase(header)){
LoggerUtils.debug(CLAZZ, "當前請求為Ajax請求");
return Boolean.TRUE;
}
LoggerUtils.debug(CLAZZ, "當前請求非Ajax請求");
return Boolean.FALSE;
}
Response 輸出JSON數據
/**
* 使用 response 輸出JSON
* @param hresponse
* @param resultMap
* @throws IOException
*/
public static void out(ServletResponse response, Map<String, String> resultMap){
PrintWriter out = null;
try {
response.setCharacterEncoding("UTF-8");//設置編碼
response.setContentType("application/json");//設置返回類型
out = response.getWriter();
out.println(JSONObject.fromObject(resultMap).toString());//輸出
} catch (Exception e) {
LoggerUtils.fmtError(CLAZZ, e, "輸出JSON報錯。");
}finally{
if(null != out){
out.flush();
out.close();
}
}
}
Shiro Filter 判斷Ajax 請求並且處理
package com.sojson.core.shiro.filter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.shiro.web.filter.AccessControlFilter;
import com.sojson.common.model.UUser;
import com.sojson.common.utils.LoggerUtils;
import com.sojson.core.shiro.CustomShiroSessionDAO;
import com.sojson.core.shiro.token.manager.TokenManager;
/**
*
* <p>
* <p>
* 博客地址:http://www.cnblogs.com/123hll/
* <p>
* <p>
*
* 判斷登錄
*
* <p>
*
* 區分 責任人 日期 說明<br/>
* 創建 Helei 2017年7月2日 <br/>
*
* @author he-lei
* @email
[email protected]* @version 1.0,2017年7月2日 <br/>
*
*/
public class LoginFilter extends AccessControlFilter {
final static Class<LoginFilter> CLASS = LoginFilter.class;
// session獲取
CustomShiroSessionDAO customShiroSessionDAO;
@Override
protected boolean isAccessAllowed(ServletRequest request,
ServletResponse response, Object mappedValue) throws Exception {
UUser token = TokenManager.getToken();
if (null != token || isLoginRequest(request, response)) {// &&// isEnabled()
return Boolean.TRUE;
}
if (ShiroFilterUtils.isAjax(request)) {// ajax請求
Map<String, String> resultMap = new HashMap<String, String>();
LoggerUtils.debug(getClass(), "當前用戶沒有登錄,並且是Ajax請求!");
resultMap.put("login_status", "300");
resultMap.put("message",
"\u5F53\u524D\u7528\u6237\u6CA1\u6709\u767B\u5F55\uFF01");// 當前用戶沒有登錄!
ShiroFilterUtils.out(response, resultMap);
}
return Boolean.FALSE;
}
@Override
protected boolean onAccessDenied(ServletRequest request,
ServletResponse response) throws Exception {
// 保存Request和Response 到登錄後的鏈接
saveRequestAndRedirectToLogin(request, response);
return Boolean.FALSE;
}
public void setCustomShiroSessionDAO(
CustomShiroSessionDAO customShiroSessionDAO) {
this.customShiroSessionDAO = customShiroSessionDAO;
}
}
前端Javascript處理Ajax請求返回值
首先提供一個判斷方法:
/**
* 判斷是否登錄,沒登錄刷新當前頁,促使Shiro攔截後跳轉登錄頁
* @param result ajax請求返回的值
* @returns {如果沒登錄,刷新當前頁}
*/
function isLogin(result){
if(result && result.login_status && result.login_status == 300){
window.location.reload(true);//刷新當前頁
}
return !0;//返回true
}
然後來一個栗子:
//改變狀態
function changeSessionStatus(sessionIds,status,self){
status = !parseInt(status);
//loading
var load = layer.load();
$.post("${basePath}/member/changeSessionStatus.shtml",{status:status,sessionIds:sessionIds},function(result){
layer.close(load);
if(isLogin(result)){//判斷是否登錄
if(result && result.status == 200){
return self.text(result.sessionStatusText),
self.attr(‘status‘,result.sessionStatus),
self.parent().prev().text(result.sessionStatusTextTd);
layer.msg(‘操作成功‘),!1;
}else{
return layer.msg(result.message,function(){}),!1;
}
}
},‘json‘);
}
Shiro + SSM(框架) + Freemarker(jsp)