最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springBoot前后端分離項目中shiro的302跳轉(zhuǎn)問題

 更新時間:2021年12月17日 11:40:05   作者:小羅的  
這篇文章主要介紹了springBoot前后端分離項目中shiro的302跳轉(zhuǎn)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

springBoot前后端分離項目shiro的302跳轉(zhuǎn)

項目是使用的springboot ,使用的shiro做的用戶鑒權(quán)。在前端請求時當(dāng)用戶信息失效,session失效的時候,shiro會重定向到配置的login.jsp 頁面,或者是自己配置的logUrl。

因是前后端分離項目,與靜態(tài)資源文件分離,固重定向后,接著會404。

經(jīng)過查找網(wǎng)上配置資料,發(fā)現(xiàn)302原因是

  • FormAuthenticationFilter中onAccessDenied 方法做了相應(yīng)處理。那知道問題所在,就可以有解決方了。
  • 重寫 onAccessDenied 方法,針對自己的業(yè)務(wù)做相應(yīng)處理,然后在加載過濾器配置的時候添加到配置中。

以下是代碼

增加類ShiroFormAuthenticationFilter 重新方法

package com.oilpay.wallet.shiro; 
import com.alibaba.fastjson.JSONObject;
import com.oilpay.wallet.interceptor.TokenInterceptor;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMethod;
 
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
 
/**
 *
 * 重寫權(quán)限驗證問題,登錄失效后返回狀態(tài)碼
 *
 */
public class ShiroFormAuthenticationFilter extends FormAuthenticationFilter { 
    Logger logger  = LoggerFactory.getLogger(TokenInterceptor.class); 
    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
        if (isLoginRequest(request, response)) {
            if (isLoginSubmission(request, response)) {
                if (logger.isTraceEnabled()) {
                    logger.trace("Login submission detected.  Attempting to execute login.");
                }
                return executeLogin(request, response);
            } else {
                if (logger.isTraceEnabled()) {
                    logger.trace("Login page view.");
                }
                //allow them to see the login page ;)
                return true;
            }
        } else {
            HttpServletRequest req = (HttpServletRequest)request;
            HttpServletResponse resp = (HttpServletResponse) response;
            if(req.getMethod().equals(RequestMethod.OPTIONS.name())) {
                resp.setStatus(HttpStatus.OK.value());
                return true;
            }
 
            if (logger.isTraceEnabled()) {
                logger.trace("Attempting to access a path which requires authentication.  Forwarding to the " +
                        "Authentication url [" + getLoginUrl() + "]");
            }
            //前端Ajax請求時requestHeader里面帶一些參數(shù),用于判斷是否是前端的請求
            String test= req.getHeader("test");
            if (test!= null || req.getHeader("wkcheck") != null) {
                //前端Ajax請求,則不會重定向
                resp.setHeader("Access-Control-Allow-Origin",  req.getHeader("Origin"));
                resp.setHeader("Access-Control-Allow-Credentials", "true");
                resp.setContentType("application/json; charset=utf-8");
                resp.setCharacterEncoding("UTF-8");
                PrintWriter out = resp.getWriter();
                JSONObject result = new JSONObject();
                result.put("message", "登錄失效");
                result.put("resultCode", 1000);
                out.println(result);
                out.flush();
                out.close();
            } else {
                saveRequestAndRedirectToLogin(request, response);
            }
            return false;
        }
    }
}

在過濾器配置中添加

@Bean(name="shiroFilter")
    public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") SecurityManager manager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(manager);
        //配置訪問權(quán)限
        LinkedHashMap<String, String> filterChainDefinitionMap=new LinkedHashMap<String, String>();
        filterChainDefinitionMap.put("/common/logout", "logout");
        filterChainDefinitionMap.put("/","anon");
        filterChainDefinitionMap.put("/common/login","anon");
 
        filterChainDefinitionMap.put("/common/*","anon");
        filterChainDefinitionMap.put("/imageVerifyCode/getCode", "anon");
        filterChainDefinitionMap.put("/sendVerifyCode/register", "anon");
        filterChainDefinitionMap.put("/sendVerifyCode/resetLoginPwd", "anon");
        filterChainDefinitionMap.put("/**", "authc"); //表示需要認(rèn)證才可以訪問
 
        LinkedHashMap<String, Filter> filtsMap=new LinkedHashMap<String, Filter>();
        filtsMap.put("authc",new ShiroFormAuthenticationFilter() );
        shiroFilterFactoryBean.setFilters(filtsMap);
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

至此,可以按照自己的需求做相應(yīng)處理。

關(guān)于shiro 總是302的問題

我的原因是使用了authc,由于autuc對應(yīng)的過濾器FormAuthenticationFilter中onAccessDenied方法返回的值都為false,所以訪問url時會一直進(jìn)行循環(huán)重定向,解決方案:重寫onAccessDenied方法,并注入到shiroFiter中。

附上shiro配置文件

