Spring 为什么不像RequestContextHolder这样的响应没有holder类
为什么Spring没有像RequestContextHolder这样的类用于Spring 为什么不像RequestContextHolder这样的响应没有holder类,spring,Spring,为什么Spring没有像RequestContextHolder这样的类用于HttpServletResponse?在某些情况下,我需要访问响应对象。例如,spring security正在为成功登录创建InteractiveSuccessEvent。我的事件处理程序需要将一些值正确设置为cookie,我不知道修改HttpServletResponse对象的显式方法 Edit:处理程序的示例 @Component public class ActivityLoginSuccessEventHan
HttpServletResponse
?在某些情况下,我需要访问响应对象。例如,spring security正在为成功登录创建InteractiveSuccessEvent。我的事件处理程序需要将一些值正确设置为cookie,我不知道修改HttpServletResponse
对象的显式方法
Edit:处理程序的示例
@Component
public class ActivityLoginSuccessEventHandler implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {
@Override
public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) {
//todo cookie
}
}
@组件
公共类ActivityLoginSAccessEventHandler实现ApplicationListener{
@凌驾
ApplicationEvent上的公共无效(InteractiveAuthenticationSuccessEvent事件){
//托多饼干
}
}
如果您没有找到更好的解决方案,那么您可以扩展用户名和密码AuthenticationFiter(或者您使用的AuthenticationFilter),这样您就可以访问请求和响应。我最后使用了一个简单的筛选器
public class ResponseContextHolderFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
RequestAndResponseContextHolder.response(response);
} finally {
filterChain.doFilter(request, response);
}
}
}
public class RequestAndResponseContextHolder {
public static final String RESPONSE_NAME_AT_ATTRIBUTES =
ServletRequestAttributes.class.getName() + ".ATTRIBUTE_NAME";
public static HttpServletResponse response() {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletResponse response = null;
if(requestAttributes != null) {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
response = (HttpServletResponse) servletRequestAttributes.getAttribute(RESPONSE_NAME_AT_ATTRIBUTES, RequestAttributes.SCOPE_REQUEST);
}
return response;
}
public static HttpServletRequest request() {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = null;
if(requestAttributes != null) {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
request = servletRequestAttributes.getRequest();
}
return request;
}
public static void response(HttpServletResponse response) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if(requestAttributes != null) {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
servletRequestAttributes.setAttribute(RESPONSE_NAME_AT_ATTRIBUTES, response, RequestAttributes.SCOPE_REQUEST);
}
}
}
您能显示您的事件处理程序吗?@SotiriosDelimanolis添加了一个示例((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())。getResponse()这样做不行吗@布尼亚明·科斯库纳?