背景
我想实现本文中介绍的设计.
到目前为止我有什么
我完成了大部分工作:
我还编写了一个Zuul PRE过滤器,用于检查访问令牌,联系IDP并创建JWT.然后将JWT添加到转发到下游服务的请求的标头中.
问题
现在我的问题非常具体针对Zuul及其过滤器.如果由于任何原因在API网关中验证失败,我怎样才能停止路由并直接用401响应而不继续过滤链并转发呼叫?
如果验证失败,过滤器将不会将JWT添加到标头,401将来自下游服务.我希望我的网关可以阻止这种不必要的通话.
我试着看看我怎么com.netflix.zuul.context.RequestContext用来做这个,但文档很差,我找不到办法.
我们有一个 Java 应用程序,它使用 3rd 方(Asposee,但我认为这并不重要)生成 word 文档。该应用程序是从一个简单的 Docker 文件构建的:
FROM openjdk:10-jdk-slim
COPY target/*.jar /opt/
CMD $JAVA_HOME/bin/java $JAVA_OPTS -jar /opt/*.jar
Run Code Online (Sandbox Code Playgroud)
当我们在本地构建应用程序(mvn package然后docker build)并在其中运行应用程序k8s时效果很好。
但是,当我们使用 Jenkins 在 CI/CD 管道中构建映像时,在运行显然需要额外字体的特定进程时,我们会遇到运行时异常:
Caused by: java.lang.NullPointerException: null
at java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1288)
at java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225)
at java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:765)
at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:440)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:385)
at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35)
at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,项目是在 Jenkins 中构建的,由 docker image 编译maven:3.5.4-jdk-10-slim。
我已经检查了两个 jar 文件(本地和来自 jenkins)并且类文件是相同的(如预期的那样)。
在这两种情况下,它是相同的基本图像,所以我不明白有什么区别。在本地构建与在另一个 Docker 容器中构建时 Docker 中的内容有什么不同吗?
编辑
我们查看了两个 docker 镜像,发现了以下差异。
由于本地构建的图像ls -l …
我一直在看这个主题的很多帖子,但无法得到一个适用于我的案例的解决方案.
我正在使用带有JSF 2.0的Java EE 6(部署在JBoss AS 7.1上)
在我的web.xml身上:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
Run Code Online (Sandbox Code Playgroud)
当会话自动超时时,我希望将用户重定向到登录页面.
我试过的:
方法1:使用过滤器
我试过以下过滤器:
@WebFilter()
public class TimeOutFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
System.out.println("filter called");
final HttpServletRequest req = (HttpServletRequest) request;
final HttpSession session = req.getSession(false);
if (session != null && !session.isNew()) {
chain.doFilter(request, response);
} else {
System.out.println("Has timed out");
req.getRequestDispatcher("/logon.xthml").forward(request, response);
}
} …Run Code Online (Sandbox Code Playgroud) 我正在寻找为我的公司获得JRebel许可证.
但是我发现IntelliJ已经具有内置的热部署类功能.
目前我们正在使用Netbeans和Eclispse,如果我们应该购买IntelliJ,我想知道而不是购买JRebel许可证.
我尝试了IntelliJ(13.0.1)的试用版,热交换功能似乎工作正常(使用JBoss AS 7.1.1).只有小细节似乎你必须手动编译已经为IntelliJ修改的类以在服务器上替换它.JRebel会自动执行此操作.
现在我的问题是有经验的IntelliJ和/或JRebel用户.
如果我已经拥有IntelliJ,那么拥有JRebel真的很有用吗?如果我最感兴趣的是热替换我的课程,那么JRebel会更好吗?
欢迎所有反馈/经验/建议.
我正在使用Spring云Brixton.RC2,与Zuul和Eureka一起使用.
我有一个网关服务@EnableZuulProxy和book-service一个status方法.通过配置,我可以status通过休眠一段规定的时间来模拟方法的工作.
Zuul路线很简单
zuul.routes.foos.path=/foos/**
zuul.routes.foos.serviceId=reservation-service
Run Code Online (Sandbox Code Playgroud)
我运行了两个实例book-service.当我将休眠时间设置为低于Hystrix超时阈值(1000毫秒)时,我可以看到请求同时发送到图书服务的两个实例.这很好用.
据我所知,如果Hystrix命令失败,Ribbon应该可以在另一台服务器上重试该命令.这应该使故障对客户端透明.
我阅读了Ribbon配置并在Zuul中添加了以下配置:
zuul.routes.reservation-service.retryable=true //not sure which one to try
zuul.routes.foos.retryable=true //not sure which one to try
ribbon.MaxAutoRetries=0 // I don't want to retry on the same host, I also tried with 1 it doesn't work either
ribbon.MaxAutoRetriesNextServer=2
ribbon.OkToRetryOnAllOperations=true
Run Code Online (Sandbox Code Playgroud)
现在我更新配置,以便只有一个服务睡眠时间超过1秒,这意味着我有一个健康服务,一个健康服务.
当我调用网关时,调用会发送到两个实例,一半调用返回500.在网关中,我看到Hystrix超时:
com.netflix.zuul.exception.ZuulException: Forwarding error
[...]
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: reservation-service timed-out and no fallback available.
[...]
Caused by: java.util.concurrent.TimeoutException: null
Run Code Online (Sandbox Code Playgroud)
为什么Ribbon不会在另一个实例上重试调用?
我在这里想念什么吗?
hystrix spring-cloud netflix-zuul netflix-ribbon spring-cloud-netflix
我正在观察一种不寻常的行为,我想了解发生了什么.
想象一下简单的设置.
首先,我有一个只返回一些东西的无状态bean:
@Stateless
public class SimpleService{
private Map<String, String> map;
@PostConstruct
public init(){
map = new HashMap<>();
}
public Map<String,String> getMap(){
return map;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有另一个无状态bean进行一些处理
@Stateless
public class ProcessService{
private static final Logger log = LoggerFactory.getLogger(ProcessService.class);
private static final int MAX = 2000;
@Inject
private SimpleService simpleService;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void process(){
final long start = System.currentTimeMillis();
for(int i=0; i<MAX; i++){
simpleService.getMap();
}
final long end = System.currentTimeMillis();
log.info(MessageFormat.format("Process took {0} ms", end - start));
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个简单的CDI bean来调用process方法. …
我使用PrimeFaces 3.4.1绘制时间图(x轴上的日期,y轴上的int值).
目前我有类似的东西:
xhtml:
<p:lineChart id="timeChart" value="#{myGraphBean.model}" legendPosition="e" title="Time Chart" minY="0" maxY="25" style="height:300px"/>
Run Code Online (Sandbox Code Playgroud)
Java bean:
private final static int MAX_VALUE = 20;
private final static int NUMBER_OF_POINTS = 20;
private final static DateFormat dateFormat = new SimpleDateFormat("dd-MM-yy");
private void createLinearModel() {
model = new CartesianChartModel();
Calendar day = Calendar.getInstance();
day.set(Calendar.HOUR_OF_DAY, 0);
day.set(Calendar.MINUTE, 0);
day.set(Calendar.SECOND, 0);
day.set(Calendar.MILLISECOND, 0);
LineChartSeries series = new LineChartSeries();
series.setLabel("My series");
for (int i = 0; i < NUMBER_OF_POINTS; i++) {
series.set(dateFormat.format(day.getTime()), getRandomValue());
day.add(Calendar.DAY_OF_MONTH, 1); …Run Code Online (Sandbox Code Playgroud) 背景
我有一个使用jqplot选项扩展的primefaces折线图(x上的日期,y上的整数> = 0):
function extender() {
this.cfg.axes = {
xaxis : {
renderer : $.jqplot.DateAxisRenderer,
rendererOptions : {
tickRenderer:$.jqplot.CanvasAxisTickRenderer
},
tickOptions : {
fontSize:'10pt',
fontFamily:'Tahoma',
angle:-40,
formatString:'%b-%y'
},
tickInterval:'2592000000'
},
yaxis : {
min: 0,
rendererOptions : {
tickRenderer:$.jqplot.CanvasAxisTickRenderer,
},
tickOptions: {
fontSize:'10pt',
fontFamily:'Tahoma',
angle:0,
formatString: '%d'
}
},
};
this.cfg.axes.xaxis.ticks = this.cfg.categories;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用jqplot扩展器在x轴上有自定义日期间隔,这是正常工作:

问题
当我min: 0在y轴上使用该选项时,数字的格式变得非常时髦,特别是当有小值时:

请注意,minYprimefaces中的属性不起作用(可能是因为扩展程序覆盖了它)
为了解决这个问题,我使用了formatString: %d.它有效,但它会产生滴答数量的问题:

正如您在屏幕截图中看到的那样,值1的行数次.
题
如何确保我在y轴上没有多次获得相同的值?
我真的不能有一个静态的刻度数,因为当数据变大时(比如大约100),我确实想要y轴上的几个值(例如20,40等...)
在官方文档之后,@EnableSpringDataWebSupport在我的Spring配置中添加注释允许Predicate在查询中自动注入一个类:
@RequestMapping(method = RequestMethod.GET, path="/find")
public ResponseEntity<PagedResources<FooResource>> find(Pageable pageable, PagedResourcesAssembler<Foo> assembler, @QuerydslPredicate(root = Foo.class) Predicate predicate) {
Page<Foo> foos = fooRepository.findAll(predicate, pageable)
final ResourceAssemblerSupport<Foo, FooResource> fooResourceAssembler = new ....;
final PagedResources<FooResource> pagedResources = assembler.toResource(foos, fooResourceAssembler);
return new ResponseEntity<>(pagedResources, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)
然后我可以在执行GET请求时轻松搜索:
GET /foo/name?=bob&name=alice&age=20
Run Code Online (Sandbox Code Playgroud)
这很好用.但是我想知道如何实现更高级的搜索条件:
><>=<=通常,我想将这些运算符应用于数据模型中的数字和日期字段.Querydsl支持这些标准.
我尝试添加> (%3E)我的查询参数,但它无法解析(例如,对于数字字段,如年龄,它抱怨它不能解析>10为数字.
是否可以在查询中直接使用此运算符?
(如果重要的话我正在使用Spring Data Mongodb)
我正在使用JBoss 7.1构建Java EE应用程序.
为了对用户操作进行全面审核,我计划使用Interceptor来记录我的bean方法的每次调用.
为此,我有以下招标:
@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Logged {
}
Run Code Online (Sandbox Code Playgroud)
然后我定义我的拦截器类:
@Logged
@Interceptor
public class UserActionInterceptor implements Serializable {
private static final long serialVersionUID = 1L;
private Logger log = LoggerFactory.getLogger(UserActionInterceptor.class);
public UserActionInterceptor() {
}
@AroundInvoke
public Object logMethodEntry(InvocationContext invocationContext) throws Exception {
log.debug(invocationContext.getMethod().getName() + " invoked.");
return invocationContext.proceed();
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这工作正常.如果我使用这个拦截器绑定一个类,我会得到一些日志记录.但是,当我想要定位我的bean类时,它变得更加棘手.
如果我有一个@RequestScoped类型的bean并将其绑定到我的拦截器,它就可以工作.但是,如果我有一个@ViewScoped类型的bean,那么它不会.
我查了@ViewScoped的定义,发现:
@Retention(value=RUNTIME)
@Target(value=TYPE)
@Inherited
public @interface ViewScoped
Run Code Online (Sandbox Code Playgroud)
我觉得问题在于这个注释没有目标类型METHOD,它阻止我的拦截器拦截对类方法的调用.
以前有人有同样的问题吗?有人知道是否可以扩展bean的范围,以便可以截获其方法而不改变@ViewScoped的性质?
java-ee ×6
java ×5
jsf ×3
graph ×2
jboss ×2
jqplot ×2
netflix-zuul ×2
primefaces ×2
spring-boot ×2
spring-cloud ×2
aspose ×1
aspose.words ×1
docker ×1
ejb ×1
gateway ×1
hystrix ×1
interceptor ×1
jboss7.x ×1
jrebel ×1
kubernetes ×1
logging ×1
querydsl ×1
spring ×1
spring-data ×1
timeout ×1