可以看到第二种方式代码简洁很多,如果对请求或者响应对象有大量的使用需求,例如需要从传过来的请求头中的token获取用户信息,动态的返回结果时,建议使用第二种方式;
在springMVC的controller中获取request,response对象的一个方法
原文:https://www.cnblogs.com/xining/p/14170581.html
问题描述:
使用springMVC的时候,有些时候会需要获取请求或者响应对象,例如在身份验证的时候,需要获取请求头中的token,在做登录系统的时候需要使用response对象向客户端添加cookie,一个有效的做法是在controller的方法中添加对应参数如下所示:
1 @RestController 2 public class Test2Contrller { 3 @RequestMapping("/test") 4 public void test(HttpServletRequest req, HttpServletResponse res) { 5 // todo 6 } 7 }
这样做有一个问题,就是如果这个系统是作为接口并希望被远程调用的,那么额外的参数的存在便会破坏原本的接口定义,造成麻烦,下面介绍两种不需要在方法中增加额外参数就能获取request和response的方式
第一种方式:通过RequestContextHolder类的方法获取requestAttributes,再从中获取请求和响应对象;
1 @RestController 2 public class Test2Contrller { 3 @RequestMapping("/testreq") 4 public void test() { 5 // 获得request对象,response对象 6 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); 7 HttpServletRequest request = attributes.getRequest(); 8 HttpServletResponse response = attributes.getResponse(); 9 try { 10 response.getWriter().write("hello"); 11 } catch (IOException e) { 12 e.printStackTrace(); 13 } 14 Enumeration<String> headerNames = request.getHeaderNames(); 15 while (headerNames.hasMoreElements()) { 16 String name = headerNames.nextElement(); 17 String value = request.getHeader(name); 18 System.out.println(name + "===========" + value); 19 } 20 21 } 22 }
第二种方式:可以将请求和响应对象抽取出来放在一个超类中,需要使用这两个对象的controller继承这个类,直接使用即可,代码如下:
超类:
1 public class BaseController { 2 // 这些对象何以直接被子类使用 3 protected HttpServletRequest request; 4 protected HttpServletResponse response; 5 protected HttpSession session; 6 7 @ModelAttribute 8 public void setReqAndRes(HttpServletRequest req, HttpServletResponse res) { 9 this.request = req; 10 this.response = res; 11 this.session = req.getSession(); 12 } 13 }
子类:
1 @RestController 2 public class Test3Contrller extends BaseController{ 3 @RequestMapping("/testreq2") 4 public void test() { 5 try { 6 response.getWriter().write("hello"); 7 } catch (IOException e) { 8 e.printStackTrace(); 9 } 10 Enumeration<String> headerNames = request.getHeaderNames(); 11 while (headerNames.hasMoreElements()) { 12 String name = headerNames.nextElement(); 13 String value = request.getHeader(name); 14 System.out.println(name + "===========" + value); 15 } 16 17 } 18 }
可以看到第二种方式代码简洁很多,如果对请求或者响应对象有大量的使用需求,例如需要从传过来的请求头中的token获取用户信息,动态的返回结果时,建议使用第二种方式;
在springMVC的controller中获取request,response对象的一个方法
原文:https://www.cnblogs.com/xining/p/14170581.html