├── cas ├── .gitignore ├── src │ ├── main │ │ ├── webapp │ │ │ ├── META-INF │ │ │ │ └── MANIFEST.MF │ │ │ └── WEB-INF │ │ │ │ ├── views │ │ │ │ ├── index.jsp │ │ │ │ └── login.jsp │ │ │ │ └── web.xml │ │ ├── java │ │ │ └── cas │ │ │ │ ├── cdao │ │ │ │ ├── package-info.java │ │ │ │ ├── CacheDao.java │ │ │ │ ├── factory │ │ │ │ │ └── CacheDaoFactory.java │ │ │ │ └── impl │ │ │ │ │ └── RedisCacheDao.java │ │ │ │ ├── dao │ │ │ │ └── UserDao.java │ │ │ │ ├── mq │ │ │ │ ├── receiver │ │ │ │ │ ├── Receiver.java │ │ │ │ │ └── LogoutMessageReceiver.java │ │ │ │ ├── sender │ │ │ │ │ ├── Sender.java │ │ │ │ │ └── LogoutMessageSender.java │ │ │ │ ├── queue │ │ │ │ │ ├── MessageQueue.java │ │ │ │ │ └── RedisMessageQueue.java │ │ │ │ ├── message │ │ │ │ │ ├── Message.java │ │ │ │ │ └── LogoutMessage.java │ │ │ │ └── support │ │ │ │ │ └── LogoutReceiverDispatcher.java │ │ │ │ ├── custom │ │ │ │ └── component │ │ │ │ │ ├── session │ │ │ │ │ ├── CustomSessionProcessor.java │ │ │ │ │ ├── DefaultCacheHttpSession.java │ │ │ │ │ ├── HttpSessionWrapper.java │ │ │ │ │ └── BufferedCacheHttpSession.java │ │ │ │ │ ├── factory │ │ │ │ │ └── CacheHttpSessionFactory.java │ │ │ │ │ └── request │ │ │ │ │ └── CustomHttpServletRequest.java │ │ │ │ ├── service │ │ │ │ └── UserService.java │ │ │ │ ├── support │ │ │ │ └── ConfigLoader.java │ │ │ │ ├── mapping │ │ │ │ └── UserMapping.xml │ │ │ │ ├── models │ │ │ │ └── User.java │ │ │ │ ├── utils │ │ │ │ ├── QRCodeUtils.java │ │ │ │ ├── CookieUtil.java │ │ │ │ ├── RedisUtil.java │ │ │ │ ├── JsonUtils.java │ │ │ │ └── HttpRequest.java │ │ │ │ ├── controller │ │ │ │ ├── PublicController.java │ │ │ │ └── SystemController.java │ │ │ │ └── filter │ │ │ │ ├── LoginInterceptor.java │ │ │ │ ├── AuthenticationFilter.java │ │ │ │ └── CacheSessionFilter.java │ │ └── resources │ │ │ ├── jdbc.properties │ │ │ ├── cas-config.properties │ │ │ ├── table-user.sql │ │ │ ├── logback.xml │ │ │ ├── spring-component.xml │ │ │ ├── spring-mybatis.xml │ │ │ └── springmvc.xml │ └── test │ │ └── java │ │ └── cas │ │ └── test │ │ ├── component │ │ ├── DefaultCacheHttpSessionTest.java │ │ ├── Person.java │ │ ├── BufferedCacheHttpSessionTest.java │ │ └── QRCodeTest.java │ │ └── service │ │ └── UserServiceTest.java └── pom.xml ├── CasAndroidClient ├── app │ ├── .gitignore │ ├── libs │ │ ├── core-3.0.0.jar │ │ └── javase-3.0.0.jar │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── values │ │ │ │ │ ├── strings.xml │ │ │ │ │ ├── colors.xml │ │ │ │ │ ├── dimens.xml │ │ │ │ │ ├── ids.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── raw │ │ │ │ │ └── beep.ogg │ │ │ │ ├── drawable │ │ │ │ │ ├── url.png │ │ │ │ │ ├── ic_scan_album.png │ │ │ │ │ ├── ic_scan_black.png │ │ │ │ │ ├── ic_scan_green.png │ │ │ │ │ ├── ic_scan_light.png │ │ │ │ │ ├── ic_scan_line.png │ │ │ │ │ ├── ic_scan_white.png │ │ │ │ │ ├── ic_scan_top_left.png │ │ │ │ │ ├── global_loading_bg.png │ │ │ │ │ ├── ic_arrow_left_white.png │ │ │ │ │ ├── ic_scan_bottom_left.png │ │ │ │ │ ├── ic_scan_light_off.png │ │ │ │ │ ├── ic_scan_top_right.png │ │ │ │ │ ├── ic_scan_bottom_right.png │ │ │ │ │ ├── global_progressbar_loading.png │ │ │ │ │ ├── loading_gray_ani.xml │ │ │ │ │ ├── selector_scan_light.xml │ │ │ │ │ └── shape_circle_black.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── menu │ │ │ │ │ └── main_menu.xml │ │ │ │ ├── values-w820dp │ │ │ │ │ └── dimens.xml │ │ │ │ └── layout │ │ │ │ │ ├── progress_loding_layout.xml │ │ │ │ │ ├── activity_main.xml │ │ │ │ │ ├── activity_login.xml │ │ │ │ │ └── activity_capture.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── casandroidclient │ │ │ │ │ ├── component │ │ │ │ │ ├── CustomAlertDialogFactory.java │ │ │ │ │ ├── DecodeFormatManager.java │ │ │ │ │ ├── LoadingDialog.java │ │ │ │ │ ├── PreviewCallback.java │ │ │ │ │ ├── OpenCameraInterface.java │ │ │ │ │ ├── DecodeThread.java │ │ │ │ │ ├── AutoFocusManager.java │ │ │ │ │ ├── DecodeHandler.java │ │ │ │ │ ├── CameraManager.java │ │ │ │ │ └── CameraConfigurationManager.java │ │ │ │ │ ├── LoginActivity.java │ │ │ │ │ ├── utils │ │ │ │ │ ├── SharedPreferenceUtils.java │ │ │ │ │ ├── HttpRequest.java │ │ │ │ │ ├── InactivityTimer.java │ │ │ │ │ ├── CaptureActivityHandler.java │ │ │ │ │ └── BeepManager.java │ │ │ │ │ └── MainActivity.java │ │ │ └── AndroidManifest.xml │ │ ├── test │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── casandroidclient │ │ │ │ └── ExampleUnitTest.java │ │ └── androidTest │ │ │ └── java │ │ │ └── com │ │ │ └── casandroidclient │ │ │ └── ApplicationTest.java │ ├── proguard-rules.pro │ └── build.gradle ├── settings.gradle ├── .gitignore ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── build.gradle ├── gradle.properties ├── gradlew.bat └── gradlew ├── client ├── WebRoot │ ├── WEB-INF │ │ ├── classes │ │ │ └── .gitignore │ │ ├── lib │ │ │ ├── fastjson-1.2.5.jar │ │ │ └── commons-lang-2.6.jar │ │ └── web.xml │ ├── META-INF │ │ └── MANIFEST.MF │ └── index.jsp └── src │ └── client │ ├── model │ └── User.java │ ├── listener │ └── SessionLifecycleListener.java │ ├── cas │ └── component │ │ └── LogedSessionManager.java │ ├── filter │ ├── LogoutFilter.java │ └── AuthenticationFilter.java │ └── utils │ ├── JsonUtils.java │ └── HttpRequest.java ├── .gitignore └── README.md /cas/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /CasAndroidClient/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /CasAndroidClient/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /client/WebRoot/WEB-INF/classes/.gitignore: -------------------------------------------------------------------------------- 1 | /client 2 | -------------------------------------------------------------------------------- /client/WebRoot/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Class-Path: 3 | 4 | -------------------------------------------------------------------------------- /cas/src/main/webapp/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Class-Path: 3 | 4 | -------------------------------------------------------------------------------- /CasAndroidClient/app/libs/core-3.0.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/libs/core-3.0.0.jar -------------------------------------------------------------------------------- /CasAndroidClient/app/libs/javase-3.0.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/libs/javase-3.0.0.jar -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | CasAndroidClient 3 | 4 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/raw/beep.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/raw/beep.ogg -------------------------------------------------------------------------------- /cas/src/main/java/cas/cdao/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Cache Data Access Object 缓存数据访问对象 3 | * @author ChengPan 4 | */ 5 | package cas.cdao; -------------------------------------------------------------------------------- /client/WebRoot/WEB-INF/lib/fastjson-1.2.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/client/WebRoot/WEB-INF/lib/fastjson-1.2.5.jar -------------------------------------------------------------------------------- /cas/src/main/resources/jdbc.properties: -------------------------------------------------------------------------------- 1 | url=jdbc\:mysql\://127.0.0.1\:3306/java 2 | username=root 3 | password=root 4 | driver=com.mysql.jdbc.Driver -------------------------------------------------------------------------------- /client/WebRoot/WEB-INF/lib/commons-lang-2.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/client/WebRoot/WEB-INF/lib/commons-lang-2.6.jar -------------------------------------------------------------------------------- /CasAndroidClient/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/url.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/url.png -------------------------------------------------------------------------------- /CasAndroidClient/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/ic_scan_album.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/ic_scan_album.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/ic_scan_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/ic_scan_black.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/ic_scan_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/ic_scan_green.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/ic_scan_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/ic_scan_light.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/ic_scan_line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/ic_scan_line.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/ic_scan_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/ic_scan_white.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/ic_scan_top_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/ic_scan_top_left.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /cas/src/main/resources/cas-config.properties: -------------------------------------------------------------------------------- 1 | cache.dao.impl.class=cas.cdao.impl.RedisCacheDao 2 | cache.httpsession.impl.class=cas.custom.component.session.DefaultCacheHttpSession -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/global_loading_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/global_loading_bg.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/ic_arrow_left_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/ic_arrow_left_white.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/ic_scan_bottom_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/ic_scan_bottom_left.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/ic_scan_light_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/ic_scan_light_off.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/ic_scan_top_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/ic_scan_top_right.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/ic_scan_bottom_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/ic_scan_bottom_right.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/global_progressbar_loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nameof/redis-session/HEAD/CasAndroidClient/app/src/main/res/drawable/global_progressbar_loading.png -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/dao/UserDao.java: -------------------------------------------------------------------------------- 1 | package cas.dao; 2 | 3 | import org.springframework.stereotype.Repository; 4 | 5 | import cas.models.User; 6 | 7 | @Repository 8 | public interface UserDao { 9 | 10 | User getUserByName(String userName); 11 | } 12 | -------------------------------------------------------------------------------- /CasAndroidClient/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Dec 28 10:00:20 PST 2015 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip 7 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/loading_gray_ani.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/menu/main_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/selector_scan_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /client/WebRoot/index.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 3 | 4 | 5 | 6 | 7 | 8 | welcome to client! ${sessionScope.user.name}
9 | 注销登录 10 | 11 | 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.ear 17 | *.zip 18 | *.tar.gz 19 | *.rar 20 | 21 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 22 | hs_err_pid* -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/drawable/shape_circle_black.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /cas/src/main/webapp/WEB-INF/views/index.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 3 | 4 | 5 | 6 | 欢迎 7 | 8 | 9 | welcome ! ${user.name}
10 | 注销登录 11 | 12 | 13 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/test/java/com/casandroidclient/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.casandroidclient; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * To work on unit tests, switch the Test Artifact in the Build Variants view. 9 | */ 10 | public class ExampleUnitTest { 11 | @Test 12 | public void addition_isCorrect() throws Exception { 13 | assertEquals(4, 2 + 2); 14 | } 15 | } -------------------------------------------------------------------------------- /cas/src/main/java/cas/mq/receiver/Receiver.java: -------------------------------------------------------------------------------- 1 | package cas.mq.receiver; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | import cas.mq.message.Message; 7 | 8 | /** 9 | * 消息接收者 10 | * @author ChengPan 11 | */ 12 | public abstract class Receiver { 13 | 14 | protected final Logger logger = LoggerFactory.getLogger(getClass()); 15 | 16 | public abstract void handleMessage(Message message); 17 | } 18 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/mq/sender/Sender.java: -------------------------------------------------------------------------------- 1 | package cas.mq.sender; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | import cas.mq.message.Message; 7 | 8 | /** 9 | * 消息发送者 10 | * 11 | * @author ChengPan 12 | */ 13 | public abstract class Sender { 14 | 15 | protected final Logger logger = LoggerFactory.getLogger(getClass()); 16 | 17 | public abstract void sendMessage(Message message); 18 | } 19 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/androidTest/java/com/casandroidclient/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.casandroidclient; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /cas/src/main/java/cas/custom/component/session/CustomSessionProcessor.java: -------------------------------------------------------------------------------- 1 | package cas.custom.component.session; 2 | 3 | /** 4 | * 5 | * 用于自定义Session的前置、后置处理 6 | * 7 | * @author ChengPan 8 | * 9 | */ 10 | public interface CustomSessionProcessor { 11 | 12 | /** 13 | * 用于自定义Session的初始化工作,例如从缓存中加载已有的Session属性 14 | */ 15 | void initialize(); 16 | 17 | /** 18 | * 用于自定义Session的后置处理工作,例如在请求处理完成之后,将自定义Session的属性提交同步到缓存中 19 | */ 20 | void commit(); 21 | } 22 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/mq/queue/MessageQueue.java: -------------------------------------------------------------------------------- 1 | package cas.mq.queue; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | import cas.mq.message.Message; 7 | 8 | /** 9 | * 消息队列 10 | * 11 | * @author ChengPan 12 | */ 13 | public abstract class MessageQueue { 14 | 15 | protected final Logger logger = LoggerFactory.getLogger(getClass()); 16 | 17 | public abstract void push(Message message); 18 | 19 | public abstract Message pop(); 20 | } 21 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /cas/src/test/java/cas/test/component/DefaultCacheHttpSessionTest.java: -------------------------------------------------------------------------------- 1 | package cas.test.component; 2 | 3 | import org.junit.Test; 4 | 5 | import cas.custom.component.session.DefaultCacheHttpSession; 6 | 7 | public class DefaultCacheHttpSessionTest { 8 | 9 | 10 | @Test 11 | public void testOperatAttribute(){ 12 | DefaultCacheHttpSession session = new DefaultCacheHttpSession(null, "token"); 13 | Person p = new Person("程攀",123); 14 | session.setAttribute("userInfo", p); 15 | System.out.println(session.getAttribute("userInfo").toString()); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/mq/sender/LogoutMessageSender.java: -------------------------------------------------------------------------------- 1 | package cas.mq.sender; 2 | 3 | import cas.mq.message.Message; 4 | import cas.mq.queue.RedisMessageQueue; 5 | 6 | /** 7 | * 注销消息发送者 8 | * 9 | * @author ChengPan 10 | */ 11 | public class LogoutMessageSender extends Sender{ 12 | 13 | private static final String LOGOUT_QUEUE_NAME = "logoutQueue"; 14 | 15 | private static RedisMessageQueue queue = new RedisMessageQueue(LOGOUT_QUEUE_NAME); 16 | 17 | @Override 18 | public void sendMessage(Message message) { 19 | queue.push(message); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /CasAndroidClient/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.0.0' 9 | // NOTE: Do not place your application dependencies here; they belong 10 | // in the individual module build.gradle files 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | jcenter() 17 | } 18 | } 19 | 20 | task clean(type: Delete) { 21 | delete rootProject.buildDir 22 | } 23 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/service/UserService.java: -------------------------------------------------------------------------------- 1 | package cas.service; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Service; 5 | 6 | import cas.dao.UserDao; 7 | import cas.models.User; 8 | 9 | @Service 10 | public class UserService { 11 | @Autowired 12 | private UserDao userDao; 13 | 14 | public User verifyUserLogin(User inputUser) { 15 | User user = userDao.getUserByName(inputUser.getName()); 16 | if (user == null || !user.getPasswd().equals(inputUser.getPasswd())) { 17 | return null; 18 | } 19 | user.setPasswd(null); 20 | return user; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/support/ConfigLoader.java: -------------------------------------------------------------------------------- 1 | package cas.support; 2 | 3 | import java.io.IOException; 4 | import java.util.Properties; 5 | 6 | /** 7 | * 载入cas-config.properties文件中的配置信息 8 | * 9 | * @author ChengPan 10 | */ 11 | public class ConfigLoader { 12 | private ConfigLoader() {} 13 | 14 | private static final Properties properties = new Properties(); 15 | 16 | static { 17 | try { 18 | properties.load(ConfigLoader.class.getResourceAsStream("/cas-config.properties")); 19 | } catch (IOException e) { 20 | throw new RuntimeException("load config error", e); 21 | } 22 | } 23 | 24 | public static String getConfig(String key) { 25 | return properties.getProperty(key); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /CasAndroidClient/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\AndroidSDK/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /CasAndroidClient/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 24 5 | buildToolsVersion "24.0.2" 6 | 7 | defaultConfig { 8 | applicationId "com.casandroidclient" 9 | minSdkVersion 19 10 | targetSdkVersion 24 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:24.2.0' 26 | } 27 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/mapping/UserMapping.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | name, passwd 11 | 12 | 18 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/mq/message/Message.java: -------------------------------------------------------------------------------- 1 | package cas.mq.message; 2 | 3 | import java.io.Serializable; 4 | 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | 8 | /** 9 | * 消息实体,存放消息数据 10 | * 11 | * @author ChengPan 12 | */ 13 | public class Message implements Serializable{ 14 | 15 | private static final long serialVersionUID = 8073211549142445560L; 16 | 17 | protected final Logger logger = LoggerFactory.getLogger(getClass()); 18 | 19 | private String content; 20 | 21 | public Message() {} 22 | 23 | public Message(String content) { 24 | this.content = content; 25 | } 26 | 27 | public String getContent() { 28 | return content; 29 | } 30 | 31 | public void setContent(String content) { 32 | this.content = content; 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/models/User.java: -------------------------------------------------------------------------------- 1 | package cas.models; 2 | 3 | import java.io.Serializable; 4 | 5 | public class User implements Serializable{ 6 | private static final long serialVersionUID = 1L; 7 | private String name; 8 | private String passwd; 9 | 10 | public User() {} 11 | 12 | public User(String name, String passwd) { 13 | super(); 14 | this.name = name; 15 | this.passwd = passwd; 16 | } 17 | public String getName() { 18 | return name; 19 | } 20 | public void setName(String name) { 21 | this.name = name; 22 | } 23 | public String getPasswd() { 24 | return passwd; 25 | } 26 | public void setPasswd(String passwd) { 27 | this.passwd = passwd; 28 | } 29 | 30 | @Override 31 | public String toString() { 32 | return "User [name=" + name + ", passwd=" + passwd + "]"; 33 | } 34 | 35 | 36 | } 37 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/mq/receiver/LogoutMessageReceiver.java: -------------------------------------------------------------------------------- 1 | package cas.mq.receiver; 2 | 3 | import cas.mq.message.LogoutMessage; 4 | import cas.mq.message.Message; 5 | import cas.mq.queue.RedisMessageQueue; 6 | import cas.utils.HttpRequest; 7 | 8 | /** 9 | * 注销消息接收者 10 | * 11 | * @author ChengPan 12 | */ 13 | public class LogoutMessageReceiver extends Receiver{ 14 | 15 | @Override 16 | public void handleMessage(Message message) { 17 | if (message != null) { 18 | LogoutMessage logoutMsg = new LogoutMessage(message); 19 | if (logoutMsg != null && logoutMsg.getLogoutUrls() != null) { 20 | for (String logoutUrl : logoutMsg.getLogoutUrls()) { 21 | logger.debug("{}:{}注销", logoutMsg.getToken(), logoutUrl); 22 | HttpRequest.sendPost(logoutUrl, "token=" + logoutMsg.getToken(), null); 23 | } 24 | } 25 | } 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /client/src/client/model/User.java: -------------------------------------------------------------------------------- 1 | package client.model; 2 | 3 | import java.io.Serializable; 4 | 5 | public class User implements Serializable{ 6 | private static final long serialVersionUID = 1L; 7 | private String name; 8 | private String passwd; 9 | 10 | public User() { 11 | 12 | } 13 | 14 | public User(String name, String passwd) { 15 | super(); 16 | this.name = name; 17 | this.passwd = passwd; 18 | } 19 | public String getName() { 20 | return name; 21 | } 22 | public void setName(String name) { 23 | this.name = name; 24 | } 25 | public String getPasswd() { 26 | return passwd; 27 | } 28 | public void setPasswd(String passwd) { 29 | this.passwd = passwd; 30 | } 31 | 32 | @Override 33 | public String toString() { 34 | return "User [name=" + name + ", passwd=" + passwd + "]"; 35 | } 36 | 37 | 38 | } 39 | -------------------------------------------------------------------------------- /cas/src/test/java/cas/test/component/Person.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package cas.test.component; 5 | 6 | import java.io.Serializable; 7 | 8 | 9 | public class Person implements Serializable{ 10 | private static final long serialVersionUID = 1L; 11 | 12 | private String name; 13 | private int age; 14 | 15 | public Person() { 16 | } 17 | 18 | public Person(String name, int age) { 19 | super(); 20 | this.name = name; 21 | this.age = age; 22 | } 23 | public String getName() { 24 | return name; 25 | } 26 | public void setName(String name) { 27 | this.name = name; 28 | } 29 | public int getAge() { 30 | return age; 31 | } 32 | public void setAge(int age) { 33 | this.age = age; 34 | } 35 | @Override 36 | public String toString() { 37 | return "Person [name=" + name + ", age=" + age + "]"; 38 | } 39 | 40 | 41 | } 42 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/mq/queue/RedisMessageQueue.java: -------------------------------------------------------------------------------- 1 | package cas.mq.queue; 2 | 3 | import java.util.List; 4 | 5 | import cas.mq.message.Message; 6 | import cas.utils.JsonUtils; 7 | import cas.utils.RedisUtil; 8 | 9 | /** 10 | * 基于Redis的list数据结构实现的消息队列 11 | * 12 | * @author ChengPan 13 | */ 14 | public class RedisMessageQueue extends MessageQueue { 15 | 16 | private final String queueName; 17 | 18 | public RedisMessageQueue(String queueName) { 19 | this.queueName = queueName; 20 | } 21 | 22 | @Override 23 | public void push(Message message) { 24 | RedisUtil.getJedis().lpush(queueName, JsonUtils.toJSONString(message)); 25 | } 26 | 27 | @Override 28 | public Message pop() { 29 | //redis阻塞操作队列,获取成功返回2个元素,第一个是list的key,第二个是值 30 | List list = RedisUtil.getJedis().brpop(0, queueName); 31 | return JsonUtils.toBean(list.get(1), Message.class); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /client/src/client/listener/SessionLifecycleListener.java: -------------------------------------------------------------------------------- 1 | package client.listener; 2 | 3 | import javax.servlet.http.HttpSession; 4 | import javax.servlet.http.HttpSessionEvent; 5 | import javax.servlet.http.HttpSessionListener; 6 | 7 | import client.cas.component.LogedSessionManager; 8 | 9 | /** 10 | * 监听session的过期或销毁,从{@link client.cas.component.LogedSessionManager}中移除session 11 | * 12 | * @author ChengPan 13 | */ 14 | public class SessionLifecycleListener implements HttpSessionListener{ 15 | 16 | @Override 17 | public void sessionCreated(HttpSessionEvent arg0) { 18 | 19 | } 20 | 21 | @Override 22 | public void sessionDestroyed(HttpSessionEvent event) { 23 | HttpSession session = event.getSession(); 24 | String token = (String) session.getAttribute("token"); 25 | if (token != null) { 26 | LogedSessionManager.detach(token.toString()); 27 | } 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/java/com/casandroidclient/component/CustomAlertDialogFactory.java: -------------------------------------------------------------------------------- 1 | package com.casandroidclient.component; 2 | 3 | import android.app.ProgressDialog; 4 | import android.content.Context; 5 | import android.text.TextUtils; 6 | 7 | /** 8 | * @author clarechen 2014-10-28 对话框生成器 9 | */ 10 | public class CustomAlertDialogFactory { 11 | 12 | /** 13 | * 创建弹出loading框 14 | * 15 | * @param context 16 | * @param message 提示信息,默认为"请稍候..." 17 | * @param cancelable 是否可退出 18 | * @return 19 | */ 20 | public static ProgressDialog createProgressDialog(Context context, 21 | String message, boolean cancelable) { 22 | String msg = TextUtils.isEmpty(message) ? "正在加载..." : message; 23 | LoadingDialog dlg = new LoadingDialog(context, msg); 24 | dlg.setCancelable(cancelable); 25 | return dlg; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /CasAndroidClient/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true -------------------------------------------------------------------------------- /cas/src/main/java/cas/utils/QRCodeUtils.java: -------------------------------------------------------------------------------- 1 | package cas.utils; 2 | 3 | import java.io.IOException; 4 | import java.io.OutputStream; 5 | 6 | import com.google.zxing.BarcodeFormat; 7 | import com.google.zxing.WriterException; 8 | import com.google.zxing.client.j2se.MatrixToImageWriter; 9 | import com.google.zxing.common.BitMatrix; 10 | import com.google.zxing.qrcode.QRCodeWriter; 11 | 12 | public class QRCodeUtils { 13 | 14 | public static void writeQRcodeToStream(String content, OutputStream stream) throws WriterException, IOException { 15 | try { 16 | int width = 500; // 图像宽度 17 | int height = 500; // 图像高度 18 | QRCodeWriter writer = new QRCodeWriter(); 19 | BitMatrix m = writer.encode(content, BarcodeFormat.QR_CODE, width, 20 | height); 21 | MatrixToImageWriter.writeToStream(m, "png", stream); 22 | } finally { 23 | if (stream != null) { 24 | stream.flush(); 25 | stream.close(); 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /cas/src/main/resources/table-user.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : CP_mysql 5 | Source Server Version : 50540 6 | Source Host : localhost:3306 7 | Source Database : java 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50540 11 | File Encoding : 65001 12 | 13 | Date: 2017-12-09 10:08:20 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for user 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `user`; 22 | CREATE TABLE `user` ( 23 | `id` int(11) NOT NULL AUTO_INCREMENT, 24 | `name` char(255) DEFAULT NULL, 25 | `passwd` varchar(255) DEFAULT NULL, 26 | PRIMARY KEY (`id`) 27 | ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf-8; 28 | 29 | -- ---------------------------- 30 | -- Records of user 31 | -- ---------------------------- 32 | INSERT INTO `user` VALUES ('1', '123', '123'); 33 | -------------------------------------------------------------------------------- /client/src/client/cas/component/LogedSessionManager.java: -------------------------------------------------------------------------------- 1 | package client.cas.component; 2 | 3 | import java.util.Map; 4 | import java.util.concurrent.ConcurrentHashMap; 5 | import javax.servlet.http.HttpSession; 6 | 7 | /** 8 | * 持有已登录的会话session,以便于在session过期,或{@link client.filter.LogoutFilter}收到注销请求时 9 | * 根据session中存储的token,或注销请求传递过来的token,将集合中的session取出,进行销毁 10 | * 11 | * @author ChengPan 12 | */ 13 | public class LogedSessionManager { 14 | 15 | private LogedSessionManager() {} 16 | 17 | private static final Map logedSessions = new ConcurrentHashMap<>(); 18 | 19 | public static void attach(String token, HttpSession session) { 20 | logedSessions.put(token, session); 21 | } 22 | 23 | public static HttpSession detach(String token) { 24 | return logedSessions.remove(token); 25 | } 26 | 27 | public static HttpSession get(String token) { 28 | if (token == null) 29 | return null; 30 | return logedSessions.get(token); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/cdao/CacheDao.java: -------------------------------------------------------------------------------- 1 | package cas.cdao; 2 | 3 | import java.util.Enumeration; 4 | import java.util.Map; 5 | 6 | public interface CacheDao { 7 | 8 | Map getAllAttribute(String key); 9 | 10 | void setAllAttributes(String key, Map attributes); 11 | 12 | Object getAttribute(String key, String fieldName); 13 | 14 | void setAttribute(String key, String fieldName, Object value); 15 | 16 | void removeAttribute(String token, String name); 17 | 18 | Enumeration getAttributeNames(String key); 19 | 20 | String[] getValueNames(String key); 21 | 22 | void del(String key); 23 | 24 | void setExpire(String key, int expire); 25 | 26 | Long getExpire(String key); 27 | 28 | /** 29 | * 设置key永不过期 30 | * @param key 31 | */ 32 | void setPersist(String key); 33 | 34 | boolean exists(String key); 35 | 36 | void setWithExpire(String key, Object value, int expire); 37 | 38 | Object get(String key); 39 | } 40 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/cdao/factory/CacheDaoFactory.java: -------------------------------------------------------------------------------- 1 | package cas.cdao.factory; 2 | 3 | import cas.cdao.CacheDao; 4 | import cas.support.ConfigLoader; 5 | 6 | /** 7 | * 根据{@link cas.support.ConfigLoader}获取CacheDao实现类配置,实例化CacheDao 8 | * 9 | * @author ChengPan 10 | */ 11 | public class CacheDaoFactory { 12 | private CacheDaoFactory() {} 13 | 14 | private static final Class clazz; 15 | 16 | private static final String CACHE_DAO_IMPL_CLASS_KEY = "cache.dao.impl.class"; 17 | 18 | static { 19 | try { 20 | clazz = Class 21 | .forName(ConfigLoader.getConfig(CACHE_DAO_IMPL_CLASS_KEY)); 22 | } 23 | catch (ClassNotFoundException e) { 24 | throw new RuntimeException("can not found CacheDao class", e); 25 | } 26 | } 27 | 28 | public static CacheDao newCacheDaoInstance() { 29 | try { 30 | return (CacheDao) clazz.newInstance(); 31 | } 32 | catch (InstantiationException e) { 33 | throw new RuntimeException(e); 34 | } 35 | catch (IllegalAccessException e) { 36 | throw new RuntimeException(e); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /cas/src/test/java/cas/test/service/UserServiceTest.java: -------------------------------------------------------------------------------- 1 | package cas.test.service; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | import org.junit.Test; 6 | import org.junit.runner.RunWith; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.test.context.ContextConfiguration; 9 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 10 | 11 | import cas.models.User; 12 | import cas.service.UserService; 13 | 14 | @RunWith(SpringJUnit4ClassRunner.class) 15 | @ContextConfiguration({"classpath:spring-mybatis.xml"}) 16 | public class UserServiceTest { 17 | 18 | @Autowired 19 | private UserService userService; 20 | 21 | @Test 22 | public void testGetUser(){ 23 | System.out.println(userService.verifyUserLogin(new User("cp", "123"))); 24 | } 25 | 26 | @Test 27 | public void testProxyObject(){ 28 | System.out.println(userService); 29 | Method[] methods = userService.getClass().getMethods(); 30 | for(Method m : methods){ 31 | System.out.println(m.getName()); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /cas/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | cas 4 | 5 | 6 | 7 | 8 | %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 9 | 10 | 11 | 12 | 13 | ${logDir}/cas_current.log 14 | 15 | ${logDir}/cas_%d{yyyy-MM-dd}.log.zip 16 | 17 | 18 | %d{yyyy-MM-dd HH:mm:ss}[%-5level][%thread]%logger{36} - %msg%n 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/layout/progress_loding_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 18 | 19 | 28 | 29 | -------------------------------------------------------------------------------- /client/WebRoot/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | client 4 | 5 | index.jsp 6 | 7 | 8 | 9 | client.listener.SessionLifecycleListener 10 | 11 | 12 | 13 | logoutFilter 14 | client.filter.LogoutFilter 15 | 16 | 17 | logoutFilter 18 | /logout 19 | 20 | 21 | 22 | authenticationFilter 23 | client.filter.AuthenticationFilter 24 | 25 | 26 | authenticationFilter 27 | /* 28 | 29 | -------------------------------------------------------------------------------- /cas/src/main/java/cas/controller/PublicController.java: -------------------------------------------------------------------------------- 1 | package cas.controller; 2 | 3 | import java.io.IOException; 4 | 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | import javax.servlet.http.HttpSession; 8 | 9 | import org.springframework.stereotype.Controller; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | 12 | import cas.utils.QRCodeUtils; 13 | 14 | import com.alibaba.fastjson.JSONObject; 15 | import com.google.zxing.WriterException; 16 | 17 | @Controller 18 | @RequestMapping("/public") 19 | public class PublicController { 20 | 21 | /** 22 | * 生成带有会话id的二维码供客户端登录 23 | * @param response 24 | * @param request 25 | * @param session 26 | * @throws WriterException 27 | * @throws IOException 28 | */ 29 | @RequestMapping("loginQRCode") 30 | public void loginQRCode(HttpServletResponse response, HttpServletRequest request, 31 | HttpSession session) throws WriterException, IOException { 32 | JSONObject json = new JSONObject(); 33 | json.put("sessionid", session.getId()); 34 | QRCodeUtils.writeQRcodeToStream(json.toJSONString(), response.getOutputStream()); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /CasAndroidClient/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 20 | /> 21 |