tomcat由于 “{}”报 url 400异常的问题(转)

Tomcat控制台报错,错误信息如下:

信息: Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.InternalAprInputBuffer.parseRequestLine(InternalAprInputBuffer.java:235)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1028)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2549)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2538)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:662)

经过分析,发现问题是由URL中一个参数params引起的,

这个参数通过JSON2.stringify()转换为一个对象数组,所以包含了{},而恰恰就是这一步在Tomcat 7.0.81版本中出现 了问题,请求链接都是400的状态,就是请求参数有误。

这个问题是由于Tomcat的新版本中增加了一个新特性,就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。

既然分析出了原因,那么就要找解决方案了,其实,解决办法很简单,就是使用encodeURIComponent或encodeURI对包含{}的URL进行编码,这样就可以解决该问题。当然,还有一种办法就是更换Tomcat为支持大括号{}的版本。

mysql重连,连接丢失:The last packet successfully received from the server–转载

1.1 错误信息:

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 20,820,001 milliseconds ago.  The last packet sent successfully to the server was 20,820,002 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
		at sun.reflect.GeneratedConstructorAccessor29.newInstance(Unknown Source) ~[na:na]
		at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.7.0_51]
		at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[na:1.7.0_51]
		at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1129) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3988) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2598) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2828) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5372) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:881) ~[c3p0-0.9.1.1.jar:0.9.1.1]
		at org.quartz.impl.jdbcjobstore.AttributeRestoringConnectionInvocationHandler.setAutoCommit(AttributeRestoringConnectionInvocationHandler.java:98) ~[quartz-2.2.1.jar:na]

1.2 解决方法

– 如果使用的是JDBC,在JDBC URL上添加?autoReconnect=true,如:

jdbc:mysql://10.10.10.10:3306/mydb?autoReconnect=true

– 如果是在Spring中使用DBCP连接池,在定义datasource增加属性validationQuerytestOnBorrow,如:

<bean id="vrsRankDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${countNew.jdbc.url}" />
    <property name="username" value="${countNew.jdbc.user}" />
    <property name="password" value="${countNew.jdbc.pwd}" />
    <property name="validationQuery" value="SELECT 1" />
    <property name="testOnBorrow" value="true"/>
</bean>

– 如果是在Spring中使用c3p0连接池,则在定义datasource的时候,添加属性testConnectionOnCheckintestConnectionOnCheckout,如:

<bean name="cacheCloudDB" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${cache.url}"/>
    <property name="user" value="${cache.user}"/>
    <property name="password" value="${cache.password}"/>
    <property name="initialPoolSize" value="10"/>
    <property name="maxPoolSize" value="${cache.maxPoolSize}"/>
    <property name="testConnectionOnCheckin" value="false"/>
    <property name="testConnectionOnCheckout" value="true"/>
    <property name="preferredTestQuery" value="SELECT 1"/>
</bean>

 

继续阅读mysql重连,连接丢失:The last packet successfully received from the server–转载

Windows下MySQL绿色版安装配置与使用

Windows下MySQL绿色版安装配置与使用

 Mysql-5.7.11-winx64操作步骤:

一、安装MySQL数据库

1、下载。

下载地址: http://downloads.mysql.com/archives/get/file/mysql-5.7.11-winx64.zip。

2、解压MySQL压缩包

解压到指定目录,D:\Dev\mysql-5.7.11。

3、添加环境变量

在Path中添加  D:\Dev\mysql-5.7.11\bin

4、修改配置文件

将my-default.ini名称改为:my.ini,文件里面的参数配置:
[mysqld]
# 设置mysql的安装目录
basedir=D:\Dev\mysql-5.7.11
# 设置mysql数据库的数据的存放目录,必须是data
datadir=D:\Dev\mysql-5.7.11\data
注意:路径是反斜线,也可以改为两个正斜线,还可以加上双引号
# mysql端口
port=3306
# 字符集
character_set_server=utf8 (我下载这个版本没有找到此项)
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

5、安装MySQL服务

cmd进入到mysql的bin目录(D:\Dev\mysql-5.7.11\bin)

如果安装目录下存在“Data”目录,务必先删除data目录(或移动到其他地方)。

执行mysqld –initialize 。

自动:mysqld –install [服务名]
手动:mysqld –install -manual [服务名]
然后执行mysqld -install MySQL –defaults-file=”D:\Dev\mysql-5.7.11\my.ini”,当显示Service successfully installed时,即表示mysql服务安装成功。
注意:务必要把”-defaults”改为”–defaults”,mysqld指令没有-d选项,而MYSQL在解析参数时,只要碰到xxxx-dxxxx就会把-D当成选项去处理。
mysql默认查找c:\my.ini和c:\windows\my.ini,安装目录下的my.ini或my.cnf。

6、mysql服务启动与停止

方法一,在doc命令下进入到mysql的bin目录(D:\Dev\mysql-5.7.11\bin),
输入”net start mysql”启动mysql,
输入”net stop mysql”停止mysql服务。

