美文网首页
SpringMVC 中获得 request 和 response

SpringMVC 中获得 request 和 response

作者: 当当一丢丢 | 来源:发表于2018-01-04 23:48 被阅读563次

request/response 简介

  • request 和 response 是对应一次Http通信中的request请求和response返回结果
  • Java 的Servlet 协议将其分别封装为 HttpServletRequest 和 HttpServletResponse
  • 从中可以获得原始 Http 请求的详细信息,也可控制response操作
  • 屏蔽了直接操作底层 Http 的复杂性

方法一

在 Controller 层获取

直接在 controller 的方法参数中加入HttpServletRequest 和 HttpServletResponse 对象参数

@RestController
public class AppController {
    
    @RequestMapping("/test")
    public String getSth(HttpServletRequest request, HttpServletResponse response) {
        ......
    }
}
原理
  • spring 会使用反射将这两个属性从上下文环境注入到对应方法中(使用反射技术对相应的参数做到参数注入
  • 简单理解:读参数->搜索上下文中bean->若匹配上->注入
  • 详细代码
第一段
//step1-invokeForRequest()
public Object invokeForRequest(NativeWebRequest request, ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
        //获取 方法参数
        Object[] args = this.getMethodArgumentValues(request, mavContainer, providedArgs);
        if(this.logger.isTraceEnabled()) {
            StringBuilder returnValue = new StringBuilder("Invoking [");
            returnValue.append(this.getBeanType().getSimpleName()).append(".");
            returnValue.append(this.getMethod().getName()).append("] method with arguments ");
            returnValue.append(Arrays.asList(args));
            this.logger.trace(returnValue.toString());
        }

        Object returnValue1 = this.doInvoke(args);
        if(this.logger.isTraceEnabled()) {
            this.logger.trace("Method [" + this.getMethod().getName() + "] returned [" + returnValue1 + "]");
        }

        return returnValue1;
    }

第二段
    /**
     * Get the method argument values for the current request.
     */
    private Object[] getMethodArgumentValues(NativeWebRequest request, ModelAndViewContainer mavContainer,
            Object... providedArgs) throws Exception {

        MethodParameter[] parameters = getMethodParameters();
        Object[] args = new Object[parameters.length];
        for (int i = 0; i < parameters.length; i++) {
            MethodParameter parameter = parameters[i];
            parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);
            GenericTypeResolver.resolveParameterType(parameter, getBean().getClass());
            args[i] = resolveProvidedArgument(parameter, providedArgs);
            if (args[i] != null) {
                continue;
            }
            if (this.argumentResolvers.supportsParameter(parameter)) {
                try {
                    args[i] = this.argumentResolvers.resolveArgument(
                            parameter, mavContainer, request, this.dataBinderFactory);
                    continue;
                }
                catch (Exception ex) {
                    if (logger.isDebugEnabled()) {
                        logger.debug(getArgumentResolutionErrorMessage("Error resolving argument", i), ex);
                    }
                    throw ex;
                }
            }
            if (args[i] == null) {
                String msg = getArgumentResolutionErrorMessage("No suitable resolver for argument", i);
                throw new IllegalStateException(msg);
            }
        }
        return args;
    }

第三段
    /**
     * Attempt to resolve a method parameter from the list of provided argument values.
     */
    private Object resolveProvidedArgument(MethodParameter parameter, Object... providedArgs) {
        if (providedArgs == null) {
            return null;
        }
        for (Object providedArg : providedArgs) {
            if (parameter.getParameterType().isInstance(providedArg)) {
                return providedArg;
            }
        }
        return null;
    }

如果参数类型和提供的参数类型可以匹配,则直接返回。至此,我们分析完了从源码级别分析了,如何做的参数注入。
参考:https://www.jianshu.com/p/0ba4c65e493c

方法二

在非Controller层获得

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();

HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();

HttpServletResponse response = ((ServletWebRequest)RequestContextHolder.getRequestAttributes()).getResponse();

ServletContext context = ContextLoader.getCurrentWebApplicationContext().getServletContext();

相关文章

  • SpringMVC 中获得 request 和 response

    request/response 简介 request 和 response 是对应一次Http通信中的reque...

  • JavaWeb——Request&Response&am

    Request&Response原理 Request对象和response对象的原理 request和respon...

  • 请求

    Request: request对象和response对象的原理1. request和response对象是由服务...

  • How does SpringMVC work?

    从用户发出HTTP Request, 到用户得到HTTP Response, 整个SpringMVC框架在内部做了...

  • 05

    http中请求request和响应response信息说明 Request http.ServerRequest ...

  • Scrapy爬虫框架(八) ------ 模拟登录

    1. Scrapy-Request和Response(请求和响应) Scrapy的Request和Response...

  • JavaWeb-Request

    Request 1. request与response对象的原理 request和response对象都是由服务器...

  • JavaWeb——request

    1. request 对象和 response 对象的原理 request 和response 对象是由服务器创建...

  • 理解Request和Response

    一.request和response简介: request和response的作用执行流程 Web服务器收到客户端...

  • Day_04_Servlet

    request获得中文参数乱码问题 response返回中文乱码问题 跳转

网友评论

      本文标题:SpringMVC 中获得 request 和 response

      本文链接:https://www.haomeiwen.com/subject/oyzdnxtx.html