/**
	 * 功能:将http://example.com重定向至http://www.example.com
	 * */
	private static final String DOMAIN = "aaa.com";

	/**
	 * 在DispatcherServlet之前执行
	 * */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
			Object handler) throws Exception {

		HttpServletRequest httpServletRequest = (HttpServletRequest) request;
		HttpServletResponse httpServletResponse = (HttpServletResponse) response;
		// 获取域名
		String serverName = request.getServerName();
		// 获取请求路径
		String path = httpServletRequest.getRequestURI();
		//queryString 支持多参数 ?a=1&b=2#&c=22## 等
		String queryString = (httpServletRequest.getQueryString() == null ? "" : "?"+httpServletRequest.getQueryString());   // 获取路径中的参数
		int end = serverName.indexOf(DOMAIN);
		if (end!= -1 && end == 0) {  //判断是否是example.com,如果是通过ip地址访问暂时不处理 //end == -1 || end == 0(不是本域名都跳转)
			httpServletResponse.setStatus(301);
			httpServletResponse.setHeader( "Location", "http://www."+DOMAIN+path+queryString);
			httpServletResponse.setHeader( "Connection", "close" );
			return false;
		}


		return true;
	}

  

	JsonObject(com.alibaba.fastjson)返回值修改后,源对象的值也发生改变解决方法
	public  static  JSONObject   getObj(String keyParam){
		JSONObject res = =Map1.get(keyParam);
		if(res!=null){
		    //使用clone方法防止影响静态变量的值
			res = (JSONObject)res.clone(); //之所以 要clone是因为上层调用若修改返回的jsonObject里面的值,会影响map (静态变量的值) 
		}
		return  res;
	}

  

Using ArrayUtils.removeElement(Object[],Object)from org.apache.commons.lang is by far the easiest way to do this.int[] numbers = {1,2,3,4,5,6,7};//removing number 1
numbers =(int[])ArrayUtils.removeElement(numbers, 1); //1 是实际数组里面的值

当然也可以根据数组的索引进行移除,详情参考下方api



commons.apache.org library:Javadocs

maven引入
<!-- java执行 linux 命令  -->
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>