方法二,打开管理工具 服务,找到MySQL服务。

通过右键选择启动或者直接点击左边的启动来启动服务。

二、卸载MySQL服务

在doc命令下进入到D:\Dev\mysql-5.7.11\bin>输入”mysqld -remove”或者”sc delete mysql”执行卸载服务。

三、root密码修改与登录

1、登录

本地登录mysql数据库在doc命令窗口里面,输入命令:mysql -u root -p
回车后提示输入密码。
注:mysql解压缩版初次安装管理员root的密码为空,直接再回车一次就登入mysql数据库。

如果出现ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)错误,编辑mysql配置文件my.ini,在[mysqld]这个条目下加入 skip-grant-tables,保存退出后重启mysql。

2、修改root密码      

刚安装完成时root账号默认密码为空,此时可以将密码修改为指定的密码。如:123456

方法一:

c:>mysql -u root -p

mysql>show databases;

mysql>use mysql;

mysql>UPDATE user SET password=PASSWORD(“123456”) WHERE user=’root’;

mysql>FLUSH PRIVILEGES; 【注意一定不要遗忘这句话,否则密码更改不能生效,刷新MySQL的系统权限相关表,第二种方法,就是重新启动mysql服务器】

mysql>QUIT

改好之后,再修改一下my.ini这个文件,把刚才加入的”skip-grant-tables”这行删除,保存退出,再重启mysql。

方法二:

利用第三方管理工具进行密码修改。如Navicat for MySQL

四、mysql 常用命令

create database name; 创建数据库

use databasename; 选择数据库

drop database name 直接删除数据库,不提醒

show tables; 显示表

describe tablename; 表的详细描述

select 中加上distinct去除重复字段

mysqladmin drop databasename 删除数据库前,有提示。

显示当前mysql版本和当前日期

select version(),current_date;

从文件中读取

mysql -h myhost -u root -p database < sql.txt 

五、mysql 中的SQL语句

1 . 数据库创建 : Create database db_name;
数据库删除 : Drop database db_name; 删除时可先判断是否存在,写成 : drop database if exits db_name

2 . 建表 : 创建数据表的语法 : create table table_name (字段1 数据类型 , 字段2 数据类型);
例 : create table mytable (id int , username char(20));
删表 : drop table table_name; 例 : drop table mytable;

3 . 添加数据 : Insert into 表名 [(字段1 , 字段2 , ….)] values (值1 , 值2 , …..);
如果向表中的每个字段都插入一个值,那么前面 [ ] 括号内字段名可写也可不写
例 : insert into mytable (id,username) values (1,’zhangsan’);

4 . 查询 : 查询所有数据 : select * from table_name;
查询指定字段的数据 : select 字段1 , 字段2 from table_name;
例 : select id,username from mytable where id=1 order by desc;多表查询语句————参照第17条实例

5 . 更新指定数据 , 更新某一个字段的数据(注意,不是更新字段的名字)
Update table_name set 字段名=’新值’ [, 字段2 =’新值’ , …..][where id=id_num] [order by 字段 顺序]
例 : update mytable set username=’lisi’ where id=1;
Order语句是查询的顺序 , 如 : order by id desc(或asc) , 顺序有两种 : desc倒序(100—1,即从最新数据往后查询),asc(从1-100),Where和order语句也可用于查询select 与删除delete

6 . 删除表中的信息 :
删除整个表中的信息 : delete from table_name;
删除表中指定条件的语句 : delete from table_name where 条件语句 ; 条件语句如 : id=3;

7 . 创建数据库用户
一次可以创建多个数据库用户如:
CREATE USER username1 identified BY ‘password’ , username2 IDENTIFIED BY ‘password’….

8 . 用户的权限控制:grant
库,表级的权限控制 : 将某个库中的某个表的控制权赋予某个用户
Grant all ON db_name.table_name TO user_name [ indentified by ‘password’ ];

9 . 表结构的修改
(1)增加一个字段格式:
alter table table_name add column (字段名 字段类型); —-此方法带括号
(2)指定字段插入的位置:
alter table table_name add column 字段名 字段类型 after 某字段;
删除一个字段:
alter table table_name drop字段名;
(3)修改字段名称/类型
alter table table_name change 旧字段名 新字段名 新字段的类型;
(4)改表的名字
alter table table_name rename to new_table_name;
(5)一次性清空表中的所有数据
truncate table table_name; 此方法也会使表中的取号器(ID)从1开始

10 . 增加主键,外键,约束,索引。。。。(使用方法见17实例)
① 约束(主键Primary key、唯一性Unique、非空Not Null)
② 自动增张 auto_increment
③外键Foreign key—–与reference table_name(col_name列名)配合使用,建表时单独使用
④ 删除多个表中有关联的数据—-设置foreign key 为set null —具体设置参考帮助文档

11 . 查看数据库当前引擎
SHOW CREATE TABLE table_name;
修改数据库引擎
ALTER TABLE table_name ENGINE=MyISAM | InnoDB;