⑴ android,io.jsonwebtoken:jjwt:0.7.0 怎么使用到android
做了这么长时间的web开发,从Java EE中的jsf,spring,hibernate框架,到spring web MVC,到用PHP框架thinkPHP,到现在的nodejs,我自己版的看法是权越来越喜欢干净整洁的web层,之前用jsf开发做view层的时候,用的primefaces做的界面显示,虽然primefaces的确提供了很大的便利,可以让开发人员专注于业务逻辑开发,这样其实就省去了前端开发的工作。而后来发现有些客户需要的展现形式很难实现,或者通过拼凑的方法实现的结果效率不高。使用不灵活,后来自己渐渐的转向了做前端工程师。spring WEB MVC可以做到干净整洁的web层,可以做到web层分离,通过ajax和服务端通信。现在在学习AngularJS框架,后台数据服务端打算用REST风格的接口来做,这个在前后台交互上就要考虑数据通信的安全问题,关于这个在关于SESSION的理解一文中其实有提到的。
⑵ unexpected token o in json at position 1 什么意思
JSON报错问题的解决
今天在项目中,有一个angularJS的页面,使用$http请求后台返回JSON,结果报错Unexpected token in JSON at position 650,控制台显示的是angular内部JSON.parse时报错的。这就定位到不是angular的问题,是返回的JSON字符串有问题。然后查看开发者工具中的network,找到返回的结果,拷贝出来,通过FE工具格式化JSON,这个工具没有报错,能够正常转换。
之后修改代码,在$http添加transformResponse方法,并且把返回的结果绑定到window对象上。
$http({
url:link,
data:param,
transformResponse:function(rst){
window.rcdt=rst;
}
}).success(function(res){
//....
});
对代码做了以上修改后,在chrome的控制台里面通过
输入window.rcdt打印出返回的字符串,看不出问题来,
然后通过,JSON.parse(window.rcdt),报错Unexpected token in JSON at position 650。
之后,再在控制台输入window.rcdt=window.rcdt.replace(/s+/,""),将字符串中的空格去除。
这时候再输入JSON.parse(window.rcdt);JSON转换正常,没有报错。
到这里,算是定位到问题,是JSON中包含了特殊字符。
之后又找到请求url对应的后台,发现后台返回的是一个jsp页面,并且当初是我为了省事在jsp页面中使用EL表达式拼接的JSON字符串。
[
<c:foreach items="${myList}" var="me" varStatus="st">
{"name":"${me.name}","age":"${me.age}","content":"${me.content}"}<c:if test="!st.last">,</c:if>
</c:foreach>
]
在JSP页面中是这样写的,通过el表达式和JSTL标签生成的JSON字符串。这种写法本没有错误,能够正确返回JSON字符串的。
但是,问题就出在${me.conent}上,它的值是通过前台输入保存的.
前台这样输入后,获取的textarea中的value值里面,包换了换行符“ ”。这个换行符在前台展示是可以的,浏览器不认它是换行,但是保存数据库,并且后台没有对换行符进行处理。所以最后获取到的JSON字符串中也就包含了换行符。而JSON.parse报错的原因就是因为换行符。
所以,要对conent中的换行符进行替换。
<% request.setAttribute("vv"," ");%>
[
<c:foreach items="${myList}" var="me" varStatus="st">
{"name":"${me.name}","age":"${me.age}","content":"${fn:replace(me.content,vv,'')}"}<c:if test="!st.last">,</c:if>
</c:foreach>
]
使用jstl的fn函数对content中的换行符进行替换。因为replace函数中直接填" "会报错,所以使用request.setAttribute将“ ”设置为变量再使用,这样就能正常替换了。
到这里,问题解决了,前台也能正常转换成JSON了,不再报错了。这个问题说起来简单,但找问题的时候,花了两个小时。所以记录下来,也便于遇到同样问题的人能够快速解决问题。
另外,如果JSON.parse报错为:Unexpected token o in JSON at position 1,那就很有可能不是JSON字符串的问题,而是你调用了两次JSON.parse导致的。
或者对已经是JSON对象的对象调用JSON.parse也会报这个错误。
⑶ “unexpected token o in json at position 1”是什么意思
JSON报错问题的解决
今天在项目中,有一个angularJS的页面,使用$http请求后台返回JSON,结果报错Unexpected token in JSON at position 650,控制台显示的是angular内部JSON.parse时报错的。这就定位到不是angular的问题,是返回的JSON字符串有问题。然后查看开发者工具中的network,找到返回的结果,拷贝出来,通过FE工具格式化JSON,这个工具没有报错,能够正常转换。
之后修改代码,在$http添加transformResponse方法,并且把返回的结果绑定到window对象上。
$http({
url:link,
data:param,
transformResponse:function(rst){
window.rcdt=rst;
}
}).success(function(res){
//....
});
对代码做了以上修改后,在chrome的控制台里面通过
输入window.rcdt打印出返回的字符串,看不出问题来,
然后通过,JSON.parse(window.rcdt),报错Unexpected token in JSON at position 650。
之后,再在控制台输入window.rcdt=window.rcdt.replace(/s+/,""),将字符串中的空格去除。
这时候再输入JSON.parse(window.rcdt);JSON转换正常,没有报错。
到这里,算是定位到问题,是JSON中包含了特殊字符。
之后又找到请求url对应的后台,发现后台返回的是一个jsp页面,并且当初是我为了省事在jsp页面中使用EL表达式拼接的JSON字符串。
[
<c:foreach items="${myList}" var="me" varStatus="st">
{"name":"${me.name}","age":"${me.age}","content":"${me.content}"}<c:if test="!st.last">,</c:if>
</c:foreach>
]
在JSP页面中是这样写的,通过el表达式和JSTL标签生成的JSON字符串。这种写法本没有错误,能够正确返回JSON字符串的。
但是,问题就出在${me.conent}上,它的值是通过前台输入保存的.
前台这样输入后,获取的textarea中的value值里面,包换了换行符“ ”。这个换行符在前台展示是可以的,浏览器不认它是换行,但是保存数据库,并且后台没有对换行符进行处理。所以最后获取到的JSON字符串中也就包含了换行符。而JSON.parse报错的原因就是因为换行符。
所以,要对conent中的换行符进行替换。
<% request.setAttribute("vv"," ");%>
[
<c:foreach items="${myList}" var="me" varStatus="st">
{"name":"${me.name}","age":"${me.age}","content":"${fn:replace(me.content,vv,'')}"}<c:if test="!st.last">,</c:if>
</c:foreach>
]
使用jstl的fn函数对content中的换行符进行替换。因为replace函数中直接填" "会报错,所以使用request.setAttribute将“ ”设置为变量再使用,这样就能正常替换了。
到这里,问题解决了,前台也能正常转换成JSON了,不再报错了。这个问题说起来简单,但找问题的时候,花了两个小时。所以记录下来,也便于遇到同样问题的人能够快速解决问题。
另外,如果JSON.parse报错为:Unexpected token o in JSON at position 1,那就很有可能不是JSON字符串的问题,而是你调用了两次JSON.parse导致的。
或者对已经是JSON对象的对象调用JSON.parse也会报这个错误。
⑷ angularjs 路由拦截器怎么实现
代码如下,下面的代码实现了登陆校验,你可以写自己的拦截器
.config(function($stateProvider,$urlRouterProvider,$locationProvider,$httpProvider,$provide){
$urlRouterProvider
.otherwise('/');
$locationProvider.html5Mode(true);
$httpProvider.interceptors.push('authInterceptor');
})
.factory('authInterceptor',function($rootScope,$q,$cookies,$injector){
varstate;
return{
//
request:function(config){
config.headers=config.headers||{};
if($cookies.get('token')){
config.headers.Authorization='Bearer'+$cookies.get('token');
}
returnconfig;
},
//
responseError:function(response){
if(response.status===401){
(state||(state=$injector.get('$state'))).go('login');
//removeanystaletokens
$cookies.remove('token');
return$q.reject(response);
}
else{
return$q.reject(response);
}
}
};
})
⑸ angularjs 在未登录时,如何拦截
http拦截,即$http服务允许我们与服务端交互,有时候我们希望在发出请求之前以及收到响应之后做些事情。
$httpProvider包含了一个interceptors的数组。
我们这样创建一个interceptor。
app.factory('myInterceptor', ['$log', function($log){
$log.debug('');
var myInterceptor = {};
return myInterceptor;
}])
接着注册interceptor.
app.config(['$httpProvider', function($httpProvider){
$httpProvider.interceptors.push('myInterceptor');
}])
以下是$http拦截的一些例子。
■ 拦截器中的异步操作
app.factory('myInterceotpr','someAsyncServcie', function($q, someAsyncServcie){
var requestInterceptor = {
request: function(config){
var deferred = %q.defer();
someAsyncService.doAsyncOperation().then(function(){
...
deferred.resolve(config);
}, function(){
...
deferred.resolve(config);
})
return deferred.promise;
}
};
return requestInterceptor;
})
以上,是一个请求拦截,做了一个异步操作,根据异步操作的结果来更新config。
当然也有响应拦截。
app.factory('myInterceptor',['$q', 'someAsyncService', function($q, someAsyncSercice){
var responseInterceptor = {
response: function(response){
var deferred = $q.defer();
someAsyncService.doAsyncOperation().then(function(response){
...
deferred.resolve(response);
}, function(response){
...
deferred.resolve(response);
})
return deferred.promise;
}
};
return responseInterceptor;
}])
■ Session拦截,请求拦截
服务端有2种类型的验证,一个是基于cookie的,一种是基于token的。对于基于token验证,当用户登录,获取一个来自服务端的token,这个token在每一次请求时发送给服务端。
创建一个有关session的injector:
app.factory('sessionInjector',['SessionService', function(SessionService){
var sessionInjector = {
request: function(config){
if(!SessionService.isAnonymous){
config.headers['x-session-token'] = SessionService.token;
}
return config;
}
};
return sessionInjector;
}])
可见,把从服务端返回的token放在了config.headers中。
注册injector:
app.config(['$httpProvider', function($httpProvider){
$httpProvider.interceptors.push('sessionInjector');
}])
发出一个请求:
$http.get('');
拦截前大致是:
{
"transformRequest":[null],
"transformResponse":[null],
"method":"GET",
"url":"",
"headers":{
"Accept": "application/json, text/plain,*/*"
}
}
拦截后,在headers中多两个一个x-session-token字段:
{
"transformRequest":[null],
"transformResponse":[null],
"method":"GET",
"url":"",
"headers":{
"Accept": "application/json, text/plain,*/*",
"x-session-token":......
}
}
■ 时间戳,请求和响应拦截
app.factory('timestampMarker',[function(){
var timestampMarker = {
request:function(config){
config.requestTimestamp = new Date().getTime();
return config;
},
response: function(response){
response.config.responseTimestamp = new Date().getTime();
return config;
}
};
return timestampMarker;
}])
以上,在请求和响应时拦截,在config.requestTimestamp和config.responseTimestamp赋上当前的时间。
注册拦截器:
app.config(['$httpProvider', function($httpProvider){
$httpProvider.interceptors.push('timestampMarker');
}])
然后在运用的时候可以算出请求响应所耗去的时间。
$http.get('').then(function(response){
var time = response.config.responseTime - response.config.requestTimestamp;
console.log('请求耗去的时间为 ' + time);
})
■ 请求错误恢复,请求拦截
模拟一个请求拦截的错误情形
app.factory('requestRejector',['$q', function($q){
var requestRejector = {
request: function(config){
return $q.reject('requestRejector');
}
};
return requestRejector;
}])
拦截请求错误:
app.factory('requestRecoverer',['$q', function($q){
var requestRecoverer = {
requestError: function(rejectReason){
if(rejectReason === 'requestRejector'){
//恢复请求
return {
transformRequest:[],
transformResponse:[],
method:'GET',
url:'',
headers:{
Accept:'application/json, text/plain, */*'
}
};
} else {
return $q.reject(rejectReason);
}
}
};
return requestRecoverer;
}])
注册拦截器:
?
app.config(['$httpProvider', function($httpProvider){
$httpProvider.interceptors.push('requestRejector');
$httpProvider.interceptors.push('requestRecoverer');
}])
■ Session错误
app.factory('sessionRecoverer',['$q','$injector',function($q, $injector){
var sessionRecoverer = {
responseError: function(response){
//如果Session过期
if(response.status == 419){
var SessionService = $injector.get('SessionService');
var $http = $injector.get('$http');
var deferred = $q.defer();
//创建一个新的session
SessionService.login().then(deferred.resolve, deferred.reject);
return deferred.promise.then(function(){
reutrn $http(response.config);
})
}
return $q.reject(response);
}
};
return sessionRecoverer;
}])
⑹ angular httpClient访问的请求的时候headers挂不上数据
解决angularjs中post参数获取不到的问题的方法:
当使用angularjs发送告拆post请求时:
1 $http({
2 method : "post",
3 url : "./account/add",
4 data : {name:"123",passwd:123}
5 })
后台springMVC接受不到参数
public String add(@RequestParam String name, @RequestParam String passwd) {
}
因为angularjs发送post请求时启兆参数列表类型是 Payload(可以通过chrome调试工袜旁枣具的network查看), 而后台想要接收参数的话, 参数列表的类型需为 Form data(用jquery发送post请求时就是该类型), 所以需要做如下调整
$http({
method : "post",
url : "./account/add",
data : $.param(params),
headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
})