我有一个试图获取令牌的控制器。
当我在视图PRETTY
中执行它时,我在postman中遇到了这个错误意外的'e'
但如果我转到RAW视图,我可以看到这样的标记。
eyJraWQiOiIxIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJJc3N1ZXIiLCJhdWQiOiJBdWRpZW5jZSIsImV4cCI6MTQ3NTQ1OTMyNiwianRpIjoiTmF3d000bDVGRmFRZ0dBQkwzS3N5USIsImlhdCI6MTQ3NTQ1ODcyNiwibmJmIjoxNDc1NDU4NjA2LCJzdWIiOiJzdWJqZWN0IiwiZW1haWwiOiJtYWlsQGV4YW1wbGUuY29tIn0.f97SFDaAjUyUDK_UQgwgnCTewd0yw6tWK6DFLzpALFq177f1QMTYPbVdiIG1ViJ0FNJ6fUCleCd8BmrToUn25VSmRv799dtcz-xaN1kOgw90NQ00kPUhnDXG01-7hImkHfbmZZWORukP2yPK1sHWzpdjg9fJOvRZpZ6ZWli4HeuYRJqsFOv7PvwmGH9JnfRTf_2tboL-oAYBpT367eh60TggrvMgmrO_Taj5M7qGG0GpbwuVh_HTAkaKv7T2WmuZ2JPANhe5JvY_DDaqChtwd0IPREAhK3Xr-nTOIuwbQ0Y1hhOGfvDmikQj6DXnCERYixP6eR1dhC8n3bKvXyaVmA
这是我的控制器的代码。
@Path("/demo")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response testMethod() throws JSONException, IOException {
RsaJsonWebKey rsaJsonWebKey = RsaJwkGenerator.generateJwk(2048);
rsaJsonWebKey.setKeyId("k1");
JwtClaims claims = new JwtClaims();
claims.setIssuer("Issuer");
claims.setAudience("Audience");
claims.setExpirationTimeMinutesInTheFuture(10);
claims.setGeneratedJwtId();
claims.setIssuedAtToNow();
claims.setNotBeforeMinutesInThePast(2);
claims.setSubject("subject");
claims.setClaim("email","mail@example.com");
JsonWebSignature jws = new JsonWebSignature();
jws.setPayload(claims.toJson());
jws.setKey(rsaJsonWebKey.getPrivateKey());
jws.setKeyIdHeaderValue(rsaJsonWebKey.getKeyId());
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);
String jwt = jws.getCompactSerialization();
if(jwt == null){
return Response.status(204).entity(jwt).build();
}
return Response.status(200).entity(jwt).build();
}
我忽略邮递员中的错误,但尝试在Chrome中执行时会出现同样的错误。
我尝试用这样的角度调用我的RESTful控制器,但是我总是使用响应参数中的消息进入onError方法。
angular.min.js:118 SyntaxError: Unexpected token e in JSON at position 0
这是角度
中的代码app.service('TokenService', function($http){
this.getToken = function(){
function onSuccess(response){
console.log('got it');
}
function onError(response){
console.log('fail');
}
return $http({
method : 'GET',
url : 'http:localhost:8080/rest/demo',
header: {'Content-Type' : 'application/json'}
}).then(onSuccess, onError);
}
}
我对令牌代码的引用来自here和Jose4j
更新
我解决了这个问题。我仍然认为我最初做的方式也应该有效,但我仍然不明白为什么会出错。
我创建了一个名为Token的pojo,其属性标记为String,然后我更改了此
return Response.status(200).entity(jwt).build();
到此:
Token token = new Token();
token.setToken(jwt);
return Response.status(200).entity(token).build();
这是我的方法,返回一个真正的json对象。
答案 0 :(得分:0)
我知道现在已经太晚了,但我遇到了同样的问题,并通过您的解决方案修复了它,所以谢谢。
只是为了后来遇到这个问题的人。就我而言,我是这样做的。
HashMap<String, String> credential = new HashMap<>();
credential.put("token", jwtToken);
apiResp = ResponseEntity.ok(jwtToken);
顺便说一句,我似乎也发现了一个问题,即 Angular 可能期望来自服务器的响应默认是 JSON 对象,然后为我们将其解析为 JavaScript 对象。 所以我们得到了错误,因为我们将字符串作为响应实体返回,并且它无法将字符串解析为对象。这就是为什么将令牌放在 POJO 中解决了它。
另一种方法是像这样从客户端设置返回类型。
login(username: string, password: string): Observable<any> {
let body = {username, password};
let res = this.http.post(
`${API.AUTHENTICATION}`, body, {
responseType: 'text'
});
return res;
}
现在,JS 将知道响应是字符串类型,并且不会再尝试将其解析为对象。