SpringMVC @RequestHeader @CookieValue 处理获取请求参数的乱码问题
- @RequestHeader
- @CookieValue
- 什么是cookie
- 通过POJO获取请求参数
- 通过CharacterEncodingFilter处理获取请求参数的乱码问题
- get请求的乱码
- post请求乱码
处理获取请求参数的乱码问题)
@RequestHeader
1.@RequestHeader是将请求头信息和控制器方法的形参创建映射关系
2.@RequestHeader注解一共有三个属性: value、required、defaultValue,用法同@RequestParam
@RequestMapping("/testParam")
public String testParam(
@RequestParam(value = "user_name",required = false,defaultValue = "hehe") String username,
String password,
String[] hobby,
@RequestHeader("Host") String host){
//求参数中出现多个同名的请求参数,可以再控制器方法的形参位置设置字符串类型或字符串数组接收此请求参数
//若使用字符串类型的形参,最终结果为请求参数的每一个值之间使用逗号进行拼接
System.out.println("username:"+username+",password:"+password+",hobby:"+ Arrays.toString(hobby));
System.out.println("Host:"+host);
return "success";
}
该语句会将请求头信息提出来赋值给形参
运行结果:
@CookieValue
1.@CookieValue是将cookie数据和控制器方法的形参创建映射关系
2.@CookieValue注解—共有三个属性: value、required、defaultValue,用法同@RequestParam
@RequestMapping("/testParam")
public String testParam(
@RequestParam(value = "user_name",required = false,defaultValue = "hehe") String username,
String password,
String[] hobby,
@RequestHeader("Host") String host,
@CookieValue("JSESSIONID") String JSESSIONID){
//求参数中出现多个同名的请求参数,可以再控制器方法的形参位置设置字符串类型或字符串数组接收此请求参数
//若使用字符串类型的形参,最终结果为请求参数的每一个值之间使用逗号进行拼接
System.out.println("username:"+username+",password:"+password+",hobby:"+ Arrays.toString(hobby));
System.out.println("Host:"+host);
System.out.println("JSESSIONID:"+JSESSIONID);
return "success";
}
运行结果:
什么是cookie
不知道你们有没有遇到过这种情况,当你在淘宝想去买一个手机的时候,你紧接着去刷短视频,那么推送的大量广告就是有关手机的,那其中的原因就是来源于我们的cookie追踪;
那么什么是cookie呢?
但是问题来了Http并不会记录我们的登陆状态
是不是代表着如果每当我们想访问别的页面时,就要重新登录一次,你敢想象吗
因此就有了cookie让我们的服务器记忆功能
浏览器收到服务器返回的页面时也会得到一个cookie,其中存放着我们的专属id,浏览器会保存我们的这个cookie,并且每次请求同一个网站时,请求中都会附带这个cookie,这样浏览器可以根据cookie中的id分辨出来我们是谁,和我们的登录状态,事实上除了记录我们的id还会记录别的东西,记录什么根据网站而定。
但随着存储信息的增加,问题又来了
一个cookie只有4kb的空间,于是开发者想到将cookie只用来存储id,而把其余的信息都存储到服务器名为session的一个地方,此后cookie中只需要存储用户对应的sessionID,当服务器收到浏览器发过来的cookie时,会根据sessionID字段,查询全部信息
cookie的一个限制,那就是一个网站只能查看自己所保存的cookie,那么购物网站是怎么精准的投放给我们的呢?
那是因为广告隶属于另一个网站,广告位所属的网站会在当前页面中植入一个追踪cookie称为第三方cookie,每一个cookie只能获取一部分信息,将所有有关的信息拼装起来就是一个人的信息库了
怎么样避免cookie追踪呢?
1.火狐浏览器的隐私窗口
2.谷歌浏览器的无痕窗口
3.安装拦截广告和追踪器的插件
通过POJO获取请求参数
可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值
package com.yc.mvc.bean;
public class User {
private String username;
private String password;
private Integer age;
private String sex;
private String email;
public User(String username, String password, Integer age, String sex, String email) {
this.username = username;
this.password = password;
this.age = age;
this.sex = sex;
this.email = email;
}
public User() {
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public Integer getAge() {
return age;
}
public String getSex() {
return sex;
}
public String getEmail() {
return email;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(Integer age) {
this.age = age;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setEmail(String email) {
this.email = email;
}
}
<form th:action="@{/testPOJO}" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
性别:<input type="radio" name="sex" value="男">男<input type="radio" name="sex" value="女">女
年龄:<input type="text" name="age"><br>
邮箱:<input type="text" name="email"><br>
<input type="submit" value="使用实体类接收请求参数">
</form>
通过CharacterEncodingFilter处理获取请求参数的乱码问题
为什么出现乱码?
字符编码不一致
get请求的乱码
get请求的乱码是由tomcat造成的
怎么解决?
改为
post请求乱码
怎么解决?