关于spring controller 中注入 response

最近产品使用上了spring mvc 。喜欢其使用方法参数方式接受http中的参数列表,这样可以很直观的看到某个接口需要什么样的输入。

鉴于简单方便,我们让所有的接口都返回json的数据。于是按照最简单的办法就是拿取response,获取其writer后输出 json文本。

关于response 的获取,网络上基本都是使用方法参数传入的方式:

public void doSome(String uid,String pwd,HttpServletResquest request,HttpServletResponse response){
       //..........
}

 但是我有点代码洁癖,我想能否通过别的方式来获取response,从而让方法的参数简洁一致的全都是业务参数。各种百度谷歌之后,发现都答不上来。不过有人使用Filter 拦截,并将Response放到 ThreadLocal中,供后面使用。

@Component("responseHolderFilter")
public class ResponseHolderFilter implements Filter{

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		LOGGER.info("ResponseHolderFilter init");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println(request);
		System.out.println(response);
		ResponseHolder.set((HttpServletResponse)response);
		try{
			chain.doFilter(request, response);
		}finally{
			ResponseHolder.clear();
		}
	}

	@Override
	public void destroy() {
		LOGGER.info("ResponseHolderFilter destroy");
	}
	
	private static final Logger LOGGER = LoggerFactory.getLogger(ResponseHolderFilter.class);

}

 
按照此法,确实拿到了Response实例,也能获取Writer,并输出json。但是看页面提示404,找不到jsp页面。经过测试,如果使用 方法参数传入方式获取的Response 来输出json,那么就正常,浏览器直接显示了json内容。经过测试发现,如果Controller的方法中声明传入了Response对象,那么会在一个Resolver里设置一个ModelAndView的一个requestHandled属性为true,然后等待Controller方法执行完成之后和渲染页面之前,如果Controller 的方法没有返回值,并且requestHandled这个属性是true,那么就基本算是跳过渲染,返回给客户,于是呼浏览器就看到了json。

而为什么我们在Controller方法里没有传入Response对象的情况下,而只是用ThreadLocal中保存的Response对象输出json,就没会报错404 呢,就是因为刚才 requestHandled 属性没有被设置为true,于是即便Controller 方法返回的是null,spring也会寻找一个jsp进行渲染,默认就是使用Controller方法的访问地址作加上jsp作为页面查找路径(如/um/center/login.jsp)。

到此还没有满意的办法来杜绝在Controller的方法中使用Response参数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用ResponseEntity自定义Headers的方法如下: 首先,创建一个HttpHeaders对象来设置自定义的Headers。可以使用add()方法来添加具体的Header键值对。例如,可以使用set()方法来设置一个键值对。 然后,创建一个ResponseEntity对象并将要返回的响应体和自定义的Headers传入。可以使用ok()方法来创建一个成功的ResponseEntity对象。 最后,在Controller方法,将ResponseEntity对象作为返回值返回即可。 下面是一个示例代码: ```java import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @GetMapping("/customHeaders") public ResponseEntity<String> getResponseWithCustomHeaders() { // 创建自定义的Headers HttpHeaders headers = new HttpHeaders(); headers.add("Custom-Header", "Custom Value"); headers.set("Another-Header", "Another Value"); // 创建ResponseEntity对象并设置自定义Headers ResponseEntity<String> responseEntity = ResponseEntity.ok() .headers(headers) .body("Response Body"); return responseEntity; } } ``` 在上述示例,通过访问`/customHeaders`路径,将返回一个带有自定义Headers的ResponseEntity对象。其,自定义Headers包括"Custom-Header"和"Another-Header"两个键值对。 请注意,在使用ResponseEntity时,需要在Controller方法返回ResponseEntity对象,而不是直接返回响应体内容。通过设置ResponseEntity对象的headers属性来设置自定义Headers。在Spring框架,可以使用ResponseEntity对象来设置响应头信息。 : 需要注意的是,在使用ResponseEntity时,需要在Controller方法返回ResponseEntity对象,而不是直接返回响应体内容。 : 在Spring框架,可以使用ResponseEntity对象来设置响应头信息。可以通过以下代码设置响应头:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值