小编Kar*_*hik的帖子

STOMP或XMPP - Over websocket

我正在开展一个涉及实时聊天(消息传递,包括群聊)的项目.

之前我曾经使用过websockets,所以我开始使用spring-websockets开始研究它,我做了一些关于实现它的最佳方法的阅读.然后我遇到了STOMP(作为websockets的子协议),因为在春天有直接支持STOMP,所以我很容易实现我应该做的事情.

但我的疑问是,就我的理解STOMP和XMPP是类似的协议(消息传递协议),但我找不到任何问题/博客,其中差异被解释,为什么有人会更喜欢一个?

如果有人解释这两个协议有何不同,那将会非常有用吗?

谢谢.

spring xmpp stomp spring-websocket

19
推荐指数
1
解决办法
1913
查看次数

通过Sockjs + Spring Websocket + Stomp发送图像/文件

我正在使用Spring websockets(STOMP作为子协议)和Sockjs开发消息传递应用程序.

我应该提供支持来发送消息中的文件.

根据这张票,sockjs不支持二进制数据,但STOMP确实如此.

我知道我们可以将图像转换为base64并通过stomp发送它,但我认为这不是最好的做法,因为有很多转换和开销.此外,我必须保存消息,所以要再次在服务器上保存这个base64编码文件我将不得不解码它们.

我有几个问题:

1)是否有通过sockjs + stomp发送图像/文件转换为Base64的解决方法是唯一的方法?

2)这可能是一个非常愚蠢的问题,但根据这个问题,可以通过STOMP发送二进制数据(没有sockjs).没有sockjs支持后备有多难?

谢谢.

编辑:如果使用base64是唯一的选择,我宁愿发出POST请求来保存具有附件的消息,而不是使用base64编码.任何更好的想法?

javascript stomp sockjs spring-websocket

18
推荐指数
1
解决办法
5232
查看次数

使用Java的数组中元素的索引

Java中的以下代码返回-1.我认为它应该返回3.

int[] array = {1,2,3,4,5,6}; 
System.out.println(Arrays.asList(array).indexOf(4));
Run Code Online (Sandbox Code Playgroud)

你能帮我理解这个功能是如何工作的吗?

谢谢

java arrays

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

Spring OAuth2 - 没有客户端身份验证.尝试添加适当的身份验证筛选器

我们有一个正在使用的应用程序spring-security-oauth2:1.0.我试图将其更改为更新版本spring-security-oauth2:2.0.7.RELEASE.一些类被删除,一些包结构被更改,我设法整理所有这些东西,我能够没有任何问题启动服务器.但我在这里遇到一个奇怪的问题.

随着OAuth2 - 1.0 version,当我们在用户登录使用做了GET要求/oauth/token,例如:

HTTP://本地主机:8080 /回声/的OAuth /令牌grant_type =密码&CLIENT_ID = WS&client_secret =秘密及范围=读,写和用户名=约翰@ abc.com和密码= password123

它以前工作得很好.

当我尝试同样的事情时,首先GET由于TokenEndPoint.java中的逻辑,我无法提出请求

private Set<HttpMethod> allowedRequestMethods = new HashSet<HttpMethod>(Arrays.asList(HttpMethod.POST));

@RequestMapping(value = "/oauth/token", method=RequestMethod.GET)
public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal, @RequestParam
Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
    if (!allowedRequestMethods.contains(HttpMethod.GET)) {
        throw new HttpRequestMethodNotSupportedException("GET");
    }
    return postAccessToken(principal, parameters);
}
Run Code Online (Sandbox Code Playgroud)

我试图POST提出与上述URL相同的请求,但我收到InsufficientAuthenticationException了错误消息

没有客户端身份验证.尝试添加适当的身份验证筛选器

这是因为下面的POST请求控制器TokenEndpoint.java.当我调试时,我看到它principal是null.

@RequestMapping(value = "/oauth/token", method=RequestMethod.POST)
    public …
Run Code Online (Sandbox Code Playgroud)

spring-security access-token spring-security-oauth2

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

防止Spring Boot将日志打印到控制台

我正在为我的应用程序使用spring boot,我正在使用默认的spring boot logging.

在我application.properties,我添加了文件路径logging.file,

        logging.file= ${logger_path}
Run Code Online (Sandbox Code Playgroud)

和我的pom.xml包含

       <logger_path>/tmp/app.log</logger_path>
Run Code Online (Sandbox Code Playgroud)

当我启动应用程序时,它会将日志消息打印到文件中/tmp/app.log,但问题是它还会在控制台上打印日志消息.我真的不明白为什么它在控制台上打印(虽然它是将它们打印到指定的文件)当我指定了一个log file.

是否有任何配置可以防止spring boot将日志消息打印到控制台?