<!-- shiroFilter -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
   <property name="securityManager" ref="securityManager" />
   <!-- 設(shè)定角色的登錄鏈接,這里為cas登錄頁面的鏈接可配置回調(diào)地址  -->
   <!-- 登錄地址 -->
   <property name="loginUrl" value="/login.html"/>
   <!-- 登錄后跳轉(zhuǎn)到業(yè)務(wù)頁面 -->
   <property name="successUrl" value="/index.do"/>
   <!-- 錯誤頁面 -->
   <property name="unauthorizedUrl" value="/denied.html"/>
   <property name="filters">
      <map>
         <!--將重寫了的FormAuthenticationFilter.onAccessDenied方法的類注入到其中-->
         <entry key="authc" value-ref="formAuthenticationFilter"></entry>
      </map>
   </property>
   <property name="filterChainDefinitions">
      <value>
          /login.html=anon
         <!--配置靜態(tài)資源-->
         /js/**=anon
         /templates/**=anon
         /assets/**=anon
         /css/**=anon
         <!--權(quán)限設(shè)置-->
         /index.do=authc
         /user/login.do=anon
         /**=authc
        </value>
   </property>
</bean>
<!-- 重寫FormAuthenticationFilter的onAccessDenied方法的自定義過濾器 -->
<bean id="formAuthenticationFilter" class="com.jd.risk.giasys.service.realm.filter.MyFilter" />

重寫onAccessDenied方法

package com.jd.risk.giasys.service.realm.filter;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
 * Created by jianghaisong on 2017/12/17.
 */
public class MyFilter extends FormAuthenticationFilter{
    private Logger log = LoggerFactory.getLogger(MyFilter.class);
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
       //進(jìn)行重寫,業(yè)務(wù)邏輯
    }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于maven的三種packaging方式

    基于maven的三種packaging方式

    這篇文章主要介紹了maven的三種packaging方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 詳解Java中雪花算法的實現(xiàn)

    詳解Java中雪花算法的實現(xiàn)

    雪花算法是一種分布式的id生成算法。原理是將long分成若干個區(qū)段分別管理。本文將利用Java簡單的實現(xiàn)雪花算法,感興趣的可以了解一下
    2022-12-12
  • idea啟動報錯:Command line is too long問題

    idea啟動報錯:Command line is too long問題

    在使用IDEA時,若遇到"Commandlineistoolong"錯誤,通常是因為命令行長度超限,這是因為IDEA通過命令行或文件將classpath傳遞至JVM,操作系統(tǒng)對命令行長度有限制,解決方法是切換至動態(tài)類路徑,通過修改項目的workspace.xml文件
    2024-09-09
  • JavaWeb學(xué)習(xí)過程之MVC查詢模式詳解

    JavaWeb學(xué)習(xí)過程之MVC查詢模式詳解

    這篇文章主要介紹了JavaWeb學(xué)習(xí)過程之MVC查詢模式詳解的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • SPRING BOOT啟動命令參數(shù)及源碼詳析

    SPRING BOOT啟動命令參數(shù)及源碼詳析

    這篇文章主要給大家介紹了關(guān)于SPRING BOOT啟動命令參數(shù)及源碼分析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SPRING BOOT具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 教你如何用Java根據(jù)日期生成流水號

    教你如何用Java根據(jù)日期生成流水號

    這篇文章主要介紹了教你如何用Java根據(jù)日期生成流水號,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • java中@ConfigurationProperties失效的問題解決

    java中@ConfigurationProperties失效的問題解決

    在Java開發(fā)中,使用@ConfigurationProperties注解讀取配置文件時,如果配置類中的屬性設(shè)置為static,將無法正確讀取配置值,本文就來介紹一下具體解決方法,感興趣的可以了解一下
    2024-09-09
  • 寫了兩年代碼之后再來談一談Spring中的Bean

    寫了兩年代碼之后再來談一談Spring中的Bean

    這篇文章主要介紹了寫了兩年代碼之后再來看看Spring中的Bean,這里列出四種常用的添加Bean的方式,介紹最基本的@Bean注解,@Bean注解聲明這個類是一個Bean,需要的朋友可以參考下
    2021-10-10
  • springboot整合jcasbin權(quán)限管理

    springboot整合jcasbin權(quán)限管理

    jcasbin的權(quán)限控制非常簡單,本文就來介紹一下springboot整合jcasbin權(quán)限管理,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Java中Map的computeIfAbsent方法詳解

    Java中Map的computeIfAbsent方法詳解

    這篇文章主要介紹了Java的Map中computeIfAbsent方法詳解,在jdk1.8中Map接口新增了一個computeIfAbsent方法,這是Map接口中的默認(rèn)實現(xiàn)該方法是首先判斷緩存Map中是否存在指定的key的值,如果不存在,會調(diào)用mappingFunction(key)計算key的value,需要的朋友可以參考下
    2023-11-11

最新評論

阳西县| 福贡县| 葵青区| 南陵县| 淳安县| 安多县| 淳安县| 崇阳县| 衢州市| 望都县| 弥渡县| 丹东市| 沁水县| 开鲁县| 屏山县| 哈尔滨市| 许昌县| 库尔勒市| 长寿区| 洪湖市| 汉源县| 兴义市| 中江县| 旺苍县| 贞丰县| 封开县| 鸡泽县| 三河市| 博湖县| 炉霍县| 虞城县| 瓦房店市| 宜州市| 金寨县| 保山市| 宝兴县| 通州市| 双桥区| 巫山县| 军事| 丘北县|