我的所有控制器都扩展了以下抽象类:
public abstract class AbstractController {
public HttpServletRequest request;
public HttpServletResponse response;
public ModelMap model;
}
Run Code Online (Sandbox Code Playgroud)
而且,我实现了以下拦截器:
public class HttpRequestInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException {
if (handler instanceof AbstractController) {
AbstractController controller = (AbstractController) handler;
controller.request = request;
controller.response = response;
controller.model = new ModelMap();
}
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
if (handler instanceof AbstractController && modelAndView != null) {
AbstractController controller …
Run Code Online (Sandbox Code Playgroud) 我的拦截器没有在应该启动的时候启动,即使它已在 bean 中注册并且文件没有提供任何警告。我缺少什么?
编辑1:我希望能够在每次Genres.java
调用和离开函数时进行记录,但使用此配置我根本没有得到任何输出。
编辑 2:按照 Svetlin 的建议应用断点后,我可以确认代码永远不会到达拦截器或生产者。
beans.xml
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="all">
<interceptors>
<class>no.krystah.log.LoggingInterceptor</class>
</interceptors>
</beans>
Run Code Online (Sandbox Code Playgroud)
日志拦截器.java
package no.krystah.log;
import javax.inject.Inject;
import javax.interceptor.AroundConstruct;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
import org.slf4j.Logger;
@Log @Interceptor
public class LoggingInterceptor {
@Inject
Logger logger;
@AroundConstruct
private void init(InvocationContext ic) throws Exception {
logger.info("Entering constructor");
try {
ic.proceed();
} finally {
logger.info("Exiting constructor");
}
}
@AroundInvoke
public Object logMethod(InvocationContext ic) throws Exception {
logger.info(ic.getTarget().toString()+" - "+ ic.getMethod().getName()); …
Run Code Online (Sandbox Code Playgroud) 我正在编写 jax-rs 端点。对于某些端点集(现有代码),我想设置一个额外的响应标头,它实际上是在 @AroundInvoke 拦截器中生成的,并设置为 HttpServletRequest 属性。在@AroundInvoke 中,我可以使用@Inject 访问HttpServletRequest。但似乎我无法在同一个拦截器本身中访问 HttpServletResponse 。
似乎我可以使用 PostProcessorInterceptor 但我再次对以下文档感到困惑。
org.jboss.resteasy.spi.interception.PostProcessInterceptor 在 JAX-RS 方法被调用之后但在 MessageBodyWriters 被调用之前运行。它们只能在服务器端使用。如果您需要在可能没有调用任何 MessageBodyWriter 时设置响应标头,请使用它们。
我正在使用resteasy,杰克逊。如果我使用 PostProcessorInterceptor 可以注入 HttpServletResponse 吗?或者我可以在那里设置新的 http 标头吗?
任何代码示例/方向将不胜感激。
我想在 Spring MVC 的响应头中添加以下头:
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Run Code Online (Sandbox Code Playgroud)
我在 MvcConfig 文件中编写了以下代码,该文件扩展了WebMvcConfigurerAdapter。
@Bean
public Filter securityHeadersFilter() {
return new OncePerRequestFilter(){
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(request, response);
response.setHeader("X-XSS-Protection", "1; mode=block");
response.setHeader("X-Content-Type-Options", "nosniff");
}
};
}
Run Code Online (Sandbox Code Playgroud)
现在,当我点击请求并在浏览器上看到响应标头时,这两个标头不会出现。我没有用 urlPattern 注册过滤器。这是问题还是我错过了其他事情?如果 urlpattern 配置是问题,那么请告诉我如何以及在哪里配置它。
无论如何,我的最终目标是在 Response 标头中超过两个安全标头。
我正在使用Http
Angular HttpClient
的解决方案,但是我决定进行迁移并使用新的解决方案,并且我试图创建一种解决方案Interceptors
来管理需要刷新令牌以及需要将标头修改为放置授权令牌。
我在项目中使用了spring boot和cloud。对于日志记录,我使用拦截器。由于我是拦截器的新手,因此我在使用多个拦截器时遇到困难。就像我可以使用特定的拦截器来执行特定任务吗?例如,当我请求帖子时,会调用 POST 拦截器,当我使用 GET 时,会调用 get 拦截器。我怎样才能为多个拦截器编写代码?
我还没有尝试过任何事情,因为我不明白逻辑
我想使用拦截器来管理当前与服务器的活动连接数。除了常见的 JSON 端点之外,我的 API 还提供流字节的端点。我实现了一个会话管理器,用于跟踪会话计数、一个限制拦截器和几个 API 端点。下面是一些示例代码。
常见的 JSON 端点与拦截器运行良好。然而,流端点实际上调用了拦截器的preHandle
方法两次,但afterCompletion
只调用了一次。第二次调用preHandle
发生在第一个调用的响应计算完成之后。当我从拦截器中删除会话管理器时,这种行为不再发生。
最小工作示例:
配置:
@Configuration
@RequiredArgsConstructor
public class AppConfig implements WebMvcConfigurer {
private final Interceptor interceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(this.interceptor).addPathPatterns("/numbers", "/numbers/*");
}
}
Run Code Online (Sandbox Code Playgroud)
拦截器:
@Component
@RequiredArgsConstructor
@Slf4j
public class Interceptor implements HandlerInterceptor {
private final SessionManager sessionManager;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
log.info("Pre-handle {}", this.hashCode());
return this.sessionManager.accept();
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception …
Run Code Online (Sandbox Code Playgroud) 是否可以检索 Promise 实例的实现细节?让我们假设以下创建的承诺......
let myPromise = new Promise(function (success, error) {
/* implementation */
}
Run Code Online (Sandbox Code Playgroud)
可以以某种方式访问匿名函数吗...
function (success, error) {
/* implementation */
}
Run Code Online (Sandbox Code Playgroud)
...或者获取代码文件中匿名函数的位置?
interceptor ×8
java ×4
spring-mvc ×4
spring ×2
angular ×1
cdi ×1
function ×1
http ×1
httpresponse ×1
jakarta-ee ×1
java-ee-7 ×1
javascript ×1
jax-rs ×1
promise ×1
request ×1
resteasy ×1
spring-boot ×1
streaming ×1