import org.springframework.core.io.ClassPathResource; import org.springframework.util.ResourceUtils; import java.io.*; import java.util.ArrayList; import java.util.List; import ch.ethz.ssh2.*; import ch.ethz.ssh2.StreamGobbler; /** * Created by Administrator on 2017/8/18 018. */ public class Test { public static List<String> l = new ArrayList<String>(); public static void main(String args[]) { exportSvnCommend();//初始化list String hostname = "172.1.1.1"; String username = ""; String password = ""; try { /* Create a connection instance * * pom add <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh2</artifactId> <version>262</version> </dependency> * * * */ Connection conn = new Connection(hostname); /* Now connect */ conn.connect(); /* Authenticate. * If you get an IOException saying something like * "Authentication method password not supported by the server at this stage." * then please check the FAQ. */ boolean isAuthenticated = conn.authenticateWithPassword(username, password); if (isAuthenticated == false) throw new IOException("Authentication failed."); //************************ for循环执行命令*******************start*********************** /** * throw new IOException("A remote execution has already started.");所以如果需要执行多条命令 * ,则把多条命令柔和为1条命令,命令之前用回车\n连接,这样就可以成功执行,拿到所有的控制台输出内容 */ String cmd = ""; // cmd = "whereis java"; //test // cmd = "svnadmin create /usr/local/Repositories/item1"; for (int i =0;i<l.size();i++){ String itemName = l.get(i); //创建资源库并导入 cmd += "svnadmin create /home/SvnRepositories/"+itemName+"\n";//可以一次执行多个命令 cmd += "svnadmin load /home/SvnRepositories/"+itemName+" < /home/SvnRepositories/svnbak/svnbak/"+itemName+".dump"+"\n";//可以一次执行多个命令 execLinuxCommend(cmd,conn); } //************************ for循环执行命令************end****************************** /* Close the connection */ conn.close(); } catch (Exception e) { e.printStackTrace(); e.printStackTrace(System.err); System.exit(2); } } public static void execLinuxCommend(String cmd,Connection conn){ try { /* Create a session */ Session sess = conn.openSession(); sess.execCommand(cmd); System.out.println("Here is some information about the remote host:"); /* * This basic example does not handle stderr, which is sometimes dangerous * (please read the FAQ). */ InputStream stdout = new StreamGobbler(sess.getStdout()); BufferedReader br = new BufferedReader(new InputStreamReader(stdout)); while (true) { String line = br.readLine(); if (line == null) break; System.out.println(line); } /* Show exit status, if available (otherwise "null") */ System.out.println("ExitCode: " + sess.getExitStatus()); /* Close this session */ sess.close(); }catch (Exception e){ e.printStackTrace();; } } //批量导出windows visualSVN的资源文件备份命令 public static void exportSvnCommend(){ try{ // File cfgFile = ResourceUtils.getFile("classpath:1.txt"); File file = ResourceUtils.getFile("classpath:1.txt"); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); String tempString = null; int line = 1; // 一次读入一行,直到读入null为文件结束 while ((tempString = reader.readLine()) != null) { // 显示行号 // System.out.println("line " + line + ": " + tempString); System.out.println("svnadmin dump F:\\Repositories\\" + tempString + " > F:\\svnbak\\"+tempString+".dump"); l.add(tempString); line++; } reader.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (Exception e1) { e1.printStackTrace(); } } } }catch (Exception e){ e.printStackTrace(); } } }

 

一、备份VisualSVN项目

1. 现在要使用Linux作为svn服务器,之前是在windows Server 2008上的,用的是VisualSVN

 

2.现在svn中有一个项目fpp,需要将fpp这个项目导出到linux环境下。运行cmd,输入命令 svnadmin dump E:\Repositories\fpp > e:\svnbak\fpp.dump将项目导出到e:\svnbak目录下。运行结果如下:

3. 可见命令会导出每个版本的详细信息,保证了之前的历史信息不会丢失。现在我们便得出备份文件fpp.dump,如下:

4. 利用批处理实现项目的批量导出,编写svnbak.bat, 双击运行,会一次性导出所有项目,结果如下图:

 

二、上传备份文件到Linux

1. 利用ftp, ssh等工具将fpp.dump文件传输到Linux服务器上,这里利用直接利用openSSH这个软件上传。如图,文件上传成功,文件的路径为/root/fpp.dump。

 

三、Linux下SVN的安装与配置

1. Linux下安装svn,这里直接利用yum命令进行安装。yum install subversion完成subversion的安装。

2. 建立版本库目录svndata。

mkdir /svndata

svnserve -d -r /svndata #启动svn,设置版本库目录为/svndata

killall svnserve #关闭svn

3. 建立项目库

svnadmin create /svndata/fpp

4. 配置用户访问权限

cd /svndata/fpp/conf

vi svnserve.conf

释放如下几行的注释

anon-access=none

auth-access=write

password-db=passwd

5. 增加访问用户,格式为(username = password),等号两边要加空格,否则无效。如下图,没有加空格,就一直没用:

 

6. svn的命令这里不作介绍,大家自己去学习使用。

四、导入备份文件

1. 输入命令:svnadmin load /svndata/fpp < /root/fpp.dump,运行结果如下:

 

2. 为了避免逐个导入项目,所以写了一个shell脚本,进行批量导入,遍历备份目录下所有*.dump文件,并产生相应的导入命令,15个项目,花了10分钟左右完成导入,脚本如下:

 

五、客户端进行代码的检出

1.windows端安装TortoiseSVN, 右键svn checkout

2. 在打开的对话框中,输入svn库的地址,确定便可以同步项目。地址如下,ip地址加项目名称,如图:

 

3. svn提示检出成功,在目录下可以找到检出的项目。

 

4. 对于以前的项目,重定向到新的svn服务器,右键->TortoiseSVN->Relocate,在弹出的对话框中填写新的地址,TortoiseSVN会提示修改成功,之后,就可以使用新的svn了。

 

 

5. 如果你是使用eclipse中的subeclipse的插件,首先打开svn资源库视图,然后选择你的项目,右键选择重定向,填入新的svn地址。

 

6. linux下若使用svn命令的话,形式如下:

svn switch --relocate (Old Repository Root) (New Repository Root)

 

 


 

VisualSVN Server仓库迁移到Linux(包含所有版本, 权限,用户信息)

公司开发服务器从Windows换成CentOS,所以要把原服务都转移到Linux下,MySQL、SMB的迁移都很顺利,但是SVN的转移却遇到了些问题,花费了三天时间,走了不少弯路,现在总算解决了SVN迁移问题,记录下:

在Windows上我们是用VisualSVN Server作SVN服务的,Linux上是编译安装的subversion 1.7.7。
Windows 的SVN仓库在E:\SVNRepositories,Linux在 /data/svnrepos

第1步,导出VisualSVN仓库:svnadmin dump E:\SVNRepositories\repo1 E:\repo1.dump

第2步,在Linux端create相同名称的仓库: svnadmin create /data/svnrepos/repo1

第3步,在Linux端load Windows导出的库:
            cd /data/svnrepos
            svnadmin load repo1 < repo1.dump

到此为止,repo1库就导入到Linux的subversion中了,但是用户信息、权限信息还没导入(这也是我折腾很久的问题),继续:

第4步,把E:\SVNRepositories\authz 上传到 /data/svnrepos
            把E:\SVNRepositories\htpasswd 复制为 passwd 并修改后上传到 /data/svnrepos
            修改后的passwd格式如下(其实就是用户名 = 密码):
             [users]
             user1 = 123
             user2 = 456

第5步,修改仓库的/conf/svnserve.conf,使它指向第4步上传的那两个文件:
            [general]
            anon-access = none
            auth-access = write
            password-db = ../../passwd
            authz-db = ../../authz

到这里就完成了,用命令  svnserve -d -r  /data/svnrepos/ 启动subversion服务。

  • 这样做还有个问题是passwd文件原密码信息全丢失了,知道解决方法的请留言告诉我:)
    打开passwd可以看到之前的密码是加密的,而放到linux上,需是明文,修改密码到明文即可。
  • 我只用了repo1这个仓库,如果有多个仓库一样步骤,分别导出导入,并修改仓库的/conf/svnserve.conf
     [此步骤,可以利用linux批量查找替换功能,将密码文件指定到../../的passwd文件]
  • 如果按照上述方法操作还是不行,启动svnserve时用  --log-file ./log.txt参数查看错误信息

 

常用命令总结:

#启动svn,设置版本库目录为/Repositories
svnserve
-d -r /usr/local/Repositories

#关闭svn
killall svnserve



windows服务器导出:
svnadmin dump F:\Repositories\item1
>F:\svnbak\item1.dump

创建项目资源
svnadmin create
/usr/local/Repositories/item1

还原备份文件到资源库
svnadmin load
/usr/local/Repositories/item1 < /usr/local/Repositories/item1.dump

svn导出路径
svn:
//172.16.28.70/item1

 

免责声明
本博客部分内容来自于互联网,不代表作者的观点和立场,如若侵犯到您的权益,请联系[email protected]。我们会在24小时内进行删除。