idea使用maven從0整合ssm+shiro

  • 2019 年 10 月 4 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/qq_37933685/article/details/80379301

個人部落格:https://suveng.github.io/blog/​​​​​​​

idea使用maven從0整合ssm+shiro

1. 搭建環境

idea2017

maven3

jdk1.8

2. 整合ssm

  1. 首先新建一個maven工程,空的也無所謂,構建目錄結構,如圖1.
圖1
圖2

目錄搭建好了,可以開始整合ssm了。 首先把jar給導入,maven就是幫我們干這個事情的。除了jar包的依賴管理,還有編譯的一些配置可以設置。我把我的maven的pom.xml給貼上來吧。如果不知道怎麼弄maven,你可以先去看一下idea 配置maven的blog。如果是eclipse的話,請你走吧,我試過幫我同學弄,出現很多問題,比如xsd重複這些,如果你是新手eclipse和idea都不熟悉,你還是下載idea吧。然後邊百度邊使用idea。

   <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"           xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">      <modelVersion>4.0.0</modelVersion>      <groupId>com.su</groupId>      <artifactId>ssm</artifactId>      <packaging>war</packaging>      <version>1.0-SNAPSHOT</version>      <name>ssm Maven Webapp</name>      <url>http://maven.apache.org</url>      <properties>          <spring.version>4.1.4.RELEASE</spring.version>          <mybatis.version>3.2.8</mybatis.version>          <slf4j.version>1.7.7</slf4j.version>          <log4j.version>1.2.17</log4j.version>          <quartz.version>2.2.2</quartz.version>      </properties>          <dependencies>          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-core</artifactId>              <version>${spring.version}</version>          </dependency>          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-context</artifactId>              <version>${spring.version}</version>          </dependency>          <!-- 添加spring-tx包 -->          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-tx</artifactId>              <version>${spring.version}</version>          </dependency>          <!-- 添加spring-jdbc包 -->          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-jdbc</artifactId>              <version>${spring.version}</version>          </dependency>          <!-- 為了方便進行單元測試,添加spring-test包 -->          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-test</artifactId>              <version>${spring.version}</version>          </dependency>          <!--添加spring-web包 -->          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-web</artifactId>              <version>${spring.version}</version>          </dependency>          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-webmvc</artifactId>              <version>${spring.version}</version>          </dependency>          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-aop</artifactId>              <version>${spring.version}</version>          </dependency>          <dependency>              <groupId>org.springframework</groupId>              <artifactId>spring-context-support</artifactId>              <version>${spring.version}</version>          </dependency>          <!--添加aspectjweaver包 -->          <dependency>              <groupId>org.aspectj</groupId>              <artifactId>aspectjweaver</artifactId>              <version>1.8.5</version>          </dependency>          <!-- 添加mybatis的核心包 -->          <dependency>              <groupId>org.mybatis</groupId>              <artifactId>mybatis</artifactId>              <version>${mybatis.version}</version>          </dependency>          <!-- 添加mybatis與Spring整合的核心包 -->          <dependency>              <groupId>org.mybatis</groupId>              <artifactId>mybatis-spring</artifactId>              <version>1.2.2</version>          </dependency>          <!-- 添加servlet3.0核心包 -->          <dependency>              <groupId>javax.servlet</groupId>              <artifactId>javax.servlet-api</artifactId>              <version>3.0.1</version>          </dependency>          <dependency>              <groupId>javax.servlet.jsp</groupId>              <artifactId>javax.servlet.jsp-api</artifactId>              <version>2.3.2-b01</version>          </dependency>          <!-- jstl -->          <dependency>              <groupId>javax.servlet</groupId>              <artifactId>jstl</artifactId>              <version>1.2</version>          </dependency>          <!-- 添加mysql驅動包 -->          <dependency>              <groupId>mysql</groupId>              <artifactId>mysql-connector-java</artifactId>              <version>5.1.34</version>          </dependency>          <!--end-->            <!-- 添加druid連接池包 -->          <dependency>              <groupId>com.alibaba</groupId>              <artifactId>druid</artifactId>              <version>1.0.12</version>          </dependency>          <!--end-->            <!-- 日誌文件管理包 -->          <!-- log start -->          <dependency>              <groupId>log4j</groupId>              <artifactId>log4j</artifactId>              <version>${log4j.version}</version>          </dependency>          <!-- 格式化對象,方便輸出日誌 -->          <dependency>              <groupId>com.alibaba</groupId>              <artifactId>fastjson</artifactId>              <version>1.1.41</version>          </dependency>              <dependency>              <groupId>org.slf4j</groupId>              <artifactId>slf4j-api</artifactId>              <version>${slf4j.version}</version>          </dependency>            <dependency>              <groupId>org.slf4j</groupId>              <artifactId>slf4j-log4j12</artifactId>              <version>${slf4j.version}</version>          </dependency>          <!-- log end -->            <!--apache shiro  -->          <dependency>              <groupId>org.apache.shiro</groupId>              <artifactId>shiro-core</artifactId>              <version>1.2.2</version>          </dependency>          <dependency>              <groupId>org.apache.shiro</groupId>              <artifactId>shiro-web</artifactId>              <version>1.2.3</version>          </dependency>          <dependency>              <groupId>org.apache.shiro</groupId>              <artifactId>shiro-spring</artifactId>              <version>1.2.3</version>          </dependency>          <!--end-->              <!-- 映入JSON -->          <dependency>              <groupId>org.codehaus.jackson</groupId>              <artifactId>jackson-mapper-asl</artifactId>              <version>1.9.13</version>          </dependency>          <!--end-->            <!-- 上傳組件包 -->          <dependency>              <groupId>commons-fileupload</groupId>              <artifactId>commons-fileupload</artifactId>              <version>1.3.1</version>          </dependency>          <dependency>              <groupId>commons-io</groupId>              <artifactId>commons-io</artifactId>              <version>2.4</version>          </dependency>          <dependency>              <groupId>commons-codec</groupId>              <artifactId>commons-codec</artifactId>              <version>1.9</version>          </dependency>          <!--end-->            <!--定時器任務調度框架-->          <dependency>              <groupId>org.quartz-scheduler</groupId>              <artifactId>quartz</artifactId>              <version>${quartz.version}</version>          </dependency>          <!--end-->            <!--velocity視圖模板-->          <dependency>              <groupId>org.apache.velocity</groupId>              <artifactId>velocity</artifactId>              <version>1.7</version>          </dependency>          <dependency>              <groupId>org.apache.velocity</groupId>              <artifactId>velocity-tools</artifactId>              <version>2.0</version>          </dependency>          <!--end-->              <!--mybatis generator -->          <dependency>              <groupId>org.mybatis.generator</groupId>              <artifactId>mybatis-generator-core</artifactId>              <version>1.3.2</version>            </dependency>            <dependency>              <groupId>org.mybatis.generator</groupId>              <artifactId>mybatis-generator-core</artifactId>              <version>RELEASE</version>          </dependency>          <!--end-->            <!--common包-->          <dependency>              <groupId>org.apache.commons</groupId>              <artifactId>commons-lang3</artifactId>              <version>3.5</version>          </dependency>            <!-- mybatis pager 分頁插件-->          <dependency>              <groupId>com.github.pagehelper</groupId>              <artifactId>pagehelper</artifactId>              <version>4.1.0</version>          </dependency>          <!--end-->            <!--日期工具-->          <dependency>              <groupId>joda-time</groupId>              <artifactId>joda-time</artifactId>              <version>2.3</version>          </dependency>          <!--emd-->            <!--valid工具包-->          <dependency>              <groupId>javax.validation</groupId>              <artifactId>validation-api</artifactId>              <version>1.1.0.Final</version>          </dependency>            <dependency>              <groupId>org.hibernate</groupId>              <artifactId>hibernate-validator</artifactId>              <version>5.1.0.Final</version>          </dependency>          <!--end-->        </dependencies>          <build>          <finalName>projectManager</finalName>          <resources>              <resource>                  <directory>src/main/java</directory>                  <includes>                      <include>**/*.xml</include>                  </includes>              </resource>              <resource>                  <directory>src/main/resources</directory>              </resource>          </resources>            <plugins>              <plugin>                  <groupId>org.mybatis.generator</groupId>                  <artifactId>mybatis-generator-maven-plugin</artifactId>                  <version>1.3.2</version>                  <configuration>                      <verbose>true</verbose>                      <overwrite>true</overwrite>                  </configuration>              </plugin>              <plugin>                  <groupId>org.apache.maven.plugins</groupId>                  <artifactId>maven-compiler-plugin</artifactId>                  <configuration>                      <source>1.8</source>                      <target>1.8</target>                  </configuration>              </plugin>          </plugins>      </build>  </project>

