sunlightcs пре 7 година
родитељ
комит
79d5acb877

+ 8 - 0
pom-war.xml

@@ -170,6 +170,14 @@
                     <fork>true</fork>
                 </configuration>
             </plugin>
+            <!-- 跳过单元测试 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 

+ 10 - 8
pom.xml

@@ -4,14 +4,14 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>io.renren</groupId>
 	<artifactId>renren-fast</artifactId>
-	<version>1.0.0</version>
+	<version>1.2.0</version>
 	<packaging>jar</packaging>
 	<description>renren-fast</description>
 
 	<parent>
 		<groupId>org.springframework.boot</groupId>
 		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>1.5.4.RELEASE</version>
+		<version>1.5.6.RELEASE</version>
 	</parent>
 
 	<properties>
@@ -28,7 +28,6 @@
 		<commons.codec.version>1.10</commons.codec.version>
 		<commons.configuration.version>1.10</commons.configuration.version>
 		<shiro.version>1.3.2</shiro.version>
-		<kaptcha.version>0.0.9</kaptcha.version>
 		<qiniu.version>[7.2.0, 7.2.99]</qiniu.version>
 		<aliyun.oss.version>2.5.0</aliyun.oss.version>
 		<qcloud.cos.version>4.4</qcloud.cos.version>
