Shiro Ajax請求沒有許可權返回JSON,沒有登入返回JSON
本文基於Shiro許可權註解方式來控制Controller方法是否能夠訪問。
例如使用到註解:
@RequiresPermissions
來控制是否有對應許可權才可以訪問
@RequiresUser
來控制是否存在使用者登入狀態才可以訪問
想了解Shiro是如何通過註解來控制權限的,可以檢視原始碼 AopAllianceAnnotationsAuthorizingMethodInterceptor
,其構造方法中添加了幾個對應的許可權註解方法攔截器(這裡不做詳細闡述)。
使用者在請求使用這些註解方式控制的方法時,如果沒有通過許可權校驗。Shiro 會丟擲如下兩組型別的異常。
登入認證類異常 UnauthenticatedException.class, AuthenticationException.class
許可權認證類異常 UnauthorizedException.class, AuthorizationException.class
(每個具體的異常對應哪個註解,大家檢視原始碼瞭解一下)
言歸正傳,直接上程式碼,通過程式碼來說明本文目的 “做Ajax請求的時候,如果請求的URL是被註解許可權控制的,在沒有許可權或者登陸失效的情況下,如果獲得JSON方式的返回結果(如果使用者沒有登入,大多數都是直接跳轉到登入頁面了)”。
通過一個 BaseController 來統一處理,然後被其他 Controller 繼承即可,對於JSON和頁面跳轉,我們只需要做一個Ajax判斷處理即可。
程式碼如下:
/**
* BaseController
*
* @author 單紅宇(365384722)
* @myblog http://blog.csdn.net/catoop/
* @create 2017年4月4日
*/
public abstract class BaseController {
/**
* 登入認證異常
*/
@ExceptionHandler({ UnauthenticatedException.class, AuthenticationException.class })
public String authenticationException(HttpServletRequest request, HttpServletResponse response) {
if (WebUtilsPro.isAjaxRequest(request)) {
// 輸出JSON
Map<String,Object> map = new HashMap<>();
map.put("code", "-999");
map.put("message", "未登入");
writeJson(map, response);
return null;
} else {
return "redirect:/system/login";
}
}
/**
* 許可權異常
*/
@ExceptionHandler({ UnauthorizedException.class, AuthorizationException.class })
public String authorizationException(HttpServletRequest request, HttpServletResponse response) {
if (WebUtilsPro.isAjaxRequest(request)) {
// 輸出JSON
Map<String,Object> map = new HashMap<>();
map.put("code", "-998");
map.put("message", "無許可權");
writeJson(map, response);
return null;
} else {
return "redirect:/system/403";
}
}
/**
* 輸出JSON
*
* @param response
* @author SHANHY
* @create 2017年4月4日
*/
private void writeJson(Map<String,Object> map, HttpServletResponse response) {
PrintWriter out = null;
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
out = response.getWriter();
out.write(JsonUtil.mapToJson(map));
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
}
}
}
}
public class WebUtilsPro {
/**
* 是否是Ajax請求
*
* @param request
* @return
* @author SHANHY
* @create 2017年4月4日
*/
public static boolean isAjaxRequest(HttpServletRequest request) {
String requestedWith = request.getHeader("x-requested-with");
if (requestedWith != null && requestedWith.equalsIgnoreCase("XMLHttpRequest")) {
return true;
} else {
return false;
}
}
}
下面是一個普通的 Controller
@Controller
@RequestMapping
public class PageController extends BaseController{
@RequiresUser
@RequestMapping(value="/main", method=RequestMethod.GET)
public String main(Model model){
return "main";
}
@RequiresUser
@RequestMapping(value="/getData", method=RequestMethod.POST)
@ResponseBody
public List<String> getData(Model model){
List<String> list = new ArrayList<>();
list.add("data1");
list.add("data2");
return list;
}
}
當我們使用 ajax 方式去請求 /getData 時,如果使用者沒有登入。則會返回對應沒有登入的JSON結果。
頁面在做ajax請求時候,發現使用者沒有登入,可能需要根據響應結果做對用的頁面互動處理,而不是暴力的直接重定向到登入頁面了。
相關推薦
Shiro Ajax請求沒有許可權返回JSON,沒有登入返回JSON
本文基於Shiro許可權註解方式來控制Controller方法是否能夠訪問。 例如使用到註解: @RequiresPermissions 來控制是否有對應許可權才可以訪問 @RequiresUser 來控制是否存在使用者登入狀態才可以訪問 想了解Shir
Ajax請求servlet報 404錯誤,提示 沒有發現檔案、查詢或URl
<script type="text/javascript"> var xmlHttp; /** * 根據 瀏覽器的支援返回 不同的 XMLHttpRequest */ fu
記錄問題:登入session過期,ajax請求被web security攔截,頁面沒有資料且沒有重定向到login頁面
1.問題背景:專案是springboot框架,用了web security攔截請求,控制使用者許可權專案有一個頁面,點選分類按鈕,傳送ajax請求後臺獲取資料並區域性重新整理資料。當session過期時,點選分類按鈕,請求會被攔截轉為“/login”,但由於是ajax,頁面實
jquery ajax請求成功也有response,但是不進success
error: json格式 回調函數 區分 回調 服務 erro 就會 watcher 1.狀態碼返回200--表明服務器正常響應了客戶端的請求;2.通過firebug和IE的httpWatcher可以看出服務器端返回了正常的數據,並且是符合業務邏輯的數據,但是,程序就是不
用Ajax請求服務器的圖片,並顯示在瀏覽器中(轉)
時間比較 是否 ktr 而不是 標簽設置 gpo 異常 ping 瀏覽器中 前言 一直在數據庫裏面存的都是圖片在服務器的地址,然後再到瀏覽器中顯示,但是發現兩個問題 第一:為了安全起見,js是無法讀取本地的圖片的,不然你寫一個js,豈不是可以獲取任何人電腦裏面的文件了。 第
django 解決ajax 請求csrf跨域問題,解決403 forbidden
現象: 請求403 ,提示跨域 原因: 專案setting.py 中installed app 裡面有 'django.middleware.csrf.CsrfViewMiddleware', ###解決過程:檢視請求發現 cookie 有csrftoken 所以利用j
axios進行ajax請求得不到資料,cookie無法攜帶問題
這個坑也是很早之前踩過,今天做專案的時候居然忘了,怎麼都拿不到資料,果然好記性不如爛筆頭,決定寫篇部落格來祭奠下我的豬腦子: 原因可能就是你傳送請求的時候,需要設定cookie,然而你的cookie並沒有傳送到後端,這種情況要在配引數的
做了一個下拉載入,ajax請求裡總是載入失敗,url路徑該怎麼填寫,求原因
@TOC 歡迎使用Markdown編輯器 你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。 新的改變 我們對Markdown編輯器進行了
ajex請求後臺報錯400,但是後臺返回給前端值,並且在前端彈出
今天遇到一個問題,當前端請求我的後是時候,當請求報錯的時候,後臺報錯400,但是我的後臺同時返回的是有個資料的,後臺返回到前端的資料, 前端接收資料並顯示 最
表單序列化,jq中的serialize,ajax提交整個form表單,無需逐個拼寫json
</pre><pre name="code" class="html"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/x
java 獲取下一個字母(傳大寫返回大寫,傳小寫返回小寫)
public HA java array PE ret pan supper 返回 public static String getNextUpEn(String en){ char lastE = ‘a‘; char st = e
IHS啟動後無法訪問,沒有pid文件,沒有報錯
解決 alt his bsp each jre size 無法 報錯 IHS啟動之後 僅有一個進程如下 正常如下 error中沒有任何新的日誌--調了httpd.conf 中的日誌級別為 LogLevel debug,重啟IHS error日誌中: 查詢得知
使用 ResponseBodyAdvice 攔截Controller方法預設返回引數,統一處理返回值/響應體
使用 @ControllerAdvice & ResponseBodyAdvice 攔截Controller方法預設返回引數,統一處理返回值/響應體 1、Controller程式碼 以下是Controller查詢方法原始碼: /** * controller * * @au
Map裡面放資料,然後再把map放到list中,在把list轉換成json,然後再把json存到map裡面,最後使用Hash Key的方式,存入到redis中
部分程式碼如下: map.put("busi
中國城市程式碼json,省市二級聯動json
根據中國城市程式碼表整理的json檔案: level代表行政級別 code代表城市編碼 { "provinces": [ { "name":"北京市", "level":"1", "code":"1100", "cities
Java:簡述1000==1000返回false,100==100返回true
Java:簡述1000 = = 1000返回false,100 = = 100返回true 大家覺得如下程式碼的結果是什麼呢? public static void main(String[] args) { Integer a = 1000, b =
STM32+NRF24L01 傳送端,傳送資料,返回0x10,即一直返回最大重發次數值。但接收端能接收到資料。
現象:傳送端傳送資料,接收端能接收到。 但傳送端判斷為傳送失敗,檢視返回值為0X10。 即NRF24L01_TxPacket(tmp_buf)的值為0X10,TX_OK值為0X20,故雖然接收端能收到資料。但 傳送端顯示“傳送失敗” 深入檢視“NRF24L01_T
php 除錯微信介面時curl無返回值,file_get_contents有返回值的解決方法
在公司伺服器調式微信介面,使用curl獲取access_token完全沒有問題, 同樣的程式碼拿回家使用php內建webserver調試出現問題,curl沒有返回值,也沒報錯 原因是php內建webserver驗證了https的問題,把curl加入如下程式碼即可:
SourceTree提交時沒有暫存檔案,沒有內容可以提交解決
出現這種情況應該是和建立者的環境存在衝突,在SourceTree中點選設定,高階,編輯,在開啟的記事本中將這些檔案全部忽略# adcss-module/*assets/*node_modules/*co
演算法題目三:判斷陣列中任意三條邊能否組成一個三角形,若能返回1,不能返回0
演算法一:正確率90%,演算法效率分0% 演算法二:正確率,演算法效率均100% public class Triangle { public static void main(String