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

shiro整合springboot前后端分離

 更新時間:2019年12月16日 09:57:38   作者:有夢想的咸魚xx  
這篇文章主要介紹了shiro整合springboot前后端分離,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了shiro整合springboot前后端分離的具體代碼,供大家參考,具體內(nèi)容如下

1、shiro整合springboot的配置

package com.hisi.config;
 
import java.util.LinkedHashMap;
import java.util.Map;
 
import javax.servlet.Filter;
 
import org.apache.shiro.session.mgt.eis.MemorySessionDAO;
import org.apache.shiro.session.mgt.eis.SessionDAO;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
 
import com.hisi.shiro.LoginAuthorizationFilter;
import com.hisi.shiro.RestFilter;
import com.hisi.shiro.UserRealm;
 
/**
 * shiro權(quán)限管理的配置
 * @author xuguoqin
 * @date 2018年5月4日
 * @version 1.0
 */
@Configuration
public class ShiroConfig {
 
 /**
 * 安全管理器
 * @param realm
 * @return
 */
 @Bean
 public DefaultWebSecurityManager securityManager(){
 DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
 securityManager.setRealm(userRealm());
 securityManager.setSessionManager(sessionManager());
 return securityManager;
 }
 
 /**
 * Realm配置
 * @return
 */
 @Bean
 public UserRealm userRealm(){
 return new UserRealm();
 }
 
 /**
 * SessionDAO配置
 * @return
 */
 @Bean
 public SessionDAO sessionDAO(){
 return new MemorySessionDAO();
 }
 
 /**
 * sessionManager配置
 * @param sessionDAO
 * @return
 */
 @Bean
 public DefaultWebSessionManager sessionManager(){
 DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
 sessionManager.setSessionDAO(sessionDAO());
 return sessionManager;
 }
 
 /**
 * shiroFilter配置
 * @param securityManager
 * @return
 */
 @Bean
 public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager){
 
 ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
 shiroFilter.setSecurityManager(securityManager());
 Map<String, Filter> filters = new LinkedHashMap<String, Filter>();
 filters.put("token", new LoginAuthorizationFilter());
 filters.put("corsFilter", new RestFilter());
 shiroFilter.setFilters(filters);
 Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
 filterChainDefinitionMap.put("/user/login", "corsFilter,anon");
 filterChainDefinitionMap.put("/user/logout", "corsFilter,anon");
 filterChainDefinitionMap.put("/user/**", "corsFilter,token");
 shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);
 return shiroFilter;
 }
 
 /**
   * 保證實現(xiàn)了Shiro內(nèi)部lifecycle函數(shù)的bean執(zhí)行
   */
  @Bean
  public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
    return new LifecycleBeanPostProcessor();
  }
 
  /**
   * 啟用shrio授權(quán)注解攔截方式,AOP式方法級權(quán)限檢查
   */
  @Bean
  @DependsOn(value = "lifecycleBeanPostProcessor") //依賴其他bean的初始化
  public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
    return new DefaultAdvisorAutoProxyCreator();
  }
 
 /**
 * 加入注解的使用,不加入這個注解不生效 使用shiro框架提供的切面類,用于創(chuàng)建代理對象 
 * @param securityManager
 * @return
 */
  @Bean
  public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
    AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
    authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
    return authorizationAttributeSourceAdvisor;
  }
  
  
}

2、這里配置的兩個過濾器RestFilter和LoginAuthorizationFilter,RestFilter是用于解決前后端分離時的跨域問題,服務(wù)端在響應(yīng)頭設(shè)置可以接受的請求參數(shù)

package com.hisi.shiro;
 
import java.io.IOException;
import java.util.Optional;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * 前后端分離RESTful接口過濾器
 * 
 * @author xuguoqin
 *
 */
public class RestFilter implements Filter {
 
 @Override
 public void init(FilterConfig filterConfig) throws ServletException {
 
 }
 
