.gitignore
@@ -1,6 +1,33 @@ HELP.md target/ pom.xml.tag pom.xml.releaseBackup pom.xml.versionsBackup pom.xml.next release.properties !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ ### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans .sts4-cache ### IntelliJ IDEA ### .idea *.iws *.iml *.ipr ### NetBeans ### /nbproject/private/ /nbbuild/ /dist/ /nbdist/ /.nb-gradle/ build/ !**/src/main/**/build/ !**/src/test/**/build/ ### VS Code ### .vscode/ mvnw
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,316 @@ #!/bin/sh # ---------------------------------------------------------------------------- # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- # Maven Start Up Batch script # # Required ENV vars: # ------------------ # JAVA_HOME - location of a JDK home dir # # Optional ENV vars # ----------------- # M2_HOME - location of maven2's installed home dir # MAVEN_OPTS - parameters passed to the Java VM when running Maven # e.g. to debug Maven itself, use # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 # MAVEN_SKIP_RC - flag to disable loading of mavenrc files # ---------------------------------------------------------------------------- if [ -z "$MAVEN_SKIP_RC" ] ; then if [ -f /usr/local/etc/mavenrc ] ; then . /usr/local/etc/mavenrc fi if [ -f /etc/mavenrc ] ; then . /etc/mavenrc fi if [ -f "$HOME/.mavenrc" ] ; then . "$HOME/.mavenrc" fi fi # OS specific support. $var _must_ be set to either true or false. cygwin=false; darwin=false; mingw=false case "`uname`" in CYGWIN*) cygwin=true ;; MINGW*) mingw=true;; Darwin*) darwin=true # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home # See https://developer.apple.com/library/mac/qa/qa1170/_index.html if [ -z "$JAVA_HOME" ]; then if [ -x "/usr/libexec/java_home" ]; then export JAVA_HOME="`/usr/libexec/java_home`" else export JAVA_HOME="/Library/Java/Home" fi fi ;; esac if [ -z "$JAVA_HOME" ] ; then if [ -r /etc/gentoo-release ] ; then JAVA_HOME=`java-config --jre-home` fi fi if [ -z "$M2_HOME" ] ; then ## resolve links - $0 may be a link to maven's home PRG="$0" # need this for relative symlinks while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG="`dirname "$PRG"`/$link" fi done saveddir=`pwd` M2_HOME=`dirname "$PRG"`/.. # make it fully qualified M2_HOME=`cd "$M2_HOME" && pwd` cd "$saveddir" # echo Using m2 at $M2_HOME fi # For Cygwin, ensure paths are in UNIX format before anything is touched if $cygwin ; then [ -n "$M2_HOME" ] && M2_HOME=`cygpath --unix "$M2_HOME"` [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"` fi # For Mingw, ensure paths are in UNIX format before anything is touched if $mingw ; then [ -n "$M2_HOME" ] && M2_HOME="`(cd "$M2_HOME"; pwd)`" [ -n "$JAVA_HOME" ] && JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" fi if [ -z "$JAVA_HOME" ]; then javaExecutable="`which javac`" if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then # readlink(1) is not available as standard on Solaris 10. readLink=`which readlink` if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then if $darwin ; then javaHome="`dirname \"$javaExecutable\"`" javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" else javaExecutable="`readlink -f \"$javaExecutable\"`" fi javaHome="`dirname \"$javaExecutable\"`" javaHome=`expr "$javaHome" : '\(.*\)/bin'` JAVA_HOME="$javaHome" export JAVA_HOME fi fi fi if [ -z "$JAVACMD" ] ; then if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi else JAVACMD="`\\unset -f command; \\command -v java`" fi fi if [ ! -x "$JAVACMD" ] ; then echo "Error: JAVA_HOME is not defined correctly." >&2 echo " We cannot execute $JAVACMD" >&2 exit 1 fi if [ -z "$JAVA_HOME" ] ; then echo "Warning: JAVA_HOME environment variable is not set." fi CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher # traverses directory structure from process work directory to filesystem root # first directory with .mvn subdirectory is considered project base directory find_maven_basedir() { if [ -z "$1" ] then echo "Path not specified to find_maven_basedir" return 1 fi basedir="$1" wdir="$1" while [ "$wdir" != '/' ] ; do if [ -d "$wdir"/.mvn ] ; then basedir=$wdir break fi # workaround for JBEAP-8937 (on Solaris 10/Sparc) if [ -d "${wdir}" ]; then wdir=`cd "$wdir/.."; pwd` fi # end of workaround done echo "${basedir}" } # concatenates all lines of a file concat_lines() { if [ -f "$1" ]; then echo "$(tr -s '\n' ' ' < "$1")" fi } BASE_DIR=`find_maven_basedir "$(pwd)"` if [ -z "$BASE_DIR" ]; then exit 1; fi ########################################################################################## # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central # This allows using the maven wrapper in projects that prohibit checking in binary data. ########################################################################################## if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then if [ "$MVNW_VERBOSE" = true ]; then echo "Found .mvn/wrapper/maven-wrapper.jar" fi else if [ "$MVNW_VERBOSE" = true ]; then echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." fi if [ -n "$MVNW_REPOURL" ]; then jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" else jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" fi while IFS="=" read key value; do case "$key" in (wrapperUrl) jarUrl="$value"; break ;; esac done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" if [ "$MVNW_VERBOSE" = true ]; then echo "Downloading from: $jarUrl" fi wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" if $cygwin; then wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` fi if command -v wget > /dev/null; then if [ "$MVNW_VERBOSE" = true ]; then echo "Found wget ... using wget" fi if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" else wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" fi elif command -v curl > /dev/null; then if [ "$MVNW_VERBOSE" = true ]; then echo "Found curl ... using curl" fi if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then curl -o "$wrapperJarPath" "$jarUrl" -f else curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f fi else if [ "$MVNW_VERBOSE" = true ]; then echo "Falling back to using Java to download" fi javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" # For Cygwin, switch paths to Windows format before running javac if $cygwin; then javaClass=`cygpath --path --windows "$javaClass"` fi if [ -e "$javaClass" ]; then if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then if [ "$MVNW_VERBOSE" = true ]; then echo " - Compiling MavenWrapperDownloader.java ..." fi # Compiling the Java class ("$JAVA_HOME/bin/javac" "$javaClass") fi if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then # Running the downloader if [ "$MVNW_VERBOSE" = true ]; then echo " - Running MavenWrapperDownloader.java ..." fi ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") fi fi fi fi ########################################################################################## # End of extension ########################################################################################## export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} if [ "$MVNW_VERBOSE" = true ]; then echo $MAVEN_PROJECTBASEDIR fi MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" # For Cygwin, switch paths to Windows format before running java if $cygwin; then [ -n "$M2_HOME" ] && M2_HOME=`cygpath --path --windows "$M2_HOME"` [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --windows "$CLASSPATH"` [ -n "$MAVEN_PROJECTBASEDIR" ] && MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` fi # Provide a "standardized" way to retrieve the CLI args that will # work with both Windows and non-Windows executions. MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" export MAVEN_CMD_LINE_ARGS WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain exec "$JAVACMD" \ $MAVEN_OPTS \ $MAVEN_DEBUG_OPTS \ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ "-Dmaven.home=${M2_HOME}" \ "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" mvnw.cmd
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,188 @@ @REM ---------------------------------------------------------------------------- @REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @REM distributed with this work for additional information @REM regarding copyright ownership. The ASF licenses this file @REM to you under the Apache License, Version 2.0 (the @REM "License"); you may not use this file except in compliance @REM with the License. You may obtain a copy of the License at @REM @REM https://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, @REM software distributed under the License is distributed on an @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @REM KIND, either express or implied. See the License for the @REM specific language governing permissions and limitations @REM under the License. @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- @REM Maven Start Up Batch script @REM @REM Required ENV vars: @REM JAVA_HOME - location of a JDK home dir @REM @REM Optional ENV vars @REM M2_HOME - location of maven2's installed home dir @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven @REM e.g. to debug Maven itself, use @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files @REM ---------------------------------------------------------------------------- @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' @echo off @REM set title of command window title %0 @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% @REM set %HOME% to equivalent of $HOME if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") @REM Execute a user defined script before this one if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre @REM check for pre script, once with legacy .bat ending and once with .cmd ending if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* :skipRcPre @setlocal set ERROR_CODE=0 @REM To isolate internal variables from possible post scripts, we use another setlocal @setlocal @REM ==== START VALIDATION ==== if not "%JAVA_HOME%" == "" goto OkJHome echo. echo Error: JAVA_HOME not found in your environment. >&2 echo Please set the JAVA_HOME variable in your environment to match the >&2 echo location of your Java installation. >&2 echo. goto error :OkJHome if exist "%JAVA_HOME%\bin\java.exe" goto init echo. echo Error: JAVA_HOME is set to an invalid directory. >&2 echo JAVA_HOME = "%JAVA_HOME%" >&2 echo Please set the JAVA_HOME variable in your environment to match the >&2 echo location of your Java installation. >&2 echo. goto error @REM ==== END VALIDATION ==== :init @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". @REM Fallback to current working directory if not found. set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir set EXEC_DIR=%CD% set WDIR=%EXEC_DIR% :findBaseDir IF EXIST "%WDIR%"\.mvn goto baseDirFound cd .. IF "%WDIR%"=="%CD%" goto baseDirNotFound set WDIR=%CD% goto findBaseDir :baseDirFound set MAVEN_PROJECTBASEDIR=%WDIR% cd "%EXEC_DIR%" goto endDetectBaseDir :baseDirNotFound set MAVEN_PROJECTBASEDIR=%EXEC_DIR% cd "%EXEC_DIR%" :endDetectBaseDir IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig @setlocal EnableExtensions EnableDelayedExpansion for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% :endReadAdditionalConfig SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B ) @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central @REM This allows using the maven wrapper in projects that prohibit checking in binary data. if exist %WRAPPER_JAR% ( if "%MVNW_VERBOSE%" == "true" ( echo Found %WRAPPER_JAR% ) ) else ( if not "%MVNW_REPOURL%" == "" ( SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" ) if "%MVNW_VERBOSE%" == "true" ( echo Couldn't find %WRAPPER_JAR%, downloading it ... echo Downloading from: %DOWNLOAD_URL% ) powershell -Command "&{"^ "$webclient = new-object System.Net.WebClient;"^ "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ "}"^ "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ "}" if "%MVNW_VERBOSE%" == "true" ( echo Finished downloading %WRAPPER_JAR% ) ) @REM End of extension @REM Provide a "standardized" way to retrieve the CLI args that will @REM work with both Windows and non-Windows executions. set MAVEN_CMD_LINE_ARGS=%* %MAVEN_JAVA_EXE% ^ %JVM_CONFIG_MAVEN_PROPS% ^ %MAVEN_OPTS% ^ %MAVEN_DEBUG_OPTS% ^ -classpath %WRAPPER_JAR% ^ "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* if ERRORLEVEL 1 goto error goto end :error set ERROR_CODE=1 :end @endlocal & set ERROR_CODE=%ERROR_CODE% if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost @REM check for post script, once with legacy .bat ending and once with .cmd ending if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" :skipRcPost @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' if "%MAVEN_BATCH_PAUSE%"=="on" pause if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% cmd /C exit /B %ERROR_CODE% pom.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,165 @@ <?xml version="1.0" encoding="UTF-8"?> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- https://start.springboot.io/ --> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.3</version> <relativePath/> </parent> <groupId>com.terra</groupId> <artifactId>sso</artifactId> <version>1.0.0</version> <name>sso</name> <description>SSOåç¹ç»å½</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> <version>2.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.9.1</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.9.1</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.9.1</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!--æ´ådruidæ°æ®æº--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency> <!--log4j--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- thymeleafä¸shiroæ´å --> <dependency> <groupId>com.github.theborakompanioni</groupId> <artifactId>thymeleaf-extras-shiro</artifactId> <version>2.1.0</version> </dependency> <!--å¯¼å ¥hutoolçä¾èµ--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.5.7</version> </dependency> <!--shiroç¼åï¼æ·»å ehcache--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--<dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-client</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency>--> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> src/main/java/com/terra/land/LandApplication.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package com.terra.land; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * LandApplication * @author */ @SpringBootApplication public class LandApplication { public static void main(String[] args) { SpringApplication.run(LandApplication.class, args); } } src/main/java/com/terra/land/config/ShiroConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,200 @@ package com.terra.land.config; import com.alibaba.druid.pool.DruidDataSource; import com.terra.land.entity.MyRealm; import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.apache.shiro.codec.Base64; import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.CookieRememberMeManager; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.apache.shiro.web.servlet.SimpleCookie; import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.HashMap; import java.util.Map; /** * ShiroConfig * @author */ @SuppressWarnings("ALL") @Configuration public class ShiroConfig { @ConfigurationProperties(prefix = "spring.datasource") @Bean public DruidDataSource druidDataSource() { return new DruidDataSource(); } /*@Bean(name = "securityManager") public DefaultWebSecurityManager securityManager(@Qualifier("myRealm") MyRealm myRealm){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(myRealm); return securityManager; }*/ @Bean(name = "securityManager") public DefaultWebSecurityManager securityManager(@Qualifier("myRealm") MyRealm myRealm, @Qualifier("rememberMeManager") CookieRememberMeManager rememberMeManager, @Qualifier("mySessionManager") DefaultWebSessionManager webSessionManager) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(myRealm); securityManager.setRememberMeManager(rememberMeManager); securityManager.setSessionManager(webSessionManager); return securityManager; } @Bean public MyRealm myRealm() { MyRealm myShiroRealm = new MyRealm(); return myShiroRealm; } @Bean(name = "rememberMeManager") public CookieRememberMeManager rememberMeManager() { // cookie管çå¨ CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager(); // cookieçåå SimpleCookie simpleCookie = new SimpleCookie("rememberMe"); // è®¾ç½®ææææ¶é´30天ï¼ç§ simpleCookie.setMaxAge(259200); cookieRememberMeManager.setCookie(simpleCookie); // rememberMe cookieå å¯çå¯é¥ 建议æ¯ä¸ªé¡¹ç®é½ä¸ä¸æ · é»è®¤AESç®æ³ å¯é¥é¿åº¦(128 256 512 ä½) cookieRememberMeManager.setCipherKey(Base64.decode("6ZmI6I2j5Y+R5aSn5ZOlAA==")); return cookieRememberMeManager; } /** * å建DefaultWebSessionManagerç±» * * @return */ @Bean(name = "mySessionManager") public DefaultWebSessionManager mySessionManager() { DefaultWebSessionManager defaultSessionManager = new DefaultWebSessionManager(); // å°sessionIdUrlRewritingEnabled屿§è®¾ç½®æfalse defaultSessionManager.setSessionIdUrlRewritingEnabled(false); defaultSessionManager.setGlobalSessionTimeout(8 * 60 * 60 * 1000); defaultSessionManager.setSessionValidationSchedulerEnabled(true); defaultSessionManager.setSessionIdCookieEnabled(true); return defaultSessionManager; } @Bean public ShiroFilterFactoryBean bean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); bean.setSecurityManager(securityManager); /** * æ·»å shiroçå ç½®è¿æ»¤å¨ * anon: æ é认è¯å³å¯è®¿é® * authc: å¿ é¡»è®¤è¯æè½ç¨ * user: å¿ é¡»æ¥æ âè®°ä½æâ åè½æè½ç¨ * perms: æ¥æå¯¹æä¸ªèµæºçæéæè½ç¨ * role: æ¥ææä¸ªè§è²æéæè½è®¿é® */ Map<String, String> filterMap = new HashMap<>(5); // ç»éåææï¼æ£å¸¸æ åµä¸æ²¡æææä¼è·³è½¬å°æªææé¡µé¢ //filterMap.put("/toAdd", "perms[user:add]"); //filterMap.put("/toUpdate", "perms[user:update]"); // ç»åºï¼è®¾ç½®æ³¨éè¿æ»¤å¨ //filterMap.put("/logout", "logout"); /** * /** å¹é ææçè·¯å¾ * éè¿Mapéåç»æäºä¸ä¸ªæ¦æªå¨é¾ ï¼èªé¡¶åä¸è¿æ»¤ï¼ä¸æ¦å¹é ï¼åä¸åæ§è¡ä¸é¢çè¿æ»¤ * 妿ä¸é¢çå®ä¹ä¸ä¸é¢å²çªï¼é£æç §äºè°å å®ä¹è°è¯´äºç® * æä»¥/** ä¸å®è¦é ç½®å¨æå * è¿éæ¯å¦è¦å¯¹ææè·¯å¾è¿è¡è®¤è¯è§æ åµèå®ï¼å 为ä¸äºè·¯ç±è·³è½¬å¯è½å¨æ²¡ç»éåºç°å¯¼è´åºéï¼æä»¥è¿éèèæ¸ æ¥ **/ //filterMap.put("/**", "authc"); // å°æ¦æªå¨é¾è®¾ç½®å°shiroä¸ bean.setFilterChainDefinitionMap(filterMap); // 设置ç»å½é¡µé¢ bean.setLoginUrl("/toLogin"); // ç»å½æååè¦è·³è½¬ç龿¥ //bean.setSuccessUrl("/toIndex"); // è®¾ç½®æªææé¡µé¢ bean.setUnauthorizedUrl("/noauth"); return bean; } /** * å¯ç å¹é åè¯ç®¡çå¨ * * å¯ç æ ¡éªè§åHashedCredentialsMatcher * è¿ä¸ªç±»æ¯ä¸ºäºå¯¹å¯ç è¿è¡ç¼ç ç , * 鲿¢å¯ç 卿°æ®åºéæç ä¿å , å½ç¶å¨ç»é认è¯çæ¶å , * è¿ä¸ªç±»ä¹è´è´£å¯¹forméè¾å ¥çå¯ç è¿è¡ç¼ç * å¤ç认è¯å¹é å¤çå¨ï¼å¦æèªå®ä¹éè¦å®ç°ç»§æ¿HashedCredentialsMatcher */ @Bean(name = "hashedCredentialsMatcher") public HashedCredentialsMatcher hashedCredentialsMatcher() { HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); // æ£åç®æ³:è¿é使ç¨MD5ç®æ³; hashedCredentialsMatcher.setHashAlgorithmName("MD5"); // æ£åçæ¬¡æ°ï¼æ¯å¦æ£å两次ï¼ç¸å½äºmd5(md5("")); hashedCredentialsMatcher.setHashIterations(1024); hashedCredentialsMatcher.setStoredCredentialsHexEncoded(true); return hashedCredentialsMatcher; } /** * å¼å¯shiro aopæ³¨è§£æ¯æ * 使ç¨ä»£çæ¹å¼;æä»¥éè¦å¼å¯ä»£ç æ¯æ * @param securityManager */ @Bean public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){ DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); advisorAutoProxyCreator.setProxyTargetClass(true); return advisorAutoProxyCreator; } @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager){ AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); return authorizationAttributeSourceAdvisor; } /** * å¼å¯cglib代ç */ @Bean public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator(); creator.setProxyTargetClass(true); return creator; } } src/main/java/com/terra/land/controller/ApiController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,169 @@ package com.terra.land.controller; import com.terra.land.entity.LoginInfo; import com.terra.land.entity.Result; import com.terra.land.entity.User; import com.terra.land.service.UserService; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.*; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; /** * LoginController * @author */ @RestController @RequestMapping("/") public class ApiController { @Autowired UserService userService; @RequestMapping("/getName") public User getName(String loginName) { return userService.queryUserByName(loginName); } /** * è·³å°é¦é¡µ * * @return String */ @RequestMapping({"/", "/toIndex"}) public ModelAndView toIndex(ModelAndView mv) { mv.setViewName("index"); User user = (User) SecurityUtils.getSubject().getPrincipal(); if (user != null) { mv.addObject("msg", "Hello " + user.getLoginName() + " !"); } return mv; } /** * è·³å°ç»å½é¡µ * * @return String */ @RequestMapping("/toLogin") public ModelAndView toLogin(ModelAndView mv) { mv.setViewName("login"); return mv; } /** * è·³å°æªææé¡µé¢ * * @return String */ @RequestMapping("/noauth") public ModelAndView toNoAuth(ModelAndView mv) { mv.setViewName("noauth"); return mv; } /** * ç¨äºæµè¯è®°ä½æå认è¯çåºå« * * @return String */ @RequestMapping("/buy") public String buy() { Subject subject = SecurityUtils.getSubject(); // åªæè®¤è¯åæè½è®¿é®ï¼å¦æåªæ¯è®°ä½æåéè¦å ç»å½ if (!subject.isAuthenticated()) { return "redirect:/toLogin"; } return "add"; } /** * ç»å½è®¤è¯ * * @return String */ @RequestMapping("/login") public ModelAndView login(String username, String password, String service, Integer rememberMe) { ModelAndView mv = new ModelAndView(); try { Subject subject = SecurityUtils.getSubject(); // è·å令ç UsernamePasswordToken token = new UsernamePasswordToken(username, password); if (rememberMe != null && rememberMe == 1) { token.setRememberMe(true); } // ç»å½è®¤è¯ subject.login(token); mv.setViewName("index"); if (service != null && service.length() > 0) { mv.addObject("url", service); } else { mv.addObject("msg", username); } } catch (UnknownAccountException e) { // è¿ånullå°±ä¼è¿å ¥è¿é mv.setViewName("login"); mv.addObject("msg", "ç¨æ·åä¸åå¨ï¼"); } catch (IncorrectCredentialsException e) { // å¯ç é误就ä¼è¿å ¥è¿é mv.setViewName("login"); mv.addObject("msg", "å¯ç é误ï¼"); } return mv; } /** * 注é * * @return String */ @RequestMapping("/logout") public ModelAndView logout() { Subject subject = SecurityUtils.getSubject(); subject.logout(); ModelAndView mv = new ModelAndView(); mv.setViewName("login"); return mv; } /** * Ajaxç»å½ * * @param userInfo * @return */ @ResponseBody @RequestMapping(value = "/ajaxLogin", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") public Result ajaxLogin(@RequestBody User userInfo) { try { Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(userInfo.getLoginName(), userInfo.getPassword()); subject.login(token); LoginInfo loginInfo = userService.getLoginInfo(userInfo.getLoginName()); return new Result(200, loginInfo != null ? "ç»å½æå" : "ç»å½å¤±è´¥", loginInfo); } catch (IncorrectCredentialsException e) { return new Result(500, "å¯ç é误"); } catch (LockedAccountException e) { return new Result(500, "ç»å½å¤±è´¥ï¼è¯¥ç¨æ·å·²è¢«å»ç»"); } catch (AuthenticationException e) { return new Result(500, "è¯¥ç¨æ·ä¸åå¨"); } catch (Exception e) { e.printStackTrace(); return new Result(500, e.getMessage()); } } } src/main/java/com/terra/land/entity/LoginInfo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,93 @@ package com.terra.land.entity; import java.io.Serializable; import java.util.Set; /** * LoginInfo * @author */ public class LoginInfo implements Serializable { private Integer uuid; private String name; private String townId; private Set<String> roleList; private Set<String> permissionList; private String token; public LoginInfo() { } public LoginInfo(Set<String> roleList, Set<String> permissionList) { this.roleList = roleList; this.permissionList = permissionList; } public LoginInfo(Integer userId, String userName, Set<String> roleList, Set<String> permissionList) { this.uuid = userId; this.name = userName; this.roleList = roleList; this.permissionList = permissionList; } public String getTownId() { return townId; } public void setTownId(String townId) { this.townId = townId; } public Integer getUuid() { return uuid; } public void setUuid(Integer uuid) { this.uuid = uuid; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public Integer getUserId() { return uuid; } public void setUserId(Integer userId) { this.uuid = userId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<String> getRoleList() { return roleList; } public void setRoleList(Set<String> roleList) { this.roleList = roleList; } public Set<String> getPermissionList() { return permissionList; } public void setPermissionList(Set<String> permissionList) { this.permissionList = permissionList; } } src/main/java/com/terra/land/entity/MyRealm.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,71 @@ package com.terra.land.entity; import com.terra.land.service.UserService; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.*; 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 org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; /** * MyRealm * @author */ public class MyRealm extends AuthorizingRealm { @Autowired UserService userService; /** * æ§è¡ææ * * @param principalCollection * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { // 认è¯ä¹åï¼å¦æå端shiroæ ç¾ä¸æåºç°éè¦æéçæ ç¾ï¼æè è¿æ»¤å¨ä¸æä¸ªé¾æ¥éè¦æéï¼å°±ä¼è¿è¡è®¤è¯ System.out.println("æ§è¡äºææ"); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // è·å¾å½åsubject Subject subject = SecurityUtils.getSubject(); // è·å¾å½åçprincipal,ä¹å°±æ¯è®¤è¯å®åæä»¬æ¾å ¥çä¿¡æ¯ User currentUser = (User) subject.getPrincipal(); // æ·»å æé info.addStringPermission(currentUser.getPerms()); // æ·»å è§è² info.addRole(currentUser.getRole()); return info; } /** * æ§è¡è®¤è¯ * * @param token * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { System.out.println("æ§è¡äºè®¤è¯"); UsernamePasswordToken userToken = (UsernamePasswordToken) token; // 仿°æ®åºä¸æ¥è¯¢è¯¥ç¨æ· User user = userService.queryUserByName(userToken.getUsername()); // 妿ä¸åå¨è¯¥ç¨æ·ï¼è¿åä¸ä¸ªç©ºé误ï¼å端ä¹å¯ä»¥ç¸åºæ¾ç¤ºæç¤º if (user == null) { return null; } // 第ä¸ä¸ªåæ°ä¸ºprincipal;第äºä¸ªåæ°ä¸ºä»æ°æ®åºä¸æ¥åºçç¨äºéªè¯çå¯ç ï¼shiroä¸å¯ç éªè¯ä¸éè¦æä»¬èªå·±å»åï¼ç¬¬ä¸ä¸ªåæ°ä¸ºrealmName return new SimpleAuthenticationInfo(user, user.getPassword(), getName()); } } src/main/java/com/terra/land/entity/Result.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,60 @@ package com.terra.land.entity; /** * Result * @author */ public class Result { public Result() { } public Result(int code, String message) { this.code = code; this.message = message; } public Result(int code, String message, LoginInfo loginInfo) { this.code = code; this.message = message; this.loginInfo = loginInfo; } /** * ååºç¶æç */ private int code; /** * ååºæç¤ºä¿¡æ¯ */ private String message; /** * ååºç»æå¯¹è±¡ */ private LoginInfo loginInfo; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public LoginInfo getData() { return loginInfo; } public void setData(LoginInfo loginInfo) { this.loginInfo = loginInfo; } } src/main/java/com/terra/land/entity/User.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,65 @@ package com.terra.land.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; /** * User * @author */ @Data @AllArgsConstructor @NoArgsConstructor public class User implements Serializable { public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPerms() { return perms; } public void setPerms(String perms) { this.perms = perms; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } private int userId; private String loginName; private String password; private String perms; private String role; } src/main/java/com/terra/land/mapper/UserMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package com.terra.land.mapper; import com.terra.land.entity.User; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; /** * UserMapper * @author */ @Mapper @Repository public interface UserMapper { /** * æ ¹æ®åç§°æ¥è¯¢ç¨æ· * @param loginName * @return */ public User queryUserByName(String loginName); } src/main/java/com/terra/land/service/UserService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,41 @@ package com.terra.land.service; import com.terra.land.entity.LoginInfo; import com.terra.land.entity.User; import com.terra.land.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashSet; import java.util.Set; import java.util.UUID; /** * UserService * @author */ @Service public class UserService implements UserMapper { @Autowired UserMapper userMapper; @Override public User queryUserByName(String loginName) { return userMapper.queryUserByName(loginName); } public LoginInfo getLoginInfo(String loginName) { User user = queryUserByName(loginName); if (null == user) { return null; } Set<String> roleList = new HashSet<>(); Set<String> permissionList = new HashSet<>(); LoginInfo loginInfo = new LoginInfo(user.getUserId(), user.getLoginName(), roleList, permissionList); loginInfo.setToken(UUID.randomUUID().toString()); return loginInfo; } } src/main/resources/application.yml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,47 @@ server: tomcat: uri-encoding: UTF-8 max-threads: 1000 min-spare-threads: 5 port: 9002 context-path: /land spring: datasource: username : postgres password: postgres url : jdbc:postgresql://127.0.0.1:5432/langfang driver-class-name: org.postgresql.Driver type: com.alibaba.druid.pool.DruidDataSource # èªå®ä¹æ°æ®æº #Spring Boot é»è®¤æ¯ä¸æ³¨å ¥è¿äºå±æ§å¼çï¼éè¦èªå·±ç»å® #druid æ°æ®æºä¸æé ç½® initialSize: 5 minIdle: 5 maxActive: 20 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM now() testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true #é ç½®çæ§ç»è®¡æ¦æªçfiltersï¼stat:çæ§ç»è®¡ãlog4jï¼æ¥å¿è®°å½ãwallï¼é²å¾¡sqlæ³¨å ¥ #妿å è®¸æ¶æ¥é java.lang.ClassNotFoundException: org.apache.log4j.Priority #åå¯¼å ¥ log4j ä¾èµå³å¯ï¼Maven å°åï¼https://mvnrepository.com/artifact/log4j/log4j filters: stat,wall,log4j maxPoolPreparedStatementPerConnectionSize: 20 useGlobalDataSourceStat: true connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 #ojdbc: # jdbcUrl: jdbc:postgresql://192.168.20.106:5432/langfang # driverclass: org.postgresql.Driver # username: postgres # password: postgres mybatis: type-aliases-package: com.terra.land.mapper mapper-locations: classpath:mapper/*.xml src/main/resources/log4j.properties
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n # General Apache libraries log4j.logger.org.apache=WARN # Spring log4j.logger.org.springframework=WARN # Default Shiro logging log4j.logger.org.apache.shiro=INFO # Disable verbose logging log4j.logger.org.apache.shiro.util.ThreadContext=WARN log4j.logger.org.apache.shiro.cache.ehcache.EhCache=WARN src/main/resources/mapper/UserMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,9 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.terra.land.mapper.UserMapper"> <select id="queryUserByName" resultType="com.terra.land.entity.User"> select userid,loginname,password from magbg.org_user where loginname=#{loginName} </select> </mapper> src/main/resources/templates/index.html
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> <head> <meta charset="UTF-8"> <title>Landç³»ç»-é¦é¡µ</title> <script> window.onload=function () { var url = document.getElementById("url").value; if (url){ window.location.href = url; } } </script> </head> <body> <h1>é¦é¡µ</h1> <h2 th:text="${msg}"></h2> <input id="url" type="hidden" th:value="${url}"> <div shiro:guest=""> <a th:href="@{/toLogin}">ç»å½</a> </div> <br /> <div shiro:user> <a th:href="@{/logout}">注é</a> </div> </body> </html> ˵Ã÷.txt
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,5 @@ http://localhost:9001/ http://localhost:9001/toIndex http://localhost:9001/toLogin http://localhost:9001/getName?loginName=admin http://localhost:9001/login?username=admin&password=admin&rememberMe=0&service=http://www.baidu.com