一、SpringMVC如何获取请求带来的各种信息
/**
* SpringMVC如何获取请求带来的各种信息
* 默认方式获取请求参数:
* 直接给方法入参上写一个和请求参数名相同的变量。这个变量就来接收请求参数的值;
* 带:有值,没带:null;
*
* @RequestParam:获取请求参数的;
* 参数默认是必须带的;否则报400
* @RequestParam("user")String username
* 相当于username =request.getParameter("user")
*
*
* @RequestParam("user")获取路径上的
* @PathVariable("user") 获取变量上的
* /book/【{user}pathvariable】?【user=admin(requestparam)
* 】
*
value:指定要获取的参数的key
required:这个参数是否必须的,在false的情况下若没有该id则是null
defaultValue:默认值。没带默认是null;
*
*
* @RequestHeader:获取请求头中某个key的值; request.getHeader("User-Agent");
* @RequestHeader("User-Agent")String userAgent userAgent =
* request.getHeader("User-Agent")
* 如果请求头中没有这个值就会报错500; value() required()
* defaultValue()
*
* @CookieValue:获取某个cookie的值;
* 以前的操作获取某个cookie; Cookie[] cookies =request.getCookies();
* for(Cookie c:cookies){
* if(c.getName().equals("JSESSIONID")){
* String cv = c.getValue();
* }
* }
* value()
* required()
* defaultValue()
*/
@RequestMapping("/hello02")
public String hello02(@RequestParam(value="user",required = false,defaultValue = "我没带噢") String username,
@RequestHeader(value = "User-agent",required = false,defaultValue = "我也没有带哈哈哈")String useragent,
@CookieValue(value = "SESSIONID",required = false)String sessionid){
System.out.println("/hello02正在处理...");
System.out.println("user:"+username);
System.out.println("User-agent:"+useragent);
System.out.println("sessionid:"+sessionid);
return "success";
}
@RequestMapping("/book")
public String hello03(Book book, HttpServletRequest request) {
// request.setCharacterEncoding("UTF-8");过滤器会先调用request.getParameter(this.methodParam);因此在POST请求的request先调用中国行不通??或者是已经提前调用了request的某些方法
System.out.println(book);
return "success";
}
二、解决乱码问题:
配置一个字符编码的Filter,字符编码filter一般都在其他Filter之前;因为其他Filter在该Filter前一旦先获取了请求参数(request.getParamer(“XXX”)),那么乱码就不能解决。
例如 支持Rest风格的Filter,查看源码知道,首先就会获取参数,若该Filter写在字符编码的Filter前面,由于优先级从上到下,字符编码的Filter后执行,就会失效
<!-- 支持Rest风格的Filter -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/ *</url-pattern>
</filter-mapping>

<!-- 配置一个字符编码的Filter;一定注意:字符编码filter一般都在其他Filter之前; -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- encoding:指定解决POST请求乱码 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<!-- forceEncoding:顺手解决响应乱码;response.setCharacterEncoding(this.encoding); -->
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/ *</url-pattern>
</filter-mapping>
<!-- 支持Rest风格的Filter -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/ *</url-pattern>
</filter-mapping>
<!-- 使用SpringMVC前端控制器写完就直接写字符编码过滤器;
Tomcat一装上,上手就是server.xml的8080处添加URIEncoding="UTF-8"
-->
三、CharacterEncodingFilter源码分析:
package org.springframework.web.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CharacterEncodingFilter extends OncePerRequestFilter {
private String encoding;
private boolean forceEncoding = false;
public void setEncoding(String encoding) {
this.encoding = encoding;
}
public void setForceEncoding(boolean forceEncoding) {
this.forceEncoding = forceEncoding;
}
@Override
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
//若编码方式不为空或者forceEncoding为true
if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
//设定字符编码,因此encoding可以在xml中配置为UTF-8
request.setCharacterEncoding(this.encoding);//解决Post请求乱码
if (this.forceEncoding) {在xml中配置变量forceEncoding为true
//设置响应头编码方式
response.setCharacterEncoding(this.encoding);//解决响应乱码
}
}
filterChain.doFilter(request, response);
}
}
本文介绍了在SpringMVC中如何获取请求的各种信息,并详细讨论了解决HTTP请求乱码问题的方法,特别是分析了CharacterEncodingFilter的源码,强调了其在过滤器链中的位置对解决乱码问题的重要性。
302

被折叠的 条评论
为什么被折叠?



