springMVC获取request、response、session的三种方式
在springMVC中对原生的servlet的request、response与session进行了封装和隐藏,但是在某些情况下我们需要通过原生的接口进行数据处理可以通过以下三种方式获取,其中session可以通过request.getSession()方法获得。
1、通过接口方法参数直接获取
在接口方法的参数中申明以后,springMVC会自动进行注入。实现是通过DispatcherServlet将参数传到MethodHandler直接使用。HttpSession 既可以通过 request获得,也可以通过参数注入
@RequestMapping(path = {"/params"}, method = RequestMethod.POST)
@ResponseBody
public String params(HttpServletRequest request, HttpServletResponse response,HttpSession httpSession) {
//获取session,如果没有会自动创建
HttpSession session = ObjectUtils.isEmpty(httpSession)?request.getSession():httpSession;
session.setAttribute("name","张三");
session.setAttribute("passwrod","123456");
//获取 cookies
Cookie[] cookies = request.getCookies();
Arrays.stream(cookies).forEach(cookie -> {System.out.println(cookie.getName() + "=" + cookie.getValue());});
Cookie cookie = new Cookie("name","张三");
//通过response 添加cookie,返回给浏览器后,会自动在浏览器中创建cookie
response.addCookie(cookie);
logger.info("session信息:{},sessionID:{}",session.getAttributeNames(),session.getId());
return session.getAttributeNames().toString();
}
2、通过springMVC内置的请求上下文RequestContextHolder获取
RequestContextHolder是Request的上下文容器。可以用来获取当前请求信息以及响应信息,保存在当前请求的ThreadLocal类型变量中。
@RequestMapping(path = {"/context"}, method = RequestMethod.POST)
@ResponseBody
public Collection<String> context() {
HttpServletRequest requests = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
HttpServletResponse responses = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
Cookie[] cookies = requests.getCookies();
Arrays.stream(cookies).forEach(cookie -> {System.out.println(cookie.getName() + "=" + cookie.getValue());});
Cookie cookie = new Cookie("name","张三");
responses.addCookie(cookie);
response.getHeaderNames().forEach(name -> {System.out.println(name);});
return response.getHeaderNames();
}
3、直接通过属性自动注入获取
其实底层使用的RequestContextHolder,在进入请求的时候自动注入
@Autowired
private HttpServletRequest request;
@Autowired
private HttpServletResponse response;
@Autowired
HttpSession session;
@RequestMapping(path = {"/inject"}, method = RequestMethod.POST)
@ResponseBody
public Collection<String> inject() {
Cookie[] cookies = request.getCookies();
Arrays.stream(cookies).forEach(cookie ->{System.out.println(cookie.getName() + "=" + cookie.getValue());});
Cookie cookie = new Cookie("name","张三");
this.response.addCookie(cookie);
return response.getHeaderNames();
}