SpringMVC获取request对象和response对象

其他Action继承BaseAction

方法一:

1、BaseAction类

public class BaseAction {
	
	protected HttpServletRequest request;
	protected HttpServletResponse response;
	protected HttpSession session;
	
	@ModelAttribute
	public void setReqAndRes(HttpServletRequest request, HttpServletResponse response){
		this.request = request;
		this.response = response;
		this.session = request.getSession();
	}
	

说明:ModelAttribute的作用


1)放置在方法的形参上:表示引用Model中的数据

2)放置在方法上面:表示请求该类的每个Action前都会首先执行它,也可以将一些准备数据的操作放置在该方法里面。

方法二:

1、BaseAction类

public class BaseAction {
	
	protected HttpServletRequest request;
	protected HttpServletResponse response;
	protected HttpSession session;

	HttpServletRequest request1 = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
	HttpServletResponse response1 = ((ServletWebRequest)RequestContextHolder.getRequestAttributes()).getResponse();
	
2、web.xml

<listener>
	<listener-class>org.springframework.web.context.request.RequestContentListener</listener-class>
</listener>





### 如何在 Spring MVC 中将 Request 的 Accept 头数据同步到 Response 在 Spring MVC 中,可以通过自定义过滤器(Filter)或者拦截器(Interceptor)来实现请求头 `Accept` 数据的同步操作。以下是具体的解决方案: #### 使用 Filter 实现 通过编写一个自定义的 Servlet 过滤器,可以在请求到达控制器之前读取 `Accept` 头,并将其设置到响应头中。 ```java import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class AcceptHeaderSyncFilter implements Filter { @Override public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { String acceptHeader = request.getHeader("Accept"); if (acceptHeader != null && !acceptHeader.isEmpty()) { response.setHeader("Accept", acceptHeader); } chain.doFilter(request, response); } } ``` 此代码片段展示了如何捕获请求中的 `Accept` 头并将其写入响应头[^1]。 为了注册该过滤器,可以使用 Java 配置类的方式: ```java import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<AcceptHeaderSyncFilter> loggingFilter() { FilterRegistrationBean<AcceptHeaderSyncFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new AcceptHeaderSyncFilter()); registrationBean.addUrlPatterns("/api/*"); // 设置匹配路径 return registrationBean; } } ``` 上述配置确保了过滤器仅应用于 `/api/*` 路径下的请求。 --- #### 使用 Interceptor 实现 另一种方法是利用 Spring MVC 提供的拦截器机制。拦截器允许开发者更灵活地控制请求响应流程。 首先,创建一个自定义拦截器: ```java import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class AcceptHeaderSyncInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String acceptHeader = request.getHeader("Accept"); if (acceptHeader != null && !acceptHeader.isEmpty()) { response.setHeader("Accept", acceptHeader); } return true; } } ``` 接着,在配置类中注册这个拦截器: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { private final AcceptHeaderSyncInterceptor acceptHeaderSyncInterceptor; @Autowired public WebConfig(AcceptHeaderSyncInterceptor acceptHeaderSyncInterceptor) { this.acceptHeaderSyncInterceptor = acceptHeaderSyncInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(acceptHeaderSyncInterceptor).addPathPatterns("/api/**"); } } ``` 这种方式同样实现了将请求头中的 `Accept` 同步至响应头的功能。 --- #### 注意事项 - 如果项目中有多个过滤器或拦截器,则需要注意其执行顺序可能会影响业务逻辑。 - 对于性能敏感的应用场景,应评估额外处理带来的开销。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值