1、直接在controller层方法参数上获取
仅仅适用在controller方法上。当spring接收到http请求时,会寻找一个合适的方法来处理该请求。如果该方法参数上标注了@requestmapping或@get、@post等注解,spring就会将httpservletrequest对象注入到该参数中。
@restcontroller
public class controller {
@requestmapping("/test")
public string test(httpservletrequest request,httpservletresponse response) {
return "success";
}
}
2、通过@autowired注入
适用于所有的bean
@autowired
private httpservletrequest request;
@autowired
private httpservletresponse response;
@requestmapping("/test")
public string test() {
enumeration<string> headernames = request.getheadernames();
response.setheader("header","header_value");
return "success";
}
通过调试可以看到,注入的reques是一个代理类,而这个被代理的目标由requestobjectfactory.getobject() 获取
我们再看一下requestobjectfactory.getobject() 的方法,最终还是走到了requestcontextholder.getrequestattributes()方法
private static class requestobjectfactory implements objectfactory<servletrequest>, serializable {
@override
public servletrequest getobject() {
return currentrequestattributes().getrequest();
}
@override
public string tostring() {
return "current httpservletrequest";
}
}
private static servletrequestattributes currentrequestattributes() {
requestattributes requestattr = requestcontextholder.currentrequestattributes();
if (!(requestattr instanceof servletrequestattributes)) {
throw new illegalstateexception("current request is not a servlet request");
}
return (servletrequestattributes) requestattr;
}
3、通过requestcontextholder获取
适用于所有的方法,spring会通过requestcontextholder.setrequestattributes方法将requestattributes设置到threadlocal中。
servletrequestattributes attr = (servletrequestattributes) requestcontextholder.getrequestattributes();
httpservletrequest request = attr.getrequest();
httpservletresponse response = attr.getresponse();
发表评论