日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

vue前后分离session实现_vue2 前后端分离项目ajax跨域session问题解决

發布時間:2024/7/23 vue 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vue前后分离session实现_vue2 前后端分离项目ajax跨域session问题解决 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近學習使用vuejs前后端分離,重構一個已有的后臺管理系統,遇到了下面這個問題:

實現跨域請求時,每次ajax請求都是新的session,導致無法獲取登錄信息,所有的請求都被判定為未登陸。

1、 vuejs ajax跨域請求

最開始使用的是vue-resource,結果發現vue2推薦的是axios,于是改成axios;

安裝axios

npm install axios -S

安裝完成后在main.js中增加一下配置:

import axios from 'axios';

axios.defaults.withCredentials=true;

main.js全部配置如下:

import Vue from 'vue'

import App from './App.vue'

import ElementUI from 'element-ui'

import 'element-ui/lib/theme-default/index.css'

import router from './router';

import axios from 'axios';

import './assets/css/main.css'

import './assets/css/color-dark.css'

//開啟debug模式

Vue.config.debug = true;

axios.defaults.withCredentials=true;

Vue.prototype.$axios = axios;

Vue.use(ElementUI);

new Vue(

{

router,

el: '#app',

render: h => h(App)

}

).$mount('#app')

在XXX.vue文件中具體使用如下:

v-for="menu in menulist" :key="menu.fidStr">

{{menu.fname}}

{{menu.fname}}

{{firstLevelChild.fname}}

{{firstLevelChild.fname}}

{{secondLevelChild.fname}}

export default {

data() {

return {

uniqueOpened:true,

menulist:[]

}

} ,

mounted: function() {

let self = this;

this.$axios.post('http://localhost:8080/test/xxx/xxxx', {}, {

headers: {

"Content-Type":"application/json;charset=utf-8"

},

withCredentials : true

}).then(function(response) {

// 這里是處理正確的回調

let result = response.data.result;

if (0 == result) {

self.menulist = response.data.item.menulist;

} else if (11 == result || 9 == result) {

self.$router.push('/login');

} else {

console.log(response.data);

}

}).catch( function(response) {

// 這里是處理錯誤的回調

console.log(response)

});

}

}

.sidebar{

display: block;

position: absolute;

width: 200px;

left: 0;

top: 70px;

bottom:0;

background: #2E363F;

}

.sidebar > ul {

height:100%;

}

在后臺項目中的登陸攔截器中設置了,接受跨域訪問的header,如下:

public class LoginInterceptor extends HandlerInterceptorAdapter {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {

response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, accept, content-type, xxxx");

response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH");

response.setHeader("Access-Control-Allow-Origin", "*");

return true;

}

現在可以就可以跨域訪問了。

2、登陸session獲取

因為是后臺管理系統,肯定都需要需要登陸,才能用的, 因此我在登陸時保存了session

//登陸成功

session.setAttribute("user", obj);

我希望其它請求進來時,在攔截器中判斷是否登陸了,是否有權限訪問這個請求路徑

//攔截器中增加,獲取session代碼

HttpSession session =request.getSession();

System.out.println("攔截器中的session的id是====" + session.getId());

Object obj = session.getAttribute("user");

結果發現,每次ajax跨域訪問都是新的session ,每次的sessionID都不一樣

在segmentfault上提了一個問題,有人提示需要讓ajax請求攜帶cookie,也就是認證信息,于是在攔截器中,增加了一個需要認證信息的header:

response.setHeader("Access-Control-Allow-Credentials", "true");

然后再次在瀏覽器中測試,發現瀏覽器提示,當Access-Control-Allow-Credentials設為true的時候,Access-Control-Allow-Origin不能設為星號,既然不讓我設為星號,我就改成前端項目的配置

response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8010");

發現每次ajax請求,還是不同的session,打開chrome的network,發現每次請求的請求頭中并沒有,和我想象的一樣攜帶cookie信息,也就是下面這個header:

Cookie:JSESSIONID=node015f4w1j2kgjk61i7jyyim8lo3u0.node0;

因為我用的axios,所以找到axios的文檔鏈接描述

發現一下內容:

// `timeout` specifies the number of milliseconds before the request times out.

// If the request takes longer than `timeout`, the request will be aborted.

timeout: 1000,

// `withCredentials` indicates whether or not cross-site Access-Control requests

// should be made using credentials

withCredentials: false, // default

// `adapter` allows custom handling of requests which makes testing easier.

// Return a promise and supply a valid response (see lib/adapters/README.md).

adapter: function (config) {

/* ... */

},

withCredentials默認是false,意思就是不攜帶cookie信息,那就讓它為true,我是全局性配置的,就是main.js中的這句話:

axios.defaults.withCredentials=true;

然后再測試,發現每次ajax請求都是同樣的session了(不包含瀏覽器的options請求)。

3、代理配置

因為不想每個頁面里的請求都寫http://127.0.0.1:8080,并且我用的是element ui的webpack項目模板,

所以就想使用代理(不知道叫這個合適不合適):

devServer: {

host: '127.0.0.1',

port: 8010,

proxy: {

'/api/': {

target: 'http://127.0.0.1:8080',

changeOrigin: true,

pathRewrite:{

'/api':'/xxxxxx'

}

}

}

把ajax請求改成下面這個樣子:

this.$axios.post('/api/xx/xxx', {}, {

headers: {

"Content-Type": "application/json;charset=utf-8"

}

}).then(function(response) {

// 這里是處理正確的回調

}).catch(function(response) {

// 這里是處理錯誤的回調

console.log(response)

});

網上說都是配置為proxyTable, 用的是http-proxy-middleware這個插件,我裝上插件,改成這個,webpack總是報錯,說proxyTable是非法的配置,無法識別。

無奈改成了模板自帶的proxy,可以使用,為什么可以用,我還不清楚,proxyTabel為什么不能用,也沒搞明白。有知道的,可以指點一下。

雖然代理配置好了,也能正常請求,結果發現請求的session又不一樣了,感覺心好累啊!!!

沒辦法,只能再看請求頭是不是有問題,發現返回header中有session限制的,如下:

set-cookie:JSESSIONID=node0v5dmueoc119rb42b59k5qf3w0.node0;Path=/xxxx

要求cookie只能再/xxxx下也就是項目的根路徑下使用,于是我把代理改成:

devServer: {

host: '127.0.0.1',

port: 8010,

proxy: {

'/xxxx/': {

target: 'http://127.0.0.1:8080',

changeOrigin: true

}

}

session又恢復正常了,可以用了;不知道為什么配成api映射的形式為什么不能用。

這就是解決這個跨域session問題的過程,希望對大家有點幫助!

總結

以上是生活随笔為你收集整理的vue前后分离session实现_vue2 前后端分离项目ajax跨域session问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。