SpringMVC_获取请求各种信息

本文介绍了在SpringMVC中如何获取请求的各种信息,并详细讨论了解决HTTP请求乱码问题的方法,特别是分析了CharacterEncodingFilter的源码,强调了其在过滤器链中的位置对解决乱码问题的重要性。

一、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);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值