 @Override
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  throws IOException, ServletException {
 HttpServletRequest req = null;
 if (request instanceof HttpServletRequest) {
  req = (HttpServletRequest) request;
 }
 HttpServletResponse res = null;
 if (response instanceof HttpServletResponse) {
  res = (HttpServletResponse) response;
 }
 if (req != null && res != null) {
  //設(shè)置允許傳遞的參數(shù)
  res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
  //設(shè)置允許帶上cookie
  res.setHeader("Access-Control-Allow-Credentials", "true");
  String origin = Optional.ofNullable(req.getHeader("Origin")).orElse(req.getHeader("Referer"));
  //設(shè)置允許的請求來源
  res.setHeader("Access-Control-Allow-Origin", origin);
  //設(shè)置允許的請求方法
  res.setHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
 }
 chain.doFilter(request, response);
 }
 
 @Override
 public void destroy() {
 
 }
 
}

前者ajax請求的時候應(yīng)該帶上參數(shù)

$.ajax({
type: "GET",
url: url,
xhrFields: {
  withCredentials: true // 攜帶跨域cookie
},
processData: false,
success: function(data) {
  console.log(data); 
}
});

3、LoginAuthorizationFilter主要是對未登錄的用戶進(jìn)行過濾然后返回json數(shù)據(jù)給前端,之前遇到的問題就是shiro配置的loginUrl會導(dǎo)致出現(xiàn)302的問題,在前后端分離的項目中,頁面的跳轉(zhuǎn)應(yīng)該由前端來進(jìn)行控制,這里前端使用的是vue框架,我需要對shiro中未登錄的過濾器FormAuthenticationFilter進(jìn)行重構(gòu)

package com.hisi.shiro;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Set;
 
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.CollectionUtils;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;
import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
 
import com.alibaba.fastjson.JSONObject;
import com.commons.model.YfpjResult;
import com.hisi.mapper.HisiUserMapper;
import com.hisi.model.HisiUser;
import com.hisi.util.Constant;
import com.hisi.util.UserAuthStatusEnum;
 
/**
 * shiro未登錄反回狀態(tài)碼
 * @author xuguoqin
 * @date 2018年5月10日
 * @version 1.0
 */
public class LoginAuthorizationFilter extends FormAuthenticationFilter {
 
 /**
 * 這個方法是未登錄需要執(zhí)行的方法
 */
 @Override
 protected boolean onAccessDenied(ServletRequest request, 
      ServletResponse response) throws IOException {
 
 HttpServletRequest httpRequest = (HttpServletRequest) request; 
    HttpServletResponse httpResponse = (HttpServletResponse) response; 
 
    Subject subject = getSubject(request, response); 
    if (subject.getPrincipal() == null) { 
     //設(shè)置響應(yīng)頭
 httpResponse.setCharacterEncoding("UTF-8");
 httpResponse.setContentType("application/json");
 //設(shè)置返回的數(shù)據(jù)
 YfpjResult result = YfpjResult.build(UserAuthStatusEnum.UNLOGIN.getCode(), UserAuthStatusEnum.UNLOGIN.getMsg());
 //寫回給客戶端
 PrintWriter out = httpResponse.getWriter();
 out.write(JSONObject.toJSONString(result));
 //刷新和關(guān)閉輸出流
 out.flush();
 out.close();
    } else { 
     //設(shè)置響應(yīng)頭
   httpResponse.setCharacterEncoding("UTF-8");
   httpResponse.setContentType("application/json");
   //設(shè)置返回的數(shù)據(jù)
   YfpjResult result = YfpjResult.build(UserAuthStatusEnum.UNAUTH.getCode(), UserAuthStatusEnum.UNAUTH.getMsg());
   //寫回給客戶端
   PrintWriter out = httpResponse.getWriter();
   out.write(JSONObject.toJSONString(result));
   //刷新和關(guān)閉輸出流
   out.flush();
   out.close();
    } 
    return false; 
 }
}