jar包導進來了。你可能會問這麼多jar包啊,我怎麼知道。對不起,我也是百度過來的。有些jar包我知道,有些我不知道。抱歉。 繼續。web工程都先看WEB-INF下面的web.xml的配置,無論哪個web工程。 那麼我先把我整理過的web.xml貼上來。

   <?xml version="1.0" encoding="UTF-8"?>  <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"           xmlns="http://java.sun.com/xml/ns/javaee"           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"           version="3.0">    <display-name>ssm</display-name>    <context-param>      <param-name>contextConfigLocation</param-name>      <param-value>classpath:./spring-cfg.xml</param-value>    </context-param>      <!-- 編碼過濾器 -->    <filter>      <filter-name>encodingFilter</filter-name>      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>      <async-supported>true</async-supported>      <init-param>        <param-name>encoding</param-name>        <param-value>UTF-8</param-value>      </init-param>    </filter>    <filter-mapping>      <filter-name>encodingFilter</filter-name>      <url-pattern>/*</url-pattern>    </filter-mapping>    <!-- Spring監聽器 -->    <listener>      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    </listener>    <!-- Spring MVC servlet -->    <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>      <load-on-startup>1</load-on-startup>      <async-supported>true</async-supported>    </servlet>    <servlet-mapping>      <servlet-name>SpringMVC</servlet-name>      <url-pattern>/</url-pattern>    </servlet-mapping>    <!--log4j日誌-->    <context-param>      <param-name>log4jConfigLocation</param-name>      <param-value>classpath:log4j.properties</param-value>    </context-param>  </web-app>  

