- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个由多个后端服务和一个前端客户端组成的应用程序。整个应用程序是用 Java 编写的,我们使用 Apache TomEE 网络服务器来运行它。
后端服务公开了几个 API,并包含多个 Controller 。其中一些 API 可供前端客户端访问,一些用于后端服务之间的内部通信。
日志记录对于此应用程序非常重要。需要在开始正常操作之前始终初始化日志记录系统(以确保完全可追溯性)。该应用程序使用一个安全的日志系统,该系统需要一个 key 来初始化日志(日志是使用这个 key 签名的,以防止日志被篡改)。还需要将日志记录 key 上传到每个服务。每个后端服务都有一个用于接收日志记录 key 的端点。
存在“鸡或蛋”类型的问题。应用程序需要运行才能接收 key ,但在接收到 key 之前,应用程序不应完全运行。
为了满足要求,我们正在考虑以下启动程序:
@Path
修饰。和
@Stateless
注释。
init()
过滤器类中的方法被调用。但是当我访问
/installkey
端点发生错误。
doFilter(ServletRequest, ServletResponse, FilterChain)
方法被调用,我的代码检测到请求是针对
/installkey
端点。但是一个错误来自调用:
filterChain.doFilter(request, response);
.
filterChain
不是
null
, 但是在方法
doFilter(ServletRequest, ServletResponse, FilterChain)
中出了点问题,我无法调试它。
web.xml
中有以下内容:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.company.filter.LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
public class LoggingFilter implements Filter {
@Override
public void init(final FilterConfig filterConfig) throws ServletException {
}
public void doFilter(final ServletRequest request,
final ServletResponse response,
final FilterChain filterChain) throws IOException,
ServletException {
String url = "";
if (request instanceof HttpServletRequest) {
url = ((HttpServletRequest) request).getRequestURL().toString();
}
if (url.endsWith("/installkey/")) {
filterChain.doFilter(request, response);
return;
} else if (loggerConfig.isInitialized()) {
filterChain.doFilter(request, response);
return;
}
}
public void destroy() {
System.out.println("XXXXXXXXXXX Running destroy");
}
}
Jan 19, 2016 10:42:25 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [default] in context with path [/vw-ws-rest] threw exception [Error processing webservice request] with root cause
java.lang.NullPointerException
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:240)
at org.apache.openejb.server.cxf.rs.CxfRsHttpListener.doInvoke(CxfRsHttpListener.java:227)
at org.apache.tomee.webservices.CXFJAXRSFilter.doFilter(CXFJAXRSFilter.java:94)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.company.filter.LoggingFilter.doFilter(LoggingFilter.java:63)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
import javax.ws.rs.NameBinding;
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD })
public @interface TemporarilyDisabled {
}
@Provider
@TemporarilyDisabled
public class LoggingFilter implements ContainerRequestFilter {
@Override
public void filter(final ContainerRequestContext requestContext) throws IOException {
System.out.println("in filter method!");
}
}
@Path("installkey")
@Stateless(name = "vw-installKeyResource")
public class VwInstallKeyResource {
@Inject
private Logger LOG;
@EJB
//... some required classes
@POST
@TemporarilyDisabled
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response savePlatformData(final InstallKeyData installKeyData)
throws CryptographicOperationException, DuplicateEntryException {
....
}
}
<!-- JAX-RS -->
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
</dependency>
最佳答案
我认为您不会找到任何开箱即用的解决方案。
使用 JAX-RS 2.0 时及其实现,您会发现一些很棒的资源:您可以使用名称绑定(bind)过滤器根据您的条件中止对某个端点的请求。
这种方法最酷的地方在于,您可以保持端点精简并专注于其业务逻辑。负责中止请求的逻辑将在过滤器中。要暂时禁用一个或多个端点,您只需在它们上放置一个注释。它将激活阻止请求到达端点的过滤器。默认情况下启用所有端点,您将有选择地禁用您不想接收请求的端点。
定义名称绑定(bind)注解
要将过滤器绑定(bind)到您的 REST 端点,JAX-RS 2.0 提供了元注释 @NameBinding
.它可用于创建其他注释,这些注释将用于将过滤器绑定(bind)到您的 JAX-RS 端点。
考虑 @TemporarilyDisabled
注释定义如下。注释为 @NameBinding
:
@NameBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface TemporarilyDisabled { }
阻止 HTTP 请求到达您的端点
@TemporarilyDisabled
上面创建的注解将用于装饰一个过滤器类,它实现了
ContainerRequestFilter
,允许您中止请求:
@Provider
@TemporarilyDisabled
public class TemporarilyDisableEndpointRequestFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
if (isEndpointTemporarilyDisabled) {
requestContext.abortWith(Response.status(Response.Status.SERVICE_UNAVAILABLE)
.entity("Service temporarily unavailable.")
.build());
}
}
}
@Provider
注释标记了扩展接口(interface)的实现,在提供者扫描阶段应该可以被 JAX-RS 运行时发现。
isEndpointTemporarilyDisabled
条件被评估为 true
,请求将被 HTTP 503 Service Unavailable
中止。回复。isEndpointTemporarilyDisabled
评估为 false
,请求不会被中止,并将到达用户请求的端点。503 Service Unavailable
中止请求回复?
503 Service Unavailable
应在以下情况下使用:
10.5.4 503 Service Unavailable
The server is currently unable to handle the request due to atemporary overloading or maintenance of the server. The implicationis that this is a temporary condition which will be alleviated aftersome delay. If known, the length of the delay MAY be indicated in a
Retry-After
header. If noRetry-After
is given, the client SHOULDhandle the response as it would for a500
response.Note: The existence of the
503
status code does not imply that aserver must use it when becoming overloaded. Some servers may wishto simply refuse the connection.
@TemporarilyDisabled
注释它们上面定义的注释。对于被注释的方法和/或类,过滤器将被执行:
@Path("/")
public class MyEndpoint {
@GET
@Path("{id}")
@Produces("application/json")
public Response myMethod(@PathParam("id") Long id) {
// This method is not annotated with @TemporarilyDisabled
// The request filter won't be executed when invoking this method
...
}
@DELETE
@Path("{id}")
@TemporarilyDisabled
@Produces("application/json")
public Response myTemporarilyDisabledMethod(@PathParam("id") Long id) {
// This method is annotated with @TemporarilyDisabled
// The request filter will be executed when invoking this method
...
}
}
在上面的例子中,请求过滤器将只对
myTemporarilyDisabledMethod(Long)
执行。方法,因为它带有
@TemporarilyDisabled
注释.
关于rest - 如何选择性地停用 Java 应用程序中的 REST 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34840144/
我找不到在来电时激活和停用振动的方法。 菜单中的选项 --> 设置 --> 声音和显示提到 - PHONE VIBRATE - 来电时手机振动... 我想通过代码激活和停用它(如果可能的话)。 最佳答
我有两个元素在彼此之上。当我点击第一个 div 上的按钮时,第二个 div 在第一个 div 之上打开,我想要做的是让底层 div 成为非交互式的(我不能点击底层 div 上的任何东西只要 overl
有没有办法取消 UIScrollView 的减速? 我想允许用户滚动 Canvas ,但我不希望用户抬起手指后 Canvas 继续滚动。 最佳答案 这可以通过利用 UIScrollView 委托(de
这里是关于 Stack Oveflow 的第一个问题,所以不要作恶! :) 言归正传:如果有堆叠的元素和堆叠的操作区域,如何继续操作以确保您对所看到的内容而不是底层元素进行操作? 我正在学习有关 Qt
这个问题已经有答案了: Deleting Objects in JavaScript (14 个回答) 已关闭 9 年前。 我有一个类,我通过以下方式调用: this.infiniteScroll =
我有一个优化问题,正在尝试使用 optaplanner 来解决。求解算法使用一组规则。引擎使用一个对象来捕获每个规则的权重。规则的最终得分是规则的中间得分乘以权重。分数设置在每条规则的右侧。每个规则的
有没有办法取消 UIScrollView 的减速? 我想允许用户滚动 Canvas ,但我不希望用户抬起手指后 Canvas 继续滚动。 最佳答案 这可以通过利用 UIScrollView 委托(de
我正在尝试更新 native android 应用程序,该应用程序以前是由其他一些人在某些跨平台技术(Titanium)中构建和上传的。应用程序以高级模式发布,其中针对平板电脑和手机有不同的构建。但现
我有一个 JList 列表和以下代码行: list.getInputMap().put(KeyStroke.getKeyStroke('d'), "action"); 因此,当我的列表处于焦点状态并且
有没有办法通过 SQL 语句停用 postgres 用户帐户? 我想阻止用户使用他们的数据库,但不删除用户或他们的数据库。 最佳答案 您还可以考虑 ALTER USER someone WITH NO
我有一个问题。我有一个 ViewController1,它通过 Push-segue 打开 ViewController2。//两者都是NavigationControllers - (void)pr
当我去 Playground 写 let test = "\u{062F}\u{0625} Hello" 时,我得到 Hello دإ(通过当我从输出控制台复制到这里时,我得到 دإ Hello) 似
我想通过扬声器播放歌曲,同时能够使用 Quickblox 接听视频通话。 我的音频速率越来越乱了。还有一个更大的问题是,当通话结束时,quickblox 框架将 Audio Session 设置为停用
我有一个工作项目,我以 tomcat 用户身份登录,但我不知道如何注销,我尝试停用 tomcat session ,我们使用 java spring,这是我尝试从 Controller : @Requ
我正在使用 javascript 来缩放我的 asp.net 网页上的图像。我想在上面放 2 个按钮,例如“缩放”、“取消缩放”,并相应地激活/停用 javascript 功能。现在我有一个 java
我有一个 TextField 和一个按钮。此 TextField 最多可包含 3 个字母或数字。 这是我的问题。当程序运行时,如果这个文本字段为空或者如果这个文本字段不只包含数字,我希望我的按钮被禁用
我有几个组,可以选择三个按钮。我试图做到这一点,以便当有人选择 N/A 按钮时,它会禁用其他两个按钮。当取消选择 N/A 按钮时,将启用其他两个按钮。我让它在我的机器上工作,其他两个按钮被着色为禁用,
HTML: Button Main Menu A Main Menu B
我是 php 新手,如何才能完成这项工作 删除.php prepare("UPDATE tbluser set status=1 WHERE id=:id"); $stmt->execute(
周五,我开始在运行 Ubuntu 14.04 的 VPS 上编写我的第一个 python API hello world 示例。我使用 python3,创建文件夹,virtualenv,激活它,然后断
我是一名优秀的程序员,十分优秀!