关于数据乱码问题

这个是个让人头疼的问题,在Java Web已经被折磨得体无完肤了,这里还有;这个使用spring自带的过滤器就可以解决了;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<filter>
<filter-name>springFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>springFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

与我们自己写的不同,这个我们是要配置一下他的编码;

1
2
3
4
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>

说到底,这个过滤器就只有三个属性;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class CharacterEncodingFilter extends OncePerRequestFilter {
@Nullable
private String encoding;
private boolean forceRequestEncoding;
private boolean forceResponseEncoding;

public CharacterEncodingFilter() {
this.forceRequestEncoding = false;
this.forceResponseEncoding = false;
}

public CharacterEncodingFilter(String encoding) {
this(encoding, false);
}

public CharacterEncodingFilter(String encoding, boolean forceEncoding) {
this(encoding, forceEncoding, forceEncoding);
}

public CharacterEncodingFilter(String encoding, boolean forceRequestEncoding, boolean forceResponseEncoding) {
this.forceRequestEncoding = false;
this.forceResponseEncoding = false;
Assert.hasLength(encoding, "Encoding must not be empty");
this.encoding = encoding;
this.forceRequestEncoding = forceRequestEncoding;
this.forceResponseEncoding = forceResponseEncoding;
}

public void setEncoding(@Nullable String encoding) {
this.encoding = encoding;
}

@Nullable
public String getEncoding() {
return this.encoding;
}


public void setForceRequestEncoding(boolean forceRequestEncoding) {
this.forceRequestEncoding = forceRequestEncoding;
}

public boolean isForceRequestEncoding() {
return this.forceRequestEncoding;
}

public void setForceResponseEncoding(boolean forceResponseEncoding) {
this.forceResponseEncoding = forceResponseEncoding;
}

public boolean isForceResponseEncoding() {
return this.forceResponseEncoding;
}

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String encoding = this.getEncoding();
if (encoding != null) {
if (this.isForceRequestEncoding() || request.getCharacterEncoding() == null) {
request.setCharacterEncoding(encoding);
}

if (this.isForceResponseEncoding()) {
response.setCharacterEncoding(encoding);
}
}

filterChain.doFilter(request, response);
}
}

配置ForceEncoding的目的:

1
2
3
4
public void setForceEncoding(boolean forceEncoding) {
this.forceRequestEncoding = forceEncoding;
this.forceResponseEncoding = forceEncoding;
}

看了一下这个就是一般的过滤器;

还有一点,就是url-pattern*里面写的是/**的话它可以连着jsp也一起过滤;