稍微來說明一下吧。<display-name>ssm</display-name>工程名。 下面這個,springcontext的配置文件,很重要,一般把這個配置文件獨立出去,方便管理,事實上你寫到web.xml裡面來也是沒有什麼問題的。但是我沒有試過。有興趣了解一下?然後告訴我?

  <context-param>      <param-name>contextConfigLocation</param-name>      <param-value>classpath:./spring-cfg.xml</param-value>    </context-param>

接下來就是編碼過濾器。事實上就是一個filter,因為Tomcat的默認編碼不是utf-8 所以為了保證編碼的一致,使用這個編碼過濾器,<filter-mapping>代表的過濾器的生效路徑。

  <filter>      <filter-name>encodingFilter</filter-name>      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>      <async-supported>true</async-supported>      <init-param>        <param-name>encoding</param-name>        <param-value>UTF-8</param-value>      </init-param>    </filter>    <filter-mapping>      <filter-name>encodingFilter</filter-name>      <url-pattern>/*</url-pattern>    </filter-mapping>

接下來就是spring的監聽器了,**ContextLoaderListener的作用就是啟動Web容器時,自動裝配ApplicationContext.xml的配置資訊。**因為它實現了ServletContextListener這個介面,在web.xml配置這個監聽器,啟動容器時,就會默認執行它實現的方法。 也就是說,當web容器初始化的時候,spring 的配置文件ApplicationContext.xml也啟用了,當然我這裡spring的配置文件是spring-cfg.xml。所以監聽器決定我們spring是否啟動。 https://www.cnblogs.com/wuchaodzxx/p/6038895.html

  <!-- Spring監聽器 -->    <listener>      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

繼續下一個,就是servlet的配置了,servlet是web的基礎,我們沒有用框架的時候,就是在web.xml裡面配置servlet-class和servlet-mapping的。那麼這裡的配置就是吧servlet交給springMVC的dispatcherServlet類。適配路徑/* 全部路徑。就是說所有的url都會進入到dispatchservlet類裡面。但你配置 /su/*的時候,那就只能適配/su/ 後面的路徑了

這裡就是實現了整合springMVC,而上面就是整合了spring,那麼你會問mybatis捏,事實上mybatis是後端和數據交互的中間過程,也是說橋樑。那麼我們寫業務的時候才需要用到mybatis,所以mybatis是整合到spring裡面來,也就是說實在spring-cfg.xml裡面配置。

<!-- Spring MVC servlet -->    <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>      <load-on-startup>1</load-on-startup>      <async-supported>true</async-supported>    </servlet>    <servlet-mapping>      <servlet-name>SpringMVC</servlet-name>      <url-pattern>/</url-pattern>    </servlet-mapping>

那麼接下來就是spring-cfg.xml了,這配置也就是開啟aop,掃描註解開啟,事務開啟。還有整合mybatis,整合就是配置sqlSessionFactory以及掃描mapper。當然你說用xml注入bean也行,我開了註解就注入,然而用xml配置DI我覺得好麻煩,而且又長。打註解比較方便,相比之下。

<?xml version="1.0" encoding="UTF-8"?>  <beans xmlns="http://www.springframework.org/schema/beans"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xmlns:context="http://www.springframework.org/schema/context"         xmlns:aop="http://www.springframework.org/schema/aop"         xmlns:tx="http://www.springframework.org/schema/tx"         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      http://www.springframework.org/schema/aop      http://www.springframework.org/schema/aop/spring-aop-4.0.xsd      http://www.springframework.org/schema/tx      http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"  >        <!--開啟切面編程自動代理-->      <aop:aspectj-autoproxy proxy-target-class="true"/>        <!--   (到包中掃描類、方法、屬性上是否有註解)-->      <context:component-scan base-package="com.su" annotation-config="true"/>          <context:property-placeholder location="classpath:jdbc.properties"/>        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">          <property name="dataSource" ref="dataSource"/>          <property name="mapperLocations" value="classpath*:**/dao/*.xml"/>          <property name="plugins">              <array>                  <bean class="com.github.pagehelper.PageHelper">                      <property name="properties">                          <value>                              dialect=mysql                          </value>                      </property>                  </bean>              </array>          </property>      </bean>        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">          <property name="basePackage" value="com.su.User.dao"/>          <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>      </bean>        <!--聲明事務管理 採用註解方式-->      <tx:annotation-driven transaction-manager="transactionManager"/>      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">          <property name="dataSource" ref="dataSource"/>      </bean>        <!--資料庫設置-->      <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"            destroy-method="close" init-method="init">          <property name="driverClassName" value="${db.driverClassName}"/>          <property name="url" value="${db.url}"/>          <property name="username" value="${db.username}"/>          <property name="password" value="${db.password}"/>          <!-- 連接池啟動時的初始值 -->          <property name="initialSize" value="${db.initialSize}"/>          <!-- 連接池的最大值 -->          <property name="maxActive" value="${db.maxActive}"/>            <!-- 最小空閑值.當空閑的連接數少於閥值時,連接池就會預申請去一些連接,以免洪峰來時來不及申請 -->          <property name="minIdle" value="${db.minIdle}"/>          <!-- 最大建立連接等待時間。如果超過此時間將接到異常。設為-1表示無限制 -->          <property name="maxWait" value="${db.maxWait}"/>          <property name="poolPreparedStatements" value="${db.poolPreparedStatements}"/>          <property name="maxPoolPreparedStatementPerConnectionSize"                    value="${db.maxPoolPreparedStatementPerConnectionSize}"/>          <property name="validationQuery" value="${db.validationQuery}"/>          <property name="testOnBorrow" value="${db.testOnBorrow}"/>          <property name="testOnReturn" value="${db.testOnReturn}"/>          <property name="testWhileIdle" value="${db.testWhileIdle}"/>          <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->          <property name="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}"/>          <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->          <property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}"/>          <!-- 打開removeAbandoned功能 -->          <property name="removeAbandoned" value="${db.removeAbandoned}"/>          <!-- 1800秒,也就是30分鐘 -->          <property name="removeAbandonedTimeout" value="${db.removeAbandonedTimeout}"/>          <!-- 關閉abanded連接時輸出錯誤日誌 -->          <property name="logAbandoned" value="${db.logAbandoned}"/>          <!-- 監控資料庫 -->          <!-- <property name="filters" value="stat" /> -->          <property name="filters" value="${db.filters}"/>      </bean>      <!--<import resource="spring-job.xml"/>-->  </beans>

接下來就是spring-mvc.xml。開啟註解,開啟包掃描註解,包掃描component,主要是掃描controller,處理靜態資源,以及配置處理器,這裡我用的velocity,以前很多人用jsp。我沒有導jstl的jar包,你要你自己找dependency導進來。再自己配置

<?xml version="1.0" encoding="UTF-8"?>  <beans xmlns="http://www.springframework.org/schema/beans"         xmlns:context="http://www.springframework.org/schema/context"         xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         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.xsd        http://www.springframework.org/schema/mvc        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">            <mvc:annotation-driven>          <mvc:message-converters>                <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>              <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">                  <property name="supportedMediaTypes">                      <list>                          <value>text/html;charset=UTF-8</value>                          <value>application/json;charset=UTF-8</value>                      </list>                  </property>              </bean>          </mvc:message-converters>      </mvc:annotation-driven>            <!--支援多媒體文件上傳-->      <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">          <!--<property name="maxUploadSize" value="10485760"/> &lt;!&ndash; 表示上傳文件最大Size為10M &ndash;&gt;-->          <property name="maxInMemorySize" value="4096" />          <property name="defaultEncoding" value="UTF-8"/>      </bean>      <!--包掃描-->      <context:component-scan base-package="com.su.User.controller" />        <!--開啟註解掃描-->      <mvc:annotation-driven/>      <!--處理靜態資源-->      <mvc:default-servlet-handler/>              <bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">          <property name="resourceLoaderPath" value="/WEB-INF/views"/>          <property name="velocityProperties">              <props>                  <prop key="input.encoding">utf-8</prop>                  <prop key="output.encoding">utf-8</prop>                  <prop key="file.resource.loader.cache">false</prop>                  <prop key="file.resource.loader.modificationCheckInterval">1</prop>                  <prop key="velocimacro.library.autoreload">false</prop>              </props>          </property>      </bean>        <bean class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">          <property name="suffix" value=".vm"/>          <property name="contentType" value="text/html;charset=utf-8"/>          <property name="dateToolAttribute" value="date"/><!--日期函數名稱-->      </bean>        </beans>

到了這裡還沒好,掃描的那些mapper文件沒有,entity也沒有,dao也沒有,這些沒有還會會報錯。繼續看下去,你可以用mybatis-generator逆向,不會的自行百度。

我這裡簡單說一下。

主要是pom.xml的那裡吧mybatis-generator導進來。

然後配置xml,再配置maven

配置文件generatorConfig.xml為

<?xml version="1.0" encoding="UTF-8" ?>  <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"          "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >  <generatorConfiguration>        <!--classPathEntry:資料庫的JDBC驅動 -->      <classPathEntry              location="D:maven3mavenrepositorymysqlmysql-connector-java5.1.45mysql-connector-java-5.1.45.jar" />        <context id="MysqlTables" targetRuntime="MyBatis3">            <!-- 注意這裡面的順序確定的,不能隨變更改 -->          <!-- 自定義的分頁插件 <plugin type="com.deppon.foss.module.helloworld.shared.PaginationPlugin"/> -->            <!-- 可選的(0 or 1) -->          <!-- 注釋生成器 -->          <commentGenerator>              <!-- 是否去除自動生成的注釋 true:是 : false:否 -->              <property name="suppressAllComments" value="true" />          </commentGenerator>            <!-- 必須的(1 required) -->          <!--資料庫連接的資訊:驅動類、連接地址、用戶名、密碼 -->          <jdbcConnection driverClass="com.mysql.jdbc.Driver"                          connectionURL="jdbc:mysql://localhost:3306/project-manager"                          userId="root" password="root">          </jdbcConnection>            <!-- 可選的(0 or 1) -->          <!-- 類型轉換器或者加類型解析器 -->          <!-- 默認false,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer true,把JDBC DECIMAL 和              NUMERIC 類型解析為java.math.BigDecimal -->          <javaTypeResolver>              <property name="forceBigDecimals" value="false" />          </javaTypeResolver>              <!-- 必須的(1 required) -->          <!-- java模型生成器 -->          <!-- targetProject:自動生成程式碼的位置 -->          <javaModelGenerator targetPackage="com.su.User.entity"                              targetProject="D:ProjectCollectionideassmsrcmainjava"                               >              <!-- TODO enableSubPackages:是否讓schema作為包的後綴 -->              <property name="enableSubPackages" value="true" />              <!-- 從資料庫返回的值被清理前後的空格 -->              <property name="trimStrings" value="true" />          </javaModelGenerator>            <!-- 必須的(1 required) -->          <!-- map xml 生成器 -->          <sqlMapGenerator targetPackage="com.su.User.dao"                           targetProject="D:ProjectCollectionideassmsrcmainjava">              <property name="enableSubPackages" value="true" />          </sqlMapGenerator>            <!-- 可選的(0 or 1) -->          <!-- mapper 或者就是dao介面生成器 -->          <javaClientGenerator targetPackage="com.su.User.dao"                               targetProject="D:ProjectCollectionideassmsrcmainjava"                               type="XMLMAPPER">              <property name="enableSubPackages" value="true" />          </javaClientGenerator>            <!-- 必須的(1...N) -->          <!-- pojo 實體生成器 -->          <!-- tableName:用於自動生成程式碼的資料庫表;domainObjectName:對應於資料庫表的javaBean類名 -->          <!-- schema即為資料庫名 可不寫 -->          <table  tableName="user" domainObjectName="User"                  enableInsert="true" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"                  enableSelectByExample="false" selectByExampleQueryId="false">              <!-- 忽略欄位 可選的(0 or 1) -->              <!-- <ignoreColumn column="is_use" /> -->              <!--//無論欄位是什麼類型,生成的類屬性都是varchar。 可選的(0 or 1) 測試無效 -->              <!-- <columnOverride column="city_code" jdbcType="VARCHAR" /> -->          </table>            </context>  </generatorConfiguration>

逆向生成後,自己寫一些controller測試吧。到這裡已經搭建好了

如果報錯,查看報錯資訊,先翻譯找錯,不行再百度吧。

3.整合logback+lombok

首先是pom.xml導包,這裡只是pom.xml的一部分,這是logback需要的一些包

 <!-- 日誌文件管理包 -->          <!-- log start -->            <!--logback-->          <dependency>              <groupId>org.slf4j</groupId>              <artifactId>slf4j-api</artifactId>              <version>${slf4j.version}</version>          </dependency>          <dependency>              <groupId>ch.qos.logback</groupId>              <artifactId>logback-core</artifactId>              <version>1.1.6</version>          </dependency>          <dependency>              <groupId>ch.qos.logback</groupId>              <artifactId>logback-classic</artifactId>              <version>1.1.6</version>          </dependency>          <dependency>              <groupId>ch.qos.logback</groupId>              <artifactId>logback-access</artifactId>              <version>1.1.2</version>          </dependency>          <dependency>              <groupId>commons-logging</groupId>              <artifactId>commons-logging</artifactId>              <version>1.2</version>          </dependency>            <dependency>              <groupId>commons-codec</groupId>              <artifactId>commons-codec</artifactId>              <version>1.10</version>          </dependency>            <dependency>              <groupId>log4j</groupId>              <artifactId>log4j</artifactId>              <version>1.2.17</version>          </dependency>          <dependency>              <groupId>org.logback-extensions</groupId>              <artifactId>logback-ext-spring</artifactId>              <version>0.1.4</version>          </dependency>          <dependency>              <groupId>org.projectlombok</groupId>              <artifactId>lombok</artifactId>              <version>1.16.6</version>          </dependency>          <!--end-->

配置logback,新建一個logback.xml,這裡面有些地方需要改寫自己項目的配置,比如日誌存放的文件的位置,默認是Tomcat的啟動的那個盤的目錄下,我的配置是這樣子的。logback的好處,自己去百度吧,這裡是採用error級別和info級別的區分,有特定需求自己搞吧。

<?xml version="1.0" encoding="UTF-8"?>  <configuration>      <property name="LOG_HOME" value="/logs/ssm/" />        <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">          <encoder>              <pattern>%d{H:mm} %-5level [%logger{16}] %msg%n</pattern>          </encoder>      </appender>        <appender name="normalLog"                class="ch.qos.logback.core.rolling.RollingFileAppender">          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">              <FileNamePattern>${LOG_HOME}/web.normal.%d{yyyy-MM-dd}.log              </FileNamePattern>              <MaxHistory>30</MaxHistory>          </rollingPolicy>          <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">              <maxFileSize>10MB</maxFileSize>          </triggeringPolicy>          <layout class="ch.qos.logback.classic.PatternLayout">              <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{16} - %msg%n              </pattern>          </layout>          <filter class="ch.qos.logback.classic.filter.LevelFilter">              <level>ERROR</level>              <onMatch>DENY</onMatch>              <onMismatch>ACCEPT</onMismatch>          </filter>      </appender>      <appender name="errorLog"                class="ch.qos.logback.core.rolling.RollingFileAppender">          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">              <FileNamePattern>${LOG_HOME}/web.error.%d{yyyy-MM-dd}.log              </FileNamePattern>              <MaxHistory>30</MaxHistory>          </rollingPolicy>          <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">              <maxFileSize>10MB</maxFileSize>          </triggeringPolicy>          <layout class="ch.qos.logback.classic.PatternLayout">              <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{16} - %msg%n              </pattern>          </layout>          <filter class="ch.qos.logback.classic.filter.LevelFilter">              <level>ERROR</level>              <onMatch>ACCEPT</onMatch>              <onMismatch>DENY</onMismatch>          </filter>      </appender>          <logger name="com.su" level="debug" >          <appender-ref ref="normalLog" />          <appender-ref ref="errorLog" />      </logger>          <root level="info">          <appender-ref ref="Console" />      </root>  </configuration>

然後在web.xml配置logback

  <!--log4j日誌 由於啟用了logback日誌,此配置廢除-->    <!--<context-param>-->      <!--<param-name>log4jConfigLocation</param-name>-->      <!--<param-value>classpath:log4j.properties</param-value>-->    <!--</context-param>-->        <!--logback日誌-->    <context-param>      <param-name>logbackConfigLocation</param-name>      <param-value>classpath:logback.xml</param-value>    </context-param>

4. 整合shiro

首先導包。

<!--apache shiro  -->          <dependency>              <groupId>org.apache.shiro</groupId>              <artifactId>shiro-core</artifactId>              <version>1.2.2</version>          </dependency>          <dependency>              <groupId>org.apache.shiro</groupId>              <artifactId>shiro-web</artifactId>              <version>1.2.3</version>          </dependency>          <dependency>              <groupId>org.apache.shiro</groupId>              <artifactId>shiro-spring</artifactId>              <version>1.2.3</version>          </dependency>          <!--end-->

配置spring-cfg.xml

<!--整合shiro-->      <!--切面類-->      <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/>        <!--自定義Realm-->      <bean id="myRealm" class="com.su.shiro.MyRealm"/>        <!--安全管理-->      <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">          <property name="realm" ref="myRealm"/>      </bean>        <!--shiro 過濾器-->      <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">          <!-- Shiro過濾器的核心安全介面,這個屬性是必須的-->          <property name="securityManager" ref="securityManager"/>          <!--身份認證失敗,則跳轉到登錄頁面的配置-->          <property name="loginUrl" value="/user/login"/>          <!--許可權認證失敗,則跳轉到指定頁面-->          <property name="unauthorizedUrl" value="/user/login"/>          <!-- Shiro連接約束配置,即過濾鏈的定義-->          <property name="filterChainDefinitions">              <value>                  /static/**=anon                  /error/**=anon                  /lib/**=anon                  /myjs/**=anon                  /uploads/**=anon                  /user/login*=anon                  /user/logout*=logout                  /**=authc              </value>          </property>      </bean>      <!--over-->

配置spring-mvc.xml

<!--開啟shiro的註解-->      <!-- AOP式方法級許可權檢查  -->      <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>      <bean id="defaultAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">          <!--強制使用cglib創建Action的代理對象-->          <property name="proxyTargetClass" value="true"/>      </bean>      <!--over-->

創建一個realm,注意這裡只是簡單創建一個realm,其實可以創建多個realm,這個需要看需求,我把程式碼貼出來吧,簡化過的程式碼,有需要可以查看別人的部落格,來進行完善

package com.su.shiro;        import com.su.user.entity.User;  import com.su.user.service.UserService;  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.authz.AuthorizationInfo;  import org.apache.shiro.authz.SimpleAuthorizationInfo;  import org.apache.shiro.realm.AuthorizingRealm;  import org.apache.shiro.subject.PrincipalCollection;    import javax.annotation.Resource;  import java.util.Set;    /**   * @author Veng Su 1344114844@qq.com   * @date 2018/4/12 9:40   */  public class MyRealm extends AuthorizingRealm {      @Resource      private UserService userServiceImpl;        //為當前登錄成功的用戶授予許可權和角色,已經登錄成功了。      protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {          String username=(String) principals.getPrimaryPrincipal();          SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();          //這裡拿到角色名          Set<String> roles = null;          roles.add("user");//賦予user角色,其實你可以放到資料庫裡面,這裡簡化          authorizationInfo.setRoles(roles);          //這裡拿到該角色的許可權          //這裡拿到角色名          Set<String> permissions = null;          permissions.add("select");//賦予user角色許可權,其實你可以放到資料庫裡面,這裡簡化          authorizationInfo.setStringPermissions(permissions);          return authorizationInfo;      }          //驗證當前登錄的用戶,獲取認證資訊。      protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {          String username=(String) token.getPrincipal();//獲取用戶名          User user=new User();//這裡簡化,本來從資料庫拿的          //如果查詢不出來則返回null,不通過驗證,如果查出來,則返回AuthenticationInfo          if(user!=null){              AuthenticationInfo authcInfo =new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(),"myRealm");              return authcInfo;          }else{              return null;          }      }  }

好了,萬事俱備,那麼就要在web.xml裡面註冊這個shiro,shiro是基於filter來搞得,那麼就要在web.xml裡面註冊這個filter

<!--集成shiro-->      <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>

那麼到這裡,shiro已經集成到spring裡面了

接下來就是使用shiro來做登錄驗證,我去找張流程圖

認證過程

授權過程

圖片來源https://blog.csdn.net/mine_song/article/details/61616259

然後,我把構建sercurityManager的環境搭建起來吧,簡單點就是用controller調用realm的doGetAuthorizationInfo授權,和doGetAuthenticationInfo驗證,這裡是我的項目的源碼而已,有問題,看著shiro的官方文檔來吧

package com.su.shiro;      import com.su.user.service.UserService;  import org.apache.shiro.authc.AuthenticationException;  import org.apache.shiro.authc.AuthenticationInfo;  import org.apache.shiro.authc.AuthenticationToken;  import org.apache.shiro.authz.AuthorizationInfo;  import org.apache.shiro.authz.SimpleAuthorizationInfo;  import org.apache.shiro.realm.AuthorizingRealm;  import org.apache.shiro.subject.PrincipalCollection;    import javax.annotation.Resource;    /**   * @author Veng Su 1344114844@qq.com   * @date 2018/4/12 9:40   */  public class MyRealm extends AuthorizingRealm {      @Resource      private UserService userServiceImpl;        //為當前登錄成功的用戶授予許可權和角色,已經登錄成功了。      protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {          String username=(String) principals.getPrimaryPrincipal();          SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();  //        authorizationInfo.setRoles(userServiceImpl.getRoles(username));  //        authorizationInfo.setStringPermissions(userServiceImpl.getPermissions(username));          return authorizationInfo;      }          //驗證當前登錄的用戶,獲取認證資訊。      protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {          String username=(String) token.getPrincipal();//獲取用戶名  //        User user=userServiceImpl.getByUsername(username);  //        if(user!=null){  //            AuthenticationInfo authcInfo =new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(),"myRealm");  //            return authcInfo;  //        }else{  //            return null;  //        }          return null;      }  }
Exit mobile version