Tomcat强制使用HTTPS

配置好Tomcat的SSL后,强制使用HTTPS方法如下:

1、全局强制HTTPS
修改%tomcat_home%\conf\web.xml,在文件底部,后面加上这样一段:

    <login-config>  
        <!-- Authorization setting for SSL -->  
        <auth-method>CLIENT-CERT</auth-method>  
        <realm-name>Client Cert Users-only Area</realm-name>  
    </login-config>  
    <security-constraint>  
        <!-- Authorization setting for SSL -->  
        <web-resource-collection >  
            <web-resource-name >SSL</web-resource-name>  
            <url-pattern>/*</url-pattern>  
        </web-resource-collection>  
        <user-data-constraint>  
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>  
        </user-data-constraint>  
    </security-constraint>  

2、某个webapp强制使用HTTPS
编辑该webapp的web.xml文件,增加以下内容:

	<security-constraint>
	    <web-resource-collection>
	        <web-resource-name>securedapp</web-resource-name>
	        <url-pattern>/*</url-pattern>
	    </web-resource-collection>
	    <user-data-constraint>
	        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
	    </user-data-constraint>
	</security-constraint>

关闭 SSL,只需要将CONFIDENTIAL改为NONE即可。

ANT出现“命令语法不正确”

昨天用ant编译代码时,报了一个很诡异的错误:
“命令语法不正确。”

分析了半天发现,原来是我在bat文件中多了””,悲剧啊。

set JAVA_HOME="D:\JavaJDK\jdk1.6.0_34_x86"
set ANT_HOME="D:\JavaTools\apache-ant-1.9.0"
set PATH=%ANT_HOME%\bin;%JAVA_HOME%\bin;%PATH%

将引号去掉就好了

set JAVA_HOME=D:\JavaJDK\jdk1.6.0_34_x86
set ANT_HOME=D:\JavaTools\apache-ant-1.9.0
set PATH=%ANT_HOME%\bin;%JAVA_HOME%\bin;%PATH%

GitHub03SSH授权

用低版本的github做上传的时候,会有提示

Permission denied (publickey). 

最简单的方法,就是安装新版本的GitHub。

如果你实在不愿意升级,那可以用以下步骤来进行:

#1、测试ssh,会提示Permission denied (publickey). 
ssh -T git@github.com 
#2、生成新的授权文件,如果你没有改过配置,那文件名为github_rsa,密码保持为空即可
ssh-keygen -t rsa -C "neohope@yahoo.com"
#3、查看新的key
ssh-add -l
#4、登录GitHub网站,到管理SSH Keys的地方,上传public key
#~/.ssh/github_rsa.pub
#5、测试ssh,会提示成功
ssh -T git@github.com 

搞定!

查询视图时不使用索引

今天发生了一件很诡异的事情,平台网关有一张对外提供的视图,用某字段进行查询时,效率奇低无比。

--view
select * from user1.view1 v1 where v1.mark='mark001';
--table
select * from user1.table1 t1 where t1.mark='mark001';

分析视图对应的表信息后发现,虽然对mark字段建立了索引,但查询语句中使用的mark字段值“mark001”,
所占比例竟然已经达到40%,应该是历史数据导致的。

然后将历史数据处理后,重建mark字段索引,诡异的事情发生了:
即使mark字段值“mark001”的比例小于0.1%,查询依然不走索引。

重建索引无效,就差重新建表了,压力山大啊。

最后,休息了一下,抱着试试看的态度,重新分析了表table1:

analyze table user1.table1 compute statistics for table for all indexes for all indexed columns;

查询终于走索引了,速度立刻上去了。

这才记起来,前几天,按某人的建议,把oracle的统计信息关掉了。。。
自己挖坑把自己埋了。。。
四个小时啊。。。
我的考评还没来得及写,还有十几封邮件要写,悲剧啊~~
我恨某潘~~

Win2008下调试Service程序

Win2008下调试Service程序时,发现无法使用DebugBreak(),否则程序直接挂掉,无法进行调试。

有资料说是,修改错误报告的选项就可以修正这个问题了,尝试后发现无效,暂时只能一点儿一点儿调试了。

另外,Win2008上内存检测严格了很多,需要注意。

VirtualBox从U盘启动

默认情况下,Virtualbox从无法从U盘启动的。

但可以用变通的方法,将宿主机的U盘,模拟为一个虚拟盘,从虚拟盘进行启动。

1、首先产看本地硬盘信息
运行diskmgmt.msc
查看U盘是第几个驱动器,比如我的是第2个驱动器(编号从0开始,0,1,2这样)

2、将U盘模拟为一个虚拟盘

VBoxManage internalcommands createrawvmdk -filename D:\VirtualMashines\VirtualBox\WinXP\usbdisk.vmdk -rawdisk \\.\PhysicalDrive2

3、虚拟机中,添加该虚拟盘

4、启动,按F12,选择虚拟盘启动。

VirtualBox扩展及压缩虚拟磁盘

1、首先定位各虚拟磁盘的UUID

C:\ProgramerTools\Oracle\VirtualBox>VBoxManage.exe list hdds
UUID:           b806ffa9-ea8e-4059-9dd8-2d246e850ab6
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\WinXP\WinXP.vdi
Storage format: VDI
Capacity:       10240 MBytes

UUID:           945de0c8-f928-44ad-ae39-9a12a71568ef
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\Debian8\Debian8.vdi
Storage format: VDI
Capacity:       20480 MBytes

UUID:           e49d8a88-d68b-43b8-954e-2be419933e08
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\Docker\Debian8Docker\Debian8Docker
.vdi
Storage format: VDI
Capacity:       20480 MBytes

UUID:           eab29989-ce9c-4491-8dd0-2190ed3029d6
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\FreeBSD10\FreeBSD10.vdi
Storage format: VDI
Capacity:       20480 MBytes

UUID:           74bcd43e-a315-437e-9b4f-895051ff8433
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       D:\VirtualMashines\VirtualBox\FreeBSD10\FreeBSD10A01.vdi
Storage format: VDI
Capacity:       20480 MBytes

2、扩展WinXP虚拟磁盘
2.1我的xp虚拟机一共只有10G,我需要扩展到20G(要关虚拟机)

C:\ProgramerTools\Oracle\VirtualBox>VBoxManage modifyhd b806ffa9-ea8e-4059-9dd8-
2d246e850ab6 --resize 20480
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

2.2扩展后,开启虚拟机,自己到磁盘管理器中分配空间即可。

3、扩展Debian虚拟磁盘
3.1我的Debian8Docker虚拟机一共只有20G,我需要扩展到30G(要关虚拟机)

C:\ProgramerTools\Oracle\VirtualBox>VBoxManage modifyhd e49d8a88-d68b-43b8-954e-
2be419933e08 --resize 30720
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

3.2扩展后,开启虚拟机,使用gparted等工具分配空间即可。
需要提前unmount分区,如果是调整扩展分区,需要umount该扩展分区下的所有挂载点。

4、压缩WinXP虚拟磁盘
4.1需要到微软官网下载sdelete工具,然后在虚拟机中运行:

sdelete -z

4.2关闭虚拟机,运行:

VBoxManage modifyhd b806ffa9-ea8e-4059-9dd8-2d246e850ab6 --compact

5、压缩Debian虚拟磁盘:
5.1A在虚拟机中运行zerofree命令,需要将分区挂载为只读模式

apt-get install zerofree
cd /
umount /home
zerofree /dev/sda6

5.1B在虚拟机中运行dd命令,需要将分区挂载为读写模式

dd if=/dev/zero of=/bigemptyfile
rm bigemptyfile 

5.2关闭虚拟机,运行:

VBoxManage modifyhd 945de0c8-f928-44ad-ae39-9a12a71568ef --compact

6、压缩FreeBSD虚拟磁盘:
6.1A在虚拟机中运行dd命令,需要将分区挂载为读写模式

dd if=/dev/zero of=bigemptyfile bs=1m
rm bigemptyfile

6.1B在虚拟机中运行dd命令,需要将分区挂载为读写模式(适用于影片空闲空间较小)

cat /dev/zero > bigemptyfile;sync;sleep 1;sync;
rm -f bigemptyfile

6.2关闭虚拟机,运行:

VBoxManage modifyhd eab29989-ce9c-4491-8dd0-2190ed3029d6 --compact
VBoxManage modifyhd 74bcd43e-a315-437e-9b4f-895051ff8433 --compact

Windows网络地址无法访问

最近遇到了Windows网络地址无法访问的问题,总结了一下,解决步骤如下:

表现为:
用localhost可以访问本机共享地址
但用网卡ip就不可以访问

1、开启对应的服务(Services.msc)
TCP/IP NetBios Helper
Computer Browser
Workstation
Server

2、网卡
对应的网卡-》Properties
启用Internet Protoclo Version 4
启用File and Printer Sharing for Microsoft Networks

对应的网卡-》Properties-》Networking-》Internet Protoclo Version 4-》Properties-》General->Advanced->WINS->NetBIOS Setting->Enable NetBIOS over TCP/IP

3、共享设置
控制面板Network and Sharing Center
-》Advanced sharing settings
-》(Home or Work/Public)
Trun on network discovery
Turn on file and printer sharing
Turn off Public folder sharing
Use 128-bit encryptiong to help …
Turn on password protected sharing…

4、防火墙
先关闭,尝试是否可以联通
如果可以通过的话,允许网络共享就可以解决问题

5、查看组策略,看下是否有端口禁用配置
如果有的话,禁用该策略

6、如果还不行,还原网卡配置

netsh interface ip reset log.txt

重启,会丢失全部网卡配置信息

Java摘要算法

package com.neohope.utils;

import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class NDigest
{
	/**
	 * Bytes to Hex String
	 * 
	 * @param hexBytes
	 * 
	 * @return hex string
	 */
	private static String bytesToHexString(byte[] hexBytes)
	{
		StringBuffer buf = new StringBuffer();

		for (int i = 0; i < hexBytes.length; i++)
		{
			if ((hexBytes[i] & 0xff) < 0x10)
			{
				buf.append("0");
			}

			buf.append(Long.toString(hexBytes[i] & 0xff, 16));
		}

		return buf.toString();
	}

	/**
	 * calc MD5 for string
	 * 
	 * @param textIn
	 * 
	 * @return md5 digest string
	 * @throws NoSuchAlgorithmException
	 */
	public static String MD5Digest(String textIn)
			throws NoSuchAlgorithmException
	{
		byte[] textData = textIn.getBytes();

		MessageDigest md = null;
		md = MessageDigest.getInstance("MD5");
		md.reset();
		md.update(textData);

		byte[] encodedData = md.digest();
		return bytesToHexString(encodedData);
	}

	/**
	 * calc SHA1 for string
	 * 
	 * @param textIn
	 * 
	 * @return sha1 digest string
	 * @throws NoSuchAlgorithmException
	 */
	public static String SHA1Digest(String textIn)
			throws NoSuchAlgorithmException
	{
		byte[] textData = textIn.getBytes();

		MessageDigest md = null;
		md = MessageDigest.getInstance("SHA1");
		md.reset();
		md.update(textData);

		byte[] encodedData = md.digest();
		return bytesToHexString(encodedData);
	}

	/**
	 * Encode a string using Base64 encoding.
	 * 
	 * @param textIn
	 * @return String
	 */
	public static String base64Encode(String textIn)
	{
		sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
		return encoder.encodeBuffer(textIn.getBytes()).trim();
	}

	/**
	 * Decode a string using Base64 encoding.
	 * 
	 * @param textIn
	 * @return String
	 * @throws IOException
	 */
	public static String decodeString(String textIn) throws IOException
	{
		sun.misc.BASE64Decoder dec = new sun.misc.BASE64Decoder();
		return new String(dec.decodeBuffer(textIn));
	}

	/**
	 * 使用 HMAC-SHA-1 签名方法对对textIn进行摘要
	 * 
	 * @param textIn
	 * @param keyIn
	 * @return
	 * @throws Exception
	 */
	public static String HmacSHA1Digest(String textIn, String keyIn)
			throws Exception
	{
		final String MAC_NAME = "HmacSHA1";
		final String ENCODING = "UTF-8";

		byte[] keyData = keyIn.getBytes(ENCODING);
		SecretKey secretKey = new SecretKeySpec(keyData, MAC_NAME);
		Mac mac = Mac.getInstance(MAC_NAME);
		mac.init(secretKey);

		byte[] textData = textIn.getBytes(ENCODING);
		byte[] encodedData = mac.doFinal(textData);

		return bytesToHexString(encodedData);
	}

	// 我就是那个测试函数。。。
	public static void main(String args[]) throws Exception
	{
		String key = "Y9zTQxRvxwrHOi45OoKNnIoxboerNqt3";
		String text = "Good good study, day day up.";
		String hmacSHA1 = HmacSHA1Digest(text, key );
		String base64 = base64Encode(hmacSHA1);
		System.out.println(hmacSHA1 );
		System.out.println(cbase64);
	}
}