1. 程式人生 > >Shiro Ajax請求沒有許可權返回JSON,沒有登入返回JSON

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中的serializeajax提交整個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

中國城市程式碼json省市二級聯動json

根據中國城市程式碼表整理的json檔案: level代表行政級別 code代表城市編碼 { "provinces": [ { "name":"北京市", "level":"1", "code":"1100", "cities

Java:簡述1000==1000返回false100==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