小编pho*_*360的帖子

使用Zuul作为身份验证网关

背景

我想实现本文中介绍的设计.

它可以通过下图总结: 安全架构

  1. 客户端首先使用IDP进行身份验证(OpenID Connect/OAuth2)
  2. IDP返回访问令牌(不带用户信息的不透明令牌)
  3. 客户端通过API网关进行调用,使用Authorization标头中的访问令牌
  4. API网关使用访问令牌向IDP发出请求
  5. IDP验证访问令牌是否有效并以JSON格式返回用户信息
  6. API网关将用户信息存储在JWT中,并使用私钥对其进行签名.然后将JWT传递给下游服务,该服务使用公钥验证JWT
  7. 如果服务必须调用另一个服务来完成请求,它将通过JWT,该JWT用作请求的身份验证和授权

到目前为止我有什么

我完成了大部分工作:

  • Spring云作为全球框架
  • Spring启动以启动个人服务
  • Netflix Zuul作为API网关

我还编写了一个Zuul PRE过滤器,用于检查访问令牌,联系IDP并创建JWT.然后将JWT添加到转发到下游服务的请求的标头中.

问题

现在我的问题非常具体针对Zuul及其过滤器.如果由于任何原因在API网关中验证失败,我怎样才能停止路由并直接用401响应而不继续过滤链并转发呼叫?

如果验证失败,过滤器将不会将JWT添加到标头,401将来自下游服务.我希望我的网关可以阻止这种不必要的通话.

我试着看看我怎么com.netflix.zuul.context.RequestContext用来做这个,但文档很差,我找不到办法.

gateway spring-boot microservices spring-cloud netflix-zuul

25
推荐指数
2
解决办法
2万
查看次数

Docker 和 Java - FontConfiguration 问题

我们有一个 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 …

java aspose aspose.words docker kubernetes

16
推荐指数
4
解决办法
1万
查看次数

HttpSession超时后重定向

我一直在看这个主题的很多帖子,但无法得到一个适用于我的案例的解决方案.

我正在使用带有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)

java jsf timeout java-ee

10
推荐指数
1
解决办法
3万
查看次数

JRebel vs IntelliJ - 热插拔

我正在寻找为我的公司获得JRebel许可证.

但是我发现IntelliJ已经具有内置的热部署类功能.

目前我们正在使用Netbeans和Eclispse,如果我们应该购买IntelliJ,我想知道而不是购买JRebel许可证.

我尝试了IntelliJ(13.0.1)的试用版,热交换功能似乎工作正常(使用JBoss AS 7.1.1).只有小细节似乎你必须手动编译已经为IntelliJ修改的类以在服务器上替换它.JRebel会自动执行此操作.

现在我的问题是有经验的IntelliJ和/或JRebel用户.

如果我已经拥有IntelliJ,那么拥有JRebel真的很有用吗?如果我最感兴趣的是热替换我的课程,那么JRebel会更好吗?

欢迎所有反馈/经验/建议.

java intellij-idea java-ee jrebel

10
推荐指数
2
解决办法
7073
查看次数

Zuul/Ribbon/Hystrix没有在不同的实例上重试

背景

我正在使用Spring云Brixton.RC2,与Zuul和Eureka一起使用.

我有一个网关服务@EnableZuulProxybook-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

9
推荐指数
1
解决办法
3278
查看次数

每次调用后,EJB方法都需要更多的时间来返回

我正在观察一种不寻常的行为,我想了解发生了什么.

想象一下简单的设置.

首先,我有一个只返回一些东西的无状态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方法. …

java jboss ejb java-ee jboss7.x

8
推荐指数
1
解决办法
658
查看次数

PrimeFaces - 自定义日期图表

我使用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)

jsf graph java-ee jqplot primefaces

7
推荐指数
1
解决办法
1万
查看次数

Primefaces chart + jqplot extender - y轴的舍入值

背景

我有一个使用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等...)

jsf graph java-ee jqplot primefaces

7
推荐指数
1
解决办法
9896
查看次数

Spring - 支持QueryDsl的高级比较器

官方文档之后,@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)

java spring querydsl spring-data spring-boot

7
推荐指数
1
解决办法
1621
查看次数

Java EE拦截器和@ViewScoped bean

我正在使用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的性质?

logging jboss java-ee interceptor

6
推荐指数
1
解决办法
1414
查看次数