1. 程式人生 > >SpringMVC+Shiro整合配置檔案詳解

SpringMVC+Shiro整合配置檔案詳解

在專案中xml檔案的配置是必不可少的,特別是SpringMVC框架。但是幾乎所有專案的配置都是大同小異,很多人都是直接複製黏貼了事,不少人對其具體含義及用途都不甚全知。本片文章將正對專案中常用的框架SpringMVC+Shiro進行整合,並對其中關鍵和部分常識性問題進行註釋講解,方便在以後的專案編寫中查閱和熟悉。

1、web.xml檔案的配置

所有javaweb專案第一步要做的就是對web.xml檔案進行配置。


<?xml version="1.0" encoding="UTF-8"?>  
<web-appversion="2.5"xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- Web容器載入順序ServletContext--context-param--listener--filter--servlet --> <!-- 指定Spring的配置檔案 --> <!-- 否則Spring會預設從WEB-INF下尋找配置檔案,contextConfigLocation屬性是Spring內部固定的 -->
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:/spring-context*.xml</param-value> </context-param> <!-- 防止發生java.beans.Introspector記憶體洩露,應將它配置在ContextLoaderListener的前面 --> <listener
>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <!-- 例項化Spring容器 --> <!-- 應用啟動時,該監聽器被執行,它會讀取Spring相關配置檔案,其預設會到WEB-INF中查詢applicationContext.xml --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 解決亂碼問題 --> <!-- forceEncoding預設為false,此時效果可大致理解為request.setCharacterEncoding("UTF-8") --> <!-- forceEncoding=true後,可大致理解為request.setCharacterEncoding("UTF-8")和response.setCharacterEncoding("UTF-8") --> <filter> <filter-name>SpringEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>SpringEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置Shiro過濾器,先讓Shiro過濾系統接收到的請求 --> <!-- 這裡filter-name必須對應applicationContext.xml中定義的<bean id="shiroFilter"/> --> <!-- 使用[/*]匹配所有請求,保證所有的可控請求都經過Shiro的過濾 --> <!-- 通常會將此filter-mapping放置到最前面(即其他filter-mapping前面),以保證它是過濾器鏈中第一個起作用的 --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <!-- 該值預設為false,表示生命週期由SpringApplicationContext管理,設定為true則表示由ServletContainer管理 --> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- SpringMVC核心分發器 --> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:/spring-mvc*.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- Session超時30分鐘(零或負數表示會話永不超時)--> <!-- <session-config> <session-timeout>30</session-timeout> </session-config> --> <!-- 預設歡迎頁 --> <!-- Servlet2.5中可直接在此處執行Servlet應用,如<welcome-file>servlet/InitSystemParamServlet</welcome-file> --> <!-- 這裡使用了SpringMVC提供的<mvc:view-controller>標籤,實現了首頁隱藏的目的,詳見applicationContext.xml --> <!-- <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> --> <error-page> <error-code>405</error-code> <location>/WEB-INF/405.html</location> </error-page> <error-page> <error-code>404</error-code> <location>/WEB-INF/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/WEB-INF/500.jsp</location> </error-page> <error-page> <exception-type>java.lang.Throwable</exception-type> <location>/WEB-INF/500.jsp</location> </error-page> </web-app>

2、spring-mvc.xml檔案的配置

這個檔案主要是對springmvc的相關配置。


<?xml version="1.0" encoding="UTF-8"?>  
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans  
                        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd  
                        http://www.springframework.org/schema/mvc  
                        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd  
                        http://www.springframework.org/schema/context  
                        http://www.springframework.org/schema/context/spring-context-3.2.xsd">  
    <!-- 它背後註冊了很多用於解析註解的處理器,其中就包括<context:annotation-config/>配置的註解所使用的處理器 -->  
    <!-- 所以配置了<context:component-scan base-package="">之後,便無需再配置<context:annotation-config> -->  
    <context:component-scanbase-package="com.papio"/>  
      
    <!-- 啟用SpringMVC的註解功能,它會自動註冊HandlerMapping、HandlerAdapter、ExceptionResolver的相關例項 -->  
    <mvc:annotation-driven/>  
  
    <!-- 配置SpringMVC的檢視解析器 -->  
    <!-- 其viewClass屬性的預設值就是org.springframework.web.servlet.view.JstlView -->  
    <beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">  
        <propertyname="prefix"value="/"/>  
        <propertyname="suffix"value=".jsp"/>  
    </bean>  
  
    <!-- 預設訪問跳轉到登入頁面(即定義無需Controller的url<->view直接對映) -->  
    <mvc:view-controllerpath="/"view-name="forward:/login.jsp"/>  
  
    <!-- 由於web.xml中設定是:由SpringMVC攔截所有請求,於是在讀取靜態資原始檔的時候就會受到影響(說白了就是讀不到) -->  
    <!-- 經過下面的配置,該標籤的作用就是:所有頁面中引用"/js/**"的資源,都會從"/resources/js/"裡面進行查詢 -->  
    <!-- 我們可以訪問http://IP:8080/xxx/js/my.css和http://IP:8080/xxx/resources/js/my.css對比出來 -->  
    <mvc:resourcesmapping="/js/**"location="/resources/js/"/>  
    <mvc:resourcesmapping="/css/**"location="/resources/css/"/>  
    <mvc:resourcesmapping="/WEB-INF/**"location="/WEB-INF/"/>  
  
    <!-- SpringMVC在超出上傳檔案限制時,會丟擲org.springframework.web.multipart.MaxUploadSizeExceededException -->  
    <!-- 該異常是SpringMVC在檢查上傳的檔案資訊時丟擲來的,而且此時還沒有進入到Controller方法中 -->  
    <beanclass="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
        <propertyname="exceptionMappings">  
            <props>  
                <!-- 遇到MaxUploadSizeExceededException異常時,自動跳轉到/WEB-INF/error_fileupload.jsp頁面 -->  
                <propkey="org.springframework.web.multipart.MaxUploadSizeExceededException">WEB-INF/error_fileupload</prop>  
                <!-- 處理其它異常(包括Controller丟擲的) -->  
                <propkey="java.lang.Throwable">WEB-INF/500</prop>  
            </props>  
        </property>  
    </bean>  
</beans>

3、spring-context-shiro.xml檔案配置

這個檔案是對shiro許可權框架的配置。


<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-4.0.xsd"default-lazy-init="true">
    <!-- 繼承自AuthorizingRealm的自定義Realm,即指定Shiro驗證使用者登入的類為自定義的ShiroDbRealm.java -->  
    <beanid="myRealm"class="com.papio.realm.MyRealm"/>  
  
    <!-- 定義快取管理器 --> 
   <bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager" /> 

   <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
       <!-- session的失效時長,單位毫秒 -->
     <property name="globalSessionTimeout" value="600000"/>
      <!-- 刪除失效的session -->
     <property name="deleteInvalidSessions" value="true"/>
   </bean>

    <!-- Shiro預設會使用Servlet容器的Session,可通過sessionMode屬性來指定使用Shiro原生Session -->  
    <!-- 即<property name="sessionMode" value="native"/>,詳細說明見官方文件 -->  
    <!-- 這裡主要是設定自定義的單Realm應用,若有多個Realm,可使用'realms'屬性代替 -->  
    <beanid="securityManager"class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
        <propertyname="realm"ref="myRealm"/>
        <!-- 使用配置的快取管理器 --> 
     <property name="cacheManager" ref="cacheManager"></property> 
     <!-- 會話管理 -->
     <property name="sessionManager" ref="sessionManager" />
  </bean>  
  
    <!-- Shiro主過濾器本身功能十分強大,其強大之處就在於它支援任何基於URL路徑表示式的、自定義的過濾器的執行 -->  
    <!-- Web應用中,Shiro可控制的Web請求必須經過Shiro主過濾器的攔截,Shiro對基於Spring的Web應用提供了完美的支援 -->  
    <beanid="shiroFilter"class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
        <!-- Shiro的核心安全介面,這個屬性是必須的 -->  
        <propertyname="securityManager"ref="securityManager"/>  
        <!-- 要求登入時的連結(可根據專案的URL進行替換),非必須的屬性,預設會自動尋找Web工程根目錄下的"/login.jsp"頁面 -->  
        <propertyname="loginUrl"value="/"/>  
        <!-- 登入成功後要跳轉的連線(本例中此屬性用不到,因為登入成功後的處理邏輯在LoginController裡硬編碼為main.jsp了) -->  
        <!-- <property name="successUrl" value="/system/main"/> -->  
        <!-- 使用者訪問未對其授權的資源時,所顯示的連線 -->  
        <!-- 若想更明顯的測試此屬性可以修改它的值,如unauthor.jsp,然後用[玄玉]登入後訪問/admin/listUser.jsp就看見瀏覽器會顯示unauthor.jsp -->  
        <propertyname="unauthorizedUrl"value="/"/>  
        <!-- Shiro連線約束配置,即過濾鏈的定義 -->  
        <!-- 此處可配合這篇文章來理解各個過濾連的作用http://blog.csdn.net/jadyer/article/details/12172839 -->  
        <!-- 下面value值的第一個'/'代表的路徑是相對於HttpServletRequest.getContextPath()的值來的 -->  
        <!-- anon:它對應的過濾器裡面是空的,什麼都沒做,這裡.do和.jsp後面的*表示引數,比方說login.jsp?main這種 -->  
        <!-- authc:該過濾器下的頁面必須驗證後才能訪問,它是Shiro內建的一個攔截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter -->  
        <propertyname="filterChainDefinitions">  
            <value>  
                /mydemo/login=anon  
                /mydemo/getVerifyCodeImage=anon  
                /main**=authc  
                /user/info**=authc  
                /admin/listUser**=authc,perms[admin:manage]  
            </value>  
        </property>  
    </bean>  
  
    <!-- 保證實現了Shiro內部lifecycle函式的bean執行 -->  
    <beanid="lifecycleBeanPostProcessor"class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>  
  
    <!-- 開啟Shiro的註解(如@RequiresRoles,@RequiresPermissions),需藉助SpringAOP掃描使用Shiro註解的類,並在必要時進行安全邏輯驗證 -->  
    <!-- 配置以下兩個bean即可實現此功能 -->  
    <!-- Enable Shiro Annotations for Spring-configured beans. Only run after the lifecycleBeanProcessor has run -->  
    <!-- 由於本例中並未使用Shiro註解,故註釋掉這兩個bean(個人覺得將許可權通過註解的方式硬編碼在程式中,檢視起來不是很方便,沒必要使用) -->  
    <!--   
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>  
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">  
        <property name="securityManager" ref="securityManager"/>  
    </bean>  
     -->  
</beans>  

4、MyRealm.java------自定義的Realm類


package com.papio.realm;  
  
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;  
import org.apache.commons.lang3.builder.ToStringStyle;  
import org.apache.shiro.SecurityUtils;  
import org.apache.shiro.authc.AuthenticationException;  
import org.apache.shiro.authc.AuthenticationInfo;  
import org.apache.shiro.authc.AuthenticationToken;  
import org.apache.shiro.authc.SimpleAuthenticationInfo;  
import org.apache.shiro.authc.UsernamePasswordToken;  
import org.apache.shiro.authz.AuthorizationInfo;  
import org.apache.shiro.authz.SimpleAuthorizationInfo;  
import org.apache.shiro.realm.AuthorizingRealm;  
import org.apache.shiro.session.Session;  
import org.apache.shiro.subject.PrincipalCollection;  
import org.apache.shiro.subject.Subject;  
  
/** 
 * 自定義的指定Shiro驗證使用者登入的類 
 * @see 在本例中定義了2個使用者:papio和big,papio具有admin角色和admin:manage許可權,big不具有任何角色和許可權 
 * @create
 * @author
 */  
public classMyRealmextendsAuthorizingRealm{  
    /** 
     * 為當前登入的Subject授予角色和許可權 
     * @see 經測試:本例中該方法的呼叫時機為需授權資源被訪問時 
     * @see 經測試:並且每次訪問需授權資源時都會執行該方法中的邏輯,這表明本例中預設並未啟用AuthorizationCache 
     * @see 個人感覺若使用了Spring3.1開始提供的ConcurrentMapCache支援,則可靈活決定是否啟用AuthorizationCache 
     * @see 比如說這裡從資料庫獲取許可權資訊時,先去訪問Spring3.1提供的快取,而不使用Shior提供的AuthorizationCache 
     */  
    @Override  
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals){  
        //獲取當前登入的使用者名稱,等價於(String)principals.fromRealm(this.getName()).iterator().next()  
        String currentUsername = (String)super.getAvailablePrincipal(principals);  
//      List<String> roleList = new ArrayList<String>();  
//      List<String> permissionList = new ArrayList<String>();  
//      //從資料庫中獲取當前登入使用者的詳細資訊  
//      User user = userService.getByUsername(currentUsername);  
//      if(null != user){  
//          //實體類User中包含有使用者角色的實體類資訊  
//          if(null!=user.getRoles() && user.getRoles().size()>0){  
//              //獲取當前登入使用者的角色  
//              for(Role role : user.getRoles()){  
//                  roleList.add(role.getName());  
//                  //實體類Role中包含有角色許可權的實體類資訊  
//                  if(null!=role.getPermissions() && role.getPermissions().size()>0){  
//                      //獲取許可權  
//                      for(Permission pmss : role.getPermissions()){  
//                          if(!StringUtils.isEmpty(pmss.getPermission())){  
//                              permissionList.add(pmss.getPermission());  
//                          }  
//                      }  
//                  }  
//              }  
//          }  
//      }else{  
//          throw new AuthorizationException();  
//      }  
//      //為當前使用者設定角色和許可權  
//      SimpleAuthorizationInfo simpleAuthorInfo = new SimpleAuthorizationInfo();  
//      simpleAuthorInfo.addRoles(roleList);  

            
           

相關推薦

SpringMVC+Shiro整合配置檔案

在專案中xml檔案的配置是必不可少的,特別是SpringMVC框架。但是幾乎所有專案的配置都是大同小異,很多人都是直接複製黏貼了事,不少人對其具體含義及用途都不甚全知。本片文章將正對專案中常用的框架SpringMVC+Shiro進行整合,並對其中關鍵和部分常識性問題進行註釋

Spring4+MyBatis3整合配置檔案

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mybatis="http://mybatis.org/schema/mybat

轉:ssm spring+springmvc+mybatis中的xml配置檔案

這幾天一直在整合SSM框架,雖然網上有很多已經整合好的,但是對於裡面的配置檔案並沒有進行過多的說明,很多人知其然不知其所以然,經過幾天的搜尋和整理,今天總算對其中的XML配置檔案有了一定的瞭解,所以拿出來一起分享一下,希望有不足的地方大家批評指正~~~ 首先   這篇文章暫時只對框架中所要用到的配

SpringMVC配置檔案

1.<context:annotation-config/> 它的作用是隱式的向Spring容器註冊 AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, PersistenceAnnotationBea

RabbitMQ整合Spring配置檔案

一、rabbitmq 配置檔案 在web 專案開發過程中,一般分為生產者配置檔案和消費者配置檔案。 一、準備工作 安裝好rabbitmq,並在專案中增加配置檔案 rabbit.properties 內容如下: rmq.ip=192.188.113.114 rmq.port=

SpringMVC配置檔案:<context:annotation-config/>和<context:component-scan base-package=""/>和<mvc:annotation-driven /> Spring配置

原文地址:https://www.cnblogs.com/lcngu/p/5080702.html Spring配置檔案詳解:<context:annotation-config/>和<context:component-scan base-package=""/>和<mvc:

SSM整合配置檔案

整合思路 1、Dao層: mybatis整合spring,通過spring管理SqlSessionFactory、mapper代理物件。需要mybatis和spring的整合包。 整合內容 對應工程 Pojo Taotao-mangaer-pojo Map

ssm整合最全配置檔案版(在idea下整合

先放目錄結構,便於清晰瞭解整個專案由簡單的到複雜的進行排列:SqlMapConfig.xml:<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPEconfigurationPUBLIC"-//mybatis.or

ssm整合最全配置檔案

原文地址:https://blog.csdn.net/ln1593570p/article/details/80718205   SqlMapConfig.xml: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP

maven安裝和eclipse整合以及Maven之setting.xml配置檔案

由於maven需要JDK的支援,所以在安裝maven之前請確保電腦上已經安裝了JDK,且配置好了環境變數,具體的JDK的安裝及配置可自行百度。下面進入安裝 一、maven安裝 前面已經下載了相應版本的maven,且已經配置好JDK的環境;     1

solr(一)配置檔案整合zookeeper叢集

一 . 概念   1) 全文檢索 :  先對非結構化資料建立索引, 在對索引進行搜尋的過程就是全文檢索  2) 方法 : 順序索引(windows檔案查詢, linux的grep命令)      索引 : 從非結構化資料中提取然後重新組織的資訊    (eg : 字典的字是

ssm spring+springmvc+mybatis中的xml配置檔案

這幾天一直在整合SSM框架,雖然網上有很多已經整合好的,但是對於裡面的配置檔案並沒有進行過多的說明,很多人知其然不知其所以然,經過幾天的搜尋和整理,今天總算對其中的XML配置檔案有了一定的瞭解,所以拿出來一起分享一下,希望有不足的地方大家批評指正~~~ 首先   這篇文章暫時只對框架中所要用到的

SSH三大框架整合後的配置檔案

學習三大框架Struts2 、 Hibernate 、 Spring時,涉及到三大框架的配置檔案以及整合。今天就來詳細寫寫三大框架配置檔案的詳細內容。 一 Spring的applicationContext.xml中的配置: <?xmlversion="1.0"

最新的三大框架整合配置檔案

一:spring.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://

三大框架(ssh)學習——配置檔案(一)

配置檔案詳解 指定web應用預設字符集 <constant name="struts.i18n.encoding" value="gbk" /> 此配置相當於: request.setCharacterEncoding(“gbk”); r

三大框架(ssh)學習——配置檔案(二)

多配置檔案實現 專案經常需要多人協作開發,但是如果大家都是用同一個struts.xml檔案,會互相影響不利於開發的正常開展。這樣,我們可以通過<include>元素指定多個配置檔案。 可以在src下面建立多個struts配置檔案。然後再struts.xml中分別引入: str

Nginx配置配置檔案

文章目錄 配置檔案 nginx.conf配置檔案詳解 用於除錯、定位問題的配置引數 正常執行必備的配置引數 優化效能的配置引數 事件相關配置 Fastcgi相關配置引數 常需要調整的引數 nginx作為web伺服器時使

Hibernate_day01---Hibernate環境搭建、配置檔案、核心api介紹

JavaEE三層結構對應的框架 1) web層:struts2框架 2) service層:spring框架 3)dao層:hibernate框架 -- 對資料庫進行crud操作 什麼是框架: 可複用的設計構件 作用:可以少寫一部分程式碼。使用框架寫程式,會幫我們實現一部

scrapy settings配置檔案

# -*- coding: utf-8 -*- # Scrapy settings for step8_king project # # For simplicity, this file contains only settings considered important or # comm

keepalived介紹及配置檔案

keepalived介紹 Keepalived軟體起初是專為LVS負載均衡軟體設計的,用來管理並監控LVS集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的VRRP功能。因此,Keepalived除了能夠管理LVS軟體外,還可以作為其他服務(例如:Nginx、Hapr