java spring spring-boot

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

当我可以直接使用类名访问唯一的静态方法时,创建一个Spring bean是否有利

我想我对春豆的理解有点过时了.

我正在研究我的项目,我正在考虑这种情况.

说我上课了 Foo

class Foo(){   
   public void doSomething(Object a , Object b){ // input parameters does not matter actually.
      //do something
   }
}
Run Code Online (Sandbox Code Playgroud)

如果我在另一个类中使用此类,如:

class Scheduler{
  ....
 @Autowired
 private Foo foo;

 someMethod(){
    foo.doSomeThind(a,b);
 }
  ....
}
Run Code Online (Sandbox Code Playgroud)

在上面的情况下Foo,我可以使doSomeThing静态和直接使用而不是自动装配Foo.doSomeThing(a,b)

我只是想知道创建一个bean是否有任何优势,或者是否有使用这样的静态方法的任何缺点?

如果它们是相同的,我什么时候应该使用spring bean?何时应该使用静态方法?

java spring-bean

12
推荐指数
2
解决办法
6640
查看次数

创建AsyncTask需要花费太多时间Android

我在AsyncTask中进行网络调用,但我面临的问题是启动doInBackground方法所花费的时间.

这是我的代码的一部分:

    button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("Temp:",System.currentTimeMillis()+"");
                new Move().execute();
                /*some other logic
            }
    }
Run Code Online (Sandbox Code Playgroud)

我的AsyncTask是:

    private class Move extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... temp) {
        Log.d("start:",System.currentTimeMillis()+"");
        gson.fromJson(Web.Request.get(some_URL),Void.class);
        Log.d("end:",System.currentTimeMillis()+"");
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是我得到的日志:

           32658-998/com.example.game D/temp:? 1408923006159
           32658-998/com.example.game D/start:? 1408923035163
           32658-998/com.example.game D/end:? 1408923035199
Run Code Online (Sandbox Code Playgroud)

实际上,在doInBackground方法中到达第一行几乎需要29秒,因为完成网络调用只花了36毫秒.我尝试了很多次,所用的时间几乎是一样的.

是否可以立即启动AsyncTask?或者有没有其他方法来解决这个问题.(除了运行一个简单的线程?)谢谢:)

android android-asynctask

7
推荐指数
2
解决办法
2893
查看次数

Redis - 检查集合中是否存在多个值的替代方法

在我的应用程序中,我需要一组值,并且需要检查Redis 中的一组值中存在多少个值。

为了简单起见,我想做的是:

> Sadd myset field1
(integer) 1
> Sadd myset field2
(integer) 1
> Sadd myset field4
(integer) 1

> Sismember myset field1 field4 // which is not possible as of now.
Run Code Online (Sandbox Code Playgroud)

由于我无法为 提供多个参数SISMEMBER,因此我可能必须多次调用 redis,这非常耗时。

我正在考虑类似的替代方案pipelining,但后来我认为这将是实现它的一个很好的(hacky)方式:

> Hset myhash field1 "true"
(integer) 0
> Hset myhash field2 "true"
(integer) 0
> Hset myhash field4 "true"
(integer) 1

> Hmget myhash field1 field2 field3
1) "true"
2) "true"
3) (nil)

> Hmget myhash …
Run Code Online (Sandbox Code Playgroud)

java redis

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

根据另一个列表过滤列表中的元素

我想在Java 8 中做到这一点

我有一个Boolean列表和另一个Object列表,这两个列表的大小总是相同的。我想从object列表中删除所有元素,这些元素在列表false中的相应索引处boolean

我将尝试用一个例子来解释:

objectList = {obj1,obj2,obj3,obj4,obj5};
booleanList = {TRUE,FALSE,TRUE,TRUE,FALSE};
Run Code Online (Sandbox Code Playgroud)

所以从这些列表中,我想更改objectList

{obj1,obj3,obj4}// obj2 and obj5 are removed because corresponding indices are `FALSE` in `booleanList`.
Run Code Online (Sandbox Code Playgroud)

如果我已经这样做了Java 7,我会做以下事情:

List<Object> newlist = new ArrayList<>();
for(int i=0;i<booleanList.size();i++){
    if(booleanList.get(i)){
        newList.add(objectList.get(i));
    }
}
return newList;
Run Code Online (Sandbox Code Playgroud)

有没有办法Java 8用更少的代码来做到这一点?

java java-8

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

忽略Git中特定文件中的一行

我有一个文件,database.properties其中有

        password = something
Run Code Online (Sandbox Code Playgroud)

因此,每当我必须测试某些东西时,我必须将此行更改为我的本地密码.团队中的每个人都有自己的本地密码.

我想我将不得不做以下其中一项:

  1. 每次我提交我都不应该添加database.properties索引(我不想要ignore这个文件),但是当文件太多时很容易错过这个文件.

  2. 在提交之前撤消更改,但大多数时候我忘记这样做.

  3. 创建个人资料可能是实现这一目标的一种方式,但即使会有类似的问题database.properties.

我已经检查了可以git忽略一个特定的行吗?以及如何告诉git忽略单独的行,即特定行代码的gitignore.

暂时忽略文件,我看到我们可以做到

git update-index --assume-unchanged <file>
Run Code Online (Sandbox Code Playgroud)

但我每次都要这样做.

所有上述参考文献在3 - 4年之前被提出/写入.所以我只想知道如果有更好的方法可以忽略这一行.

编辑

按照@ VonC的回答,我试图添加一个过滤器 .git/info/.gitattribute

{directory_path}/database.properties filter=password // I have given the correct directory path.
Run Code Online (Sandbox Code Playgroud)

我已添加smudgeclean脚本为:

git config --global filter.password.smudge ~/smudge.sh 
git config --global filter.password.clean ~/clean.sh 
Run Code Online (Sandbox Code Playgroud)

(当我运行~/smudge.sh并且~/clean.shpassword= something正确替换了行.所以脚本是正确的.)

但是当我添加/提交时database.properties,似乎对database.properties文件没有任何影响.(我猜我~/clean.sh应该在将其添加到索引时运行)

我究竟做错了什么?

git

5
推荐指数
1
解决办法
3593
查看次数

在Spring websockets中发送错误消息

我试图通过SockJS在STOMP的Spring websockets中发送错误消息.

我基本上试图实现这里正在做的事情.

这是我的异常处理程序

@MessageExceptionHandler
@SendToUser(value = "/queue/error",broadcast = false)
public ApplicationError handleException(Exception message) throws ApplicationError {
        return  new ApplicationError("test");
}
Run Code Online (Sandbox Code Playgroud)

而且我订阅了

stompClient.subscribe('/user/queue/error', stompErrorCallback, {token: accessToken});
Run Code Online (Sandbox Code Playgroud)

在我的情况下,用户未经过身份验证,但是从此处开始

虽然用户目的地通常意味着经过身份验证的用户,但并不严格要求.与经过身份验证的用户无关的WebSocket会话可以订阅用户目标.在这种情况下,@ SendToUser注释的行为与broadcast = false完全相同,即仅针对发送正在处理的消息的会话.

当我抛出这个错误时,所有这一切都正常,myHandler这是我在websocket config中定义的Websocket Handler.

我有一个ClientInboundChannelInterceptor扩展ChannelInterceptorAdapter,它拦截所有的消息preSend.

如果这个拦截器有任何异常,我想把它扔回发送此消息的用户会话,

public class ClientInboundChannelInterceptor extends ChannelInterceptorAdapter {
    @Autowired
    @Lazy(value = true)
    @Qualifier("brokerMessagingTemplate")
    private SimpMessagingTemplate simpMessagingTemplate;

    @Override
    public Message<?> preSend(Message message, MessageChannel channel) throws IllegalArgumentException{
         if(some thing goes wrong)
           throw new RuntimeException();
    }

    @MessageExceptionHandler
    @SendToUser(value …
Run Code Online (Sandbox Code Playgroud)

spring stomp spring-messaging spring-websocket

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

在Spring Security Oauth2版本2.0.7.RELEASE中请求多个作用域

我们有一个正在使用的应用程序spring-security-oauth2:1.0.我试图将其更改为更新版本spring-security-oauth2:2.0.7.RELEASE.如果我没有指定scope或如果我指定我单一范围,应用程序工作正常.我在请求多个范围时遇到问题,这些范围read,write曾经在以前的版本中工作过.

我请求的客户端拥有所有read,write and trust权限.

当我使用时spring-security-oauth2:1.0,为了得到一个令牌我曾经做过像这样的来电

HTTP://本地主机:8080 /的OAuth /令牌grant_type =密码&CLIENT_ID = WS&client_secret =秘密及范围=读,写和用户名=用户名@ abc.com和密码= temp123

如果您看到scope参数scope=read,write,通过请求这种方式,我曾经获得一个带范围的令牌read and write.

如果我尝试使用Oauth2版本做同样的事情2.0.7.RELEASE(POST尽管有请求),我会得到Invalid Scope例外,因为它tokenRequestread,write作为单个范围.我请求的客户端具有read,write and trust权限,但read,write不是其中之一.

如果我尝试使用scope=writescope=read,它工作正常,因为read或是write客户范围的一部分.

如果我想申请多个范围OAuth2 2.0.7.RELEASE,我该怎么做?

java spring spring-security spring-security-oauth2

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