@@ -135,11 +134,6 @@
 			<version>${shiro.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>com.github.axet</groupId>
-			<artifactId>kaptcha</artifactId>
-			<version>${kaptcha.version}</version>
-		</dependency>
-		<dependency>
 			<groupId>com.qiniu</groupId>
 			<artifactId>qiniu-java-sdk</artifactId>
 			<version>${qiniu.version}</version>
@@ -178,6 +172,14 @@
 					<fork>true</fork>
 				</configuration>
 			</plugin>
+			<!-- 跳过单元测试 -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<configuration>
+					<skipTests>true</skipTests>
+				</configuration>
+			</plugin>
 			<plugin>
 				<groupId>org.codehaus.mojo</groupId>
 				<artifactId>wagon-maven-plugin</artifactId>

+ 3 - 3
src/main/java/io/renren/common/utils/Constant.java

@@ -34,7 +34,7 @@ public class Constant {
 
         private int value;
 
-        private MenuType(int value) {
+        MenuType(int value) {
             this.value = value;
         }
 
@@ -62,7 +62,7 @@ public class Constant {
 
         private int value;
 
-        private ScheduleStatus(int value) {
+        ScheduleStatus(int value) {
             this.value = value;
         }
         
@@ -90,7 +90,7 @@ public class Constant {
 
         private int value;
 
-        private CloudService(int value) {
+        CloudService(int value) {
             this.value = value;
         }
 

+ 1 - 1
src/main/java/io/renren/common/xss/XssHttpServletRequestWrapper.java

@@ -34,7 +34,7 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
     @Override
     public ServletInputStream getInputStream() throws IOException {
         //非json类型,直接返回
-        if(!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)){
+        if(!MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(super.getHeader(HttpHeaders.CONTENT_TYPE))){
             return super.getInputStream();
         }
 

+ 0 - 32
src/main/java/io/renren/config/KaptchaConfig.java

@@ -1,32 +0,0 @@
-package io.renren.config;
-
-import com.google.code.kaptcha.impl.DefaultKaptcha;
-import com.google.code.kaptcha.util.Config;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import java.util.Properties;
-
-
-/**
- * 生成验证码配置
- *
- * @author chenshun
- * @email sunlightcs@gmail.com
- * @date 2017-04-20 19:22
- */
-@Configuration
-public class KaptchaConfig {
-
-    @Bean
-    public DefaultKaptcha producer() {
-        Properties properties = new Properties();
-        properties.put("kaptcha.border", "no");
-        properties.put("kaptcha.textproducer.font.color", "black");
-        properties.put("kaptcha.textproducer.char.space", "5");
-        Config config = new Config(properties);
-        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
-        defaultKaptcha.setConfig(config);
-        return defaultKaptcha;
-    }
-}

+ 1 - 3
src/main/java/io/renren/config/ShiroConfig.java

@@ -32,8 +32,7 @@ public class ShiroConfig {
     public SessionManager sessionManager(){
         DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
         sessionManager.setSessionValidationSchedulerEnabled(true);
-        //sessionManager.setSessionIdUrlRewritingEnabled(false);
-        //sessionManager.setSessionIdCookieEnabled(false);
+        sessionManager.setSessionIdCookieEnabled(false);
         return sessionManager;
     }
 
@@ -68,7 +67,6 @@ public class ShiroConfig {
         filterMap.put("/plugins/**", "anon");
         filterMap.put("/swagger/**", "anon");
         filterMap.put("/favicon.ico", "anon");
-        filterMap.put("/captcha.jpg", "anon");
         filterMap.put("/", "anon");
         filterMap.put("/**", "oauth2");
         shiroFilter.setFilterChainDefinitionMap(filterMap);

+ 23 - 0
src/main/java/io/renren/dynamicdatasource/DataSourceContext.java

@@ -0,0 +1,23 @@
+package io.renren.dynamicdatasource;
+
+/**
+ * 增加多数据源,在此配置
+ *
+ * @author chenshun
+ * @email sunlightcs@gmail.com
+ * @date 2017/8/18 23:46
+ */
+public enum DataSourceContext {
+    FIRST("first"),
+    SECOND("second");
+
+    private String name;
+
+    DataSourceContext(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 41 - 0
src/main/java/io/renren/dynamicdatasource/DynamicDataSource.java

@@ -0,0 +1,41 @@
+package io.renren.dynamicdatasource;
+
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 动态数据源
+ * @author chenshun
+ * @email sunlightcs@gmail.com
+ * @date 2017/8/19 1:03
+ */
+public class DynamicDataSource extends AbstractRoutingDataSource {
+    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
+
+    public DynamicDataSource(DataSource defaultTargetDataSource, Map<String, DataSource> targetDataSources) {
+        super.setDefaultTargetDataSource(defaultTargetDataSource);
+        super.setTargetDataSources(new HashMap<>(targetDataSources));
+        super.afterPropertiesSet();
+    }
+
+    @Override
+    protected Object determineCurrentLookupKey() {
+        return getDataSource();
+    }
+
+    public static void setDataSource(String dataSource) {
+        contextHolder.set(dataSource);
+    }
+
+    public static String getDataSource() {
+        return contextHolder.get();
+    }
+
+    public static void clearDataSource() {
+        contextHolder.remove();
+    }
+
+}

+ 42 - 0
src/main/java/io/renren/dynamicdatasource/DynamicDataSourceConfig.java

@@ -0,0 +1,42 @@
+package io.renren.dynamicdatasource;
+
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 配置多数据源
+ * @author chenshun
+ * @email sunlightcs@gmail.com
+ * @date 2017/8/19 0:41
+ */
+@Configuration
+public class DynamicDataSourceConfig {
+
+    @Bean
+    @ConfigurationProperties("spring.datasource.druid.first")
+    public DataSource firstDataSource(){
+        return DruidDataSourceBuilder.create().build();
+    }
+
+    @Bean
+    @ConfigurationProperties("spring.datasource.druid.second")
+    public DataSource secondDataSource(){
+        return DruidDataSourceBuilder.create().build();
+    }
+
+    @Bean
+    @Primary
+    public DynamicDataSource dataSource(DataSource firstDataSource, DataSource secondDataSource) {
+        Map<String, DataSource> targetDataSources = new HashMap<>();
+        targetDataSources.put(DataSourceContext.FIRST.getName(), firstDataSource);
+        targetDataSources.put(DataSourceContext.SECOND.getName(), secondDataSource);
+        return new DynamicDataSource(firstDataSource, targetDataSources);
+    }
+}

+ 1 - 34
src/main/java/io/renren/modules/sys/controller/SysLoginController.java

@@ -1,24 +1,15 @@
 package io.renren.modules.sys.controller;
 
-import com.google.code.kaptcha.Constants;
-import com.google.code.kaptcha.Producer;
 import io.renren.common.utils.R;
-import io.renren.common.utils.ShiroUtils;
 import io.renren.modules.sys.entity.SysUserEntity;
 import io.renren.modules.sys.service.SysUserService;
 import io.renren.modules.sys.service.SysUserTokenService;
-import org.apache.commons.io.IOUtils;
 import org.apache.shiro.crypto.hash.Sha256Hash;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.imageio.ImageIO;
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletResponse;
-import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.util.Map;
 
@@ -32,39 +23,15 @@ import java.util.Map;
 @RestController
 public class SysLoginController extends AbstractController {
 	@Autowired
-	private Producer producer;
-	@Autowired
 	private SysUserService sysUserService;
 	@Autowired
 	private SysUserTokenService sysUserTokenService;
 
-	@RequestMapping("captcha.jpg")
-	public void captcha(HttpServletResponse response)throws ServletException, IOException {
-		response.setHeader("Cache-Control", "no-store, no-cache");
-		response.setContentType("image/jpeg");
-
-		//生成文字验证码
-		String text = producer.createText();
-		//生成图片验证码
-		BufferedImage image = producer.createImage(text);
-		//保存到shiro session
-		ShiroUtils.setSessionAttribute(Constants.KAPTCHA_SESSION_KEY, text);
-
-		ServletOutputStream out = response.getOutputStream();
-		ImageIO.write(image, "jpg", out);
-		IOUtils.closeQuietly(out);
-	}
-
 	/**
 	 * 登录
 	 */
 	@RequestMapping(value = "/sys/login", method = RequestMethod.POST)
-	public Map<String, Object> login(String username, String password, String captcha)throws IOException {
-		String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
-		if(!captcha.equalsIgnoreCase(kaptcha)){
-			return R.error("验证码不正确");
-		}
-
+	public Map<String, Object> login(String username, String password)throws IOException {
 		//用户信息
 		SysUserEntity user = sysUserService.queryByUserName(username);
 

+ 8 - 3
src/main/resources/application-dev.yml

@@ -2,10 +2,15 @@ spring:
     datasource:
         type: com.alibaba.druid.pool.DruidDataSource
         driverClassName: com.mysql.jdbc.Driver
-        url: jdbc:mysql://localhost:3306/renren_fast?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
-        username: renren
-        password: 123456
         druid:
+            first:  #数据源1
+                url: jdbc:mysql://localhost:3306/renren_fast?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+                username: renren
+                password: 123456
+            second:  #数据源2
+                url: jdbc:mysql://localhost:3306/bdshop?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+                username: renren
+                password: 123456
             initial-size: 10
             max-active: 100
             min-idle: 10

+ 8 - 3
src/main/resources/application-pro.yml

@@ -2,10 +2,15 @@ spring:
     datasource:
         type: com.alibaba.druid.pool.DruidDataSource
         driverClassName: com.mysql.jdbc.Driver
-        url: jdbc:mysql://localhost:3306/renren_fast?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
-        username: renren
-        password: 123456
         druid:
+            first:
+                url: jdbc:mysql://localhost:3306/renren_fast?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+                username: renren
+                password: 123456
+            second:
+                url: jdbc:mysql://localhost:3306/renren_fast?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+                username: renren
+                password: 123456
             initial-size: 10
             max-active: 100
             min-idle: 10

+ 8 - 3
src/main/resources/application-test.yml

@@ -2,10 +2,15 @@ spring:
     datasource:
         type: com.alibaba.druid.pool.DruidDataSource
         driverClassName: com.mysql.jdbc.Driver
-        url: jdbc:mysql://localhost:3306/renren_fast?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
-        username: renren
-        password: 123456
         druid:
+            first:
+                url: jdbc:mysql://localhost:3306/renren_fast?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+                username: renren
+                password: 123456
+            second:
+                url: jdbc:mysql://localhost:3306/renren_fast?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
+                username: renren
+                password: 123456
             initial-size: 10
             max-active: 100
             min-idle: 10

+ 2 - 2
src/main/resources/application.yml

@@ -5,9 +5,9 @@ server:
         max-threads: 1000
         min-spare-threads: 30
     port: 80
-    #servlet-path: /renren-fast
+    #打开注释,则通过【http://localhost/renren-fast】访问
+    #context-path: /renren-fast
 
-# mysql
 spring:
     # 环境 dev|test|pro
     profiles:

+ 1 - 1
src/main/resources/views/index.html

@@ -88,7 +88,7 @@
 
   <footer class="main-footer">
     <div class="pull-right hidden-xs">
-      Version 1.0.0
+      Version 1.2.0
     </div>
     Copyright &copy; 2017 <a href="http://www.renren.io" target="_blank">renren.io</a> All Rights Reserved
   </footer>

+ 3 - 18
src/main/resources/views/login.html

@@ -37,17 +37,9 @@
           <span class="glyphicon glyphicon-user form-control-feedback"></span>
       </div>
       <div class="form-group has-feedback">
-          <input type="password" class="form-control" v-model="password" placeholder="密码">
+          <input type="password" class="form-control" v-model="password" @keyup.enter="login" placeholder="密码">
           <span class="glyphicon glyphicon-lock form-control-feedback"></span>
       </div>
-      <div class="form-group has-feedback">
-          <input type="text" class="form-control" v-model="captcha" @keyup.enter="login" placeholder="验证码">
-          <span class="glyphicon glyphicon-warning-sign form-control-feedback"></span>
-      </div>
-      <div class="form-group has-feedback">
-          <img alt="如果看不清楚,请单击图片刷新!" class="pointer" :src="src" @click="refreshCode">
-          &nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:;" @click="refreshCode">点击刷新</a>
-      </div>
 
       <div class="row">
         <div class="col-xs-8">
@@ -78,10 +70,8 @@ var vm = new Vue({
 	data:{
 		username: '',
 		password: '',
-        captcha: '',
 		error: false,
-		errorMsg: '',
-        src: 'captcha.jpg'
+		errorMsg: ''
 	},
 	beforeCreate: function(){
 		if(self != top){
@@ -89,11 +79,8 @@ var vm = new Vue({
 		}
 	},
 	methods: {
-        refreshCode: function(){
-            this.src = "captcha.jpg?t=" + $.now();
-        },
 		login: function () {
-            var data = "username="+vm.username+"&password="+vm.password+"&captcha="+vm.captcha;
+            var data = "username="+vm.username+"&password="+vm.password;
 			$.ajax({
 				type: "POST",
 			    url: baseURL + "sys/login",
@@ -106,8 +93,6 @@ var vm = new Vue({
 					}else{
 						vm.error = true;
 						vm.errorMsg = r.msg;
-
-                        vm.refreshCode();
 					}
 				}
 			});

+ 31 - 0
src/test/java/io/renren/DynamicDataSourceTest.java

@@ -0,0 +1,31 @@
+package io.renren;
+
+import io.renren.dynamicdatasource.DataSourceContext;
+import io.renren.dynamicdatasource.DynamicDataSource;
+import io.renren.modules.api.entity.UserEntity;
+import io.renren.modules.api.service.UserService;
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class DynamicDataSourceTest {
+    @Autowired
+    private UserService userService;
+
+    @Test
+    public void test(){
+        UserEntity user = userService.queryObject(1L);
+        System.out.println(ToStringBuilder.reflectionToString(user));
+
+        //切换数据源
+        DynamicDataSource.setDataSource(DataSourceContext.SECOND.getName());
+        UserEntity user2 = userService.queryObject(1L);
+        System.out.println(ToStringBuilder.reflectionToString(user2));
+    }
+}

+ 1 - 1
src/test/java/io/renren/RenrenApplicationTests.java

@@ -11,7 +11,7 @@ import org.springframework.test.context.junit4.SpringRunner;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest
-public class RenrenApplicationTests {
+public class RedisTest {
 	@Autowired
 	private RedisUtils redisUtils;