0%

最近由于项目启动依赖于consul,写完代码之后想启动服务,还要去启动consul,有的时候会忘记所以将consul启动设置为了开机自启

阅读全文 »

ThreadLocal线程本地存储

该类提供了线程局部变量,为每一个线程创建一个单独的变量副本,使得每个线程都可以独立的改变自己所拥有的变量副本,而不会影响其他线程所对应的副本,消除了竞争条件。

阅读全文 »

zookeeper

为什么需要zookeeper

对于多线程的弊端,看下图

阅读全文 »

1.查看当前端口被哪个进程占用了(进入到CMD中)

阅读全文 »

问题现象: 在进行单元测试时,测试执行成功,可是数据库中的数据没变

问题解决:单元测试自动回滚,需要加上注解Rollback(false)

中文乱码问题

在使用Get请求进行访问是由于地址中参数的编码问题可能会造成中文乱码问题,可以使用如下几种方式进行解决

  • tomcat的server.xml文件中,在Connector 节点中添加useBodyEncodingForURI=”true” 属性 使用请求体的编码,然后在获取请求内容之前使用request.setCharacterEncoding(“UTF-8”)
  • tomcat的server.xml文件中,在Connector 节点中添加URIEncoding=”UTF-8”属性
  • tomcat的get请求默认使用ISO-8859-1来编码,可以在获取的时候进行转码,new String(request.getParameter(“name”).getBytes(“ISO-8859-1”),”UTF-8”)

多个请求使用同一个Servlet

多个请求使用同一个Servlet可以采用以下两种方案
第一种方案:在url加上入参method,根据method进行分发

第二种方案:web.xml使用*.do来匹配Servlet,根据 request.getServletPath()然后反射调用方法

表单的重复提交

重复提交的情况

  • 在表单提交到一个Servlet,Servlet又通过请求转发的方式响应了一个页面,此时地址栏还保留着Servlet的那个路径,在响应页面点击刷新
  • 在响应没有返回时重复点击提交按钮
  • 点击返回,再点击提交

不是重复提交的情况

点击返回之后,刷新页面,再点击提交

如何避免表单的重复提交

使用session,生成属性,移除属性

post请求体内容无法重复获取

为什么会无法重复读取呢?

以tomcat为例,在进行请求体读取时实际底层调用的是org.apache.catalina.connector.Request的getInputStream()方法,而该方法返回的是CoyoteInputStream输入流

1
2
3
4
5
6
7
8
9
10
11
12
13
public ServletInputStream getInputStream() throws IOException {

if (usingReader) {
throw new IllegalStateException(sm.getString("coyoteRequest.getInputStream.ise"));
}

usingInputStream = true;
if (inputStream == null) {
inputStream = new CoyoteInputStream(inputBuffer);
}
return inputStream;

}

在使用CoyoteInputStream进行读取时

1
2
3
4
5
6
7
8
9
10
11
12
13
public int read(byte[] b, int off, int len) throws IOException {
// 如果流关闭,则抛出异常
if (closed) {
throw new IOException(sm.getString("inputBuffer.streamClosed"));
}
// 如果已经读完了,则返回-1
if (checkByteBufferEof()) {
return -1;
}
int n = Math.min(len, bb.remaining());
bb.get(b, off, n);
return n;
}

而流读取完毕都会进行close,这个流close之后,close状态就置为了true,所以导致流无法进行二次读取

阅读全文 »