4.以后在進(jìn)行前后端分離的項目開發(fā)的時候,可以前端封裝一個允許帶cookie的ajax請求,同時封裝一個統(tǒng)一的未登錄或者未授權(quán)狀態(tài)碼的判斷

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring?boot配置dubbo方式(properties)

    spring?boot配置dubbo方式(properties)

    這篇文章主要介紹了spring?boot配置dubbo方式(properties),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Java多線程 中斷機(jī)制及實例詳解

    Java多線程 中斷機(jī)制及實例詳解

    這篇文章主要介紹了Java多線程 中斷機(jī)制及實例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Java設(shè)計模式之抽象工廠模式AbstractFactoryPattern詳解

    Java設(shè)計模式之抽象工廠模式AbstractFactoryPattern詳解

    這篇文章主要介紹了Java設(shè)計模式之抽象工廠模式AbstractFactoryPattern詳解,抽象工廠模式是一種軟件開發(fā)設(shè)計模式,抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨(dú)的工廠封裝起來,需要的朋友可以參考下
    2023-10-10
  • java 遍歷Map及Map轉(zhuǎn)化為二維數(shù)組的實例

    java 遍歷Map及Map轉(zhuǎn)化為二維數(shù)組的實例

    這篇文章主要介紹了java 遍歷Map及Map轉(zhuǎn)化為二維數(shù)組的實例的相關(guān)資料,希望通過本文能幫助到大家,實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08
  • Win11系統(tǒng)下載安裝java的詳細(xì)過程

    Win11系統(tǒng)下載安裝java的詳細(xì)過程

    這篇文章主要介紹了Win11如何下載安裝java,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • SpringBoot 搭建架構(gòu)5種方法示例詳解

    SpringBoot 搭建架構(gòu)5種方法示例詳解

    SpringBoot是基于Spring框架的便捷開發(fā)框架,通過約定優(yōu)于配置實現(xiàn)快速構(gòu)建獨(dú)立應(yīng)用,文章介紹了五種搭建SpringBoot項目的方法,包括使用IntelliJ IDEA、Spring官網(wǎng)、阿里云官網(wǎng)以及將現(xiàn)有Maven項目轉(zhuǎn)換為SpringBoot項目,感興趣的朋友跟隨小編一起看看吧
    2025-03-03
  • 手?jǐn)]一個Spring?Boot?Starter并上傳到Maven中央倉庫

    手?jǐn)]一個Spring?Boot?Starter并上傳到Maven中央倉庫

    本文主要介紹了手?jǐn)]一個Spring?Boot?Starter并上傳到Maven中央倉庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Java servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系

    Java servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系

    這篇文章主要介紹了Java servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • intelliJ idea 2023 配置Tomcat 8圖文教程

    intelliJ idea 2023 配置Tomcat 8圖文教程

    這篇文章主要介紹了intelliJ idea 2023 配置Tomcat 8教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • Java 動態(tài)數(shù)組的實現(xiàn)示例

    Java 動態(tài)數(shù)組的實現(xiàn)示例

    Java動態(tài)數(shù)組是一種可以任意伸縮數(shù)組長度的對象,本文主要介紹了Java 動態(tài)數(shù)組的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論

汉川市| 文化| 夹江县| 封开县| 多伦县| 武强县| 包头市| 交城县| 苗栗县| 财经| 秦皇岛市| 司法| 墨脱县| 焉耆| 天柱县| 蚌埠市| 玉田县| 津市市| 肥城市| 三台县| 霍邱县| 万安县| 军事| 南京市| 四会市| 石屏县| 宁蒗| 华蓥市| 资阳市| 蒲江县| 丽江市| 玉门市| 新巴尔虎左旗| 同江市| 平远县| 错那县| 二手房| 宿州市| 苏尼特左旗| 当阳市| 娱乐|