成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Springboot前后端分離項(xiàng)目配置跨域?qū)崿F(xiàn)過(guò)程解析

瀏覽:3日期:2023-05-03 15:10:26

項(xiàng)目登錄流程如下

用戶進(jìn)入前端登錄界面,輸入賬號(hào)密碼等,輸入完成之后前端發(fā)送請(qǐng)求到后端(攔截器不會(huì)攔截登錄請(qǐng)求),后端驗(yàn)證賬號(hào)密碼等成功之后生成Token并存儲(chǔ)到數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)中包含該Token過(guò)期時(shí)間,然后返回生成的Token到前端。

前端收到Token,表示登錄成功,把這個(gè)Token存儲(chǔ)本地。然后跳轉(zhuǎn)到用戶中心頁(yè)面,用戶中心頁(yè)面在ajax的請(qǐng)求頭中帶上Token,跟隨請(qǐng)求用戶數(shù)據(jù)接口一起帶到后端。

后端通過(guò)攔截器攔截到這個(gè)請(qǐng)求,去判斷這個(gè)Token是否有效,有效就放過(guò)去做他該做的事情,無(wú)效就拋出異常。

跨域配置

先說(shuō)一下這個(gè)前后分離的項(xiàng)目,已經(jīng)配置過(guò)跨域這些問(wèn)題。我這里后端WebMvcConfig配置的方式如下:

import com.zdyl.devicemanagement.interceptor.AccessInterceptor;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.cors.CorsConfiguration;import org.springframework.web.cors.UrlBasedCorsConfigurationSource;import org.springframework.web.filter.CorsFilter;import org.springframework.web.servlet.config.annotation.CorsRegistry;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import javax.annotation.Resource;import java.util.ArrayList;import java.util.List;@Configurationpublic class WebMvcConfig implements WebMvcConfigurer { @Resource private WebServerConfig webServerConfig; @Bean public AccessInterceptor getAccessInterceptor() { return new AccessInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { List<String> excludeUrl = new ArrayList<>(); excludeUrl.add('/error'); excludeUrl.add('/v1/zdyl/downloadFile'); excludeUrl.add('/v1/zdyl/lcoStation/qrcode/**'); excludeUrl.add('/devicemanagement/images/**/*'); excludeUrl.add('/upgrade/**'); excludeUrl.add('/v1/zdyl/login/**'); excludeUrl.add('/NewsImage/**'); excludeUrl.add('/v1/zdyl/equipment/alarm/toExcel/test'); excludeUrl.add('/v1/zdyl/deviceMonitoring/get/alarm/toExcel/**'); registry.addInterceptor(getAccessInterceptor()).addPathPatterns('/**').excludePathPatterns(excludeUrl); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { List<String> locations = new ArrayList<String>(); locations.add('classpath:/META-INF/resources/'); locations.add('classpath:/resources/'); locations.add('classpath:/public/'); locations.add('file:' + webServerConfig.getUploadFileLocation()); locations.add('file:' + webServerConfig.getPicpath()); locations.add('file:' + webServerConfig.getProjectsource()); String[] myArray = new String[locations.size()]; registry.addResourceHandler('/**').addResourceLocations(locations.toArray(myArray)); } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin('*'); config.addAllowedHeader('*'); config.addAllowedMethod('*'); source.registerCorsConfiguration('/**', config); return new CorsFilter(source); } @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping('/**').allowedHeaders('*').allowCredentials(true).allowedOrigins('*').allowedMethods('POST', 'GET', 'DELETE', 'PUT', 'OPTIONS').maxAge(3600); }}

前端每次發(fā)送請(qǐng)求也都有在ajax里面設(shè)置xhrFields:{withCredentials: true}屬性。

攔截器代碼

import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.baomidou.mybatisplus.core.toolkit.StringUtils;import com.zdyl.devicemanagement.common.exception.RRException;import com.zdyl.devicemanagement.common.utils.AccountNumber;import com.zdyl.devicemanagement.common.utils.RedisSavePrefix;import com.zdyl.devicemanagement.common.utils.RedisUtils;import com.zdyl.devicemanagement.common.utils.SystemConstants;import com.zdyl.devicemanagement.entity.LcoUsers;import com.zdyl.devicemanagement.entity.Login;import com.zdyl.devicemanagement.service.LcoUsersService;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Date;@Slf4jpublic class AccessInterceptor extends HandlerInterceptorAdapter { @Resource private RedisUtils redisUtils; @Resource private LcoUsersService lcoUsersService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.info('------------------------AccessInterceptor-------------------------'); if (request.getMethod().equals(RequestMethod.OPTIONS.name())) { return super.preHandle(request, response, handler); } //獲取請(qǐng)求token,如果token不存在,直接返回401 String token = getRequestToken(request); String loginId = getRequestloginId(request); if (StringUtils.isEmpty(token)) { throw new RRException('token為空', 401); } if (StringUtils.isEmpty(loginId)) { throw new RRException('loginId為空', 401); } Object users = redisUtils.getObject(redisUtils.getKey(RedisSavePrefix.Login, loginId), AccountNumber.loginDataBase); if (users == null) { throw new RRException('用戶尚未登錄', 401); } Login loginUser = JSONObject.parseObject(JSON.toJSONString(users), Login.class); if (!loginUser.getToken().equals(token)) { throw new RRException('token不匹配', 401); } Date loginTime = loginUser.getLoginTime(); long exitTime = loginTime.getTime() / 1000 + 7200; long time = new Date().getTime(); long nowTime = new Date().getTime() / 1000; if (nowTime > exitTime) { throw new RRException('token已過(guò)期!', 401); } QueryWrapper<LcoUsers> lcoUsersQueryWrapper = new QueryWrapper<>(); lcoUsersQueryWrapper.eq('phone', loginUser.getLoginID()); LcoUsers lcoUsers = lcoUsersService.getOne(lcoUsersQueryWrapper); request.setAttribute(SystemConstants.CURRENTUSER, lcoUsers); return super.preHandle(request, response, handler); } /** * 獲取請(qǐng)求的token */ private String getRequestToken(HttpServletRequest httpRequest) { //從header中獲取token String host = httpRequest.getHeader('token'); //如果header中不存在token,則從參數(shù)中獲取token if (StringUtils.isEmpty(host)) { host = httpRequest.getParameter('token'); }// if (StringUtils.isEmpty(host)) {// Cookie[] cks = httpRequest.getCookies();// for (Cookie cookie : cks) {//if (cookie.getName().equals('yzjjwt')) {// host = cookie.getValue();// return host;//}// }// } return host; } /** * 獲取請(qǐng)求的loginId */ private String getRequestloginId(HttpServletRequest httpRequest) { //從header中獲取token String loginId = httpRequest.getHeader('loginId'); //如果header中不存在token,則從參數(shù)中獲取token if (StringUtils.isEmpty(loginId)) { loginId = httpRequest.getParameter('loginId'); }// if (StringUtils.isEmpty(loginId)) {// Cookie[] cks = httpRequest.getCookies();// for (Cookie cookie : cks) {//if (cookie.getName().equals('yzjjwt')) {// loginId = cookie.getValue();// return loginId;//}// }// } return loginId; }/** * 對(duì)跨域提供支持 */protected boolean addCors(ServletRequest request, ServletResponse response) throws Exception { HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletResponse httpServletResponse = (HttpServletResponse) response; httpServletResponse.setHeader('Access-control-Allow-Origin', httpServletRequest.getHeader('Origin')); httpServletResponse.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS,PUT,DELETE'); httpServletResponse.setHeader('Access-Control-Allow-Headers', httpServletRequest.getHeader('Access-Control-Request-Headers')); // 跨域時(shí)會(huì)首先發(fā)送一個(gè)option請(qǐng)求,這里我們給option請(qǐng)求直接返回正常狀態(tài) if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) { httpServletResponse.setStatus(HttpStatus.OK.value()); return false; } return super.preHandle(request, response);}}

自定義異常RRException代碼

/** * 自定義異常 */public class RRException extends RuntimeException { private static final long serialVersionUID = 1L; private String message; private String code = 'INVALID'; private int status = 0; public RRException(String msg) { super(msg); this.message = msg; } public RRException(String msg, Throwable e) { super(msg, e); this.message = msg; } public RRException(String msg, String code) { super(msg); this.message = msg; this.code = code; } public RRException(String msg, int status) { super(msg); this.message = msg; this.status = status; } public RRException(String msg, String code, Throwable e) { super(msg, e); this.message = msg; this.code = code; } public String getMsg() { return message; } public void setMsg(String msg) { this.message = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; }}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美大片国产精品| 国产婷婷精品av在线| 香蕉久久国产| 国产精品一级| 亚洲国产欧美日韩| 亚洲影院在线观看| 一二三四区精品视频| 亚洲一二三区在线观看| 亚洲一级二级在线| 在线区一区二视频| 欧美日韩久久一区| 日韩视频一区二区三区在线播放| 91精品国产入口| 日韩欧美成人一区| 国产调教视频一区| 国产精品第一页第二页第三页| 亚洲女爱视频在线| 亚洲电影中文字幕在线观看| 午夜精品免费在线| 国产一区 二区 三区一级| 国产91精品一区二区麻豆亚洲| www.av精品| 亚洲精品乱码久久久久久蜜桃麻豆| 国产亚洲毛片在线| 欧美天天综合网| 精品国产在天天线2019| 国产亚洲精品bt天堂精选| 亚洲女同ⅹxx女同tv| 午夜精品视频在线观看| 国产酒店精品激情| 欧美激情麻豆| 久久亚洲高清| 精品少妇一区二区三区在线视频| 中文字幕电影一区| 亚洲第一二三四区| 国产不卡高清在线观看视频| 91视频观看免费| 免费在线亚洲欧美| 日韩一区二区三区三四区视频在线观看 | 亚洲一区在线电影| 国产在线视视频有精品| 欧美先锋影音| 欧洲一区二区av| 国产视频视频一区| 三级不卡在线观看| 91亚洲资源网| 日本精品一级二级| 欧美国产日韩精品免费观看| 日韩国产精品大片| 欧美va天堂| 欧美三级电影在线观看| 国产精品天美传媒| 精品亚洲国产成人av制服丝袜| 91美女在线视频| 色综合视频在线观看| 免费亚洲电影| 久久精品人人爽人人爽| 无码av免费一区二区三区试看| 成人h动漫精品一区二区 | 日韩一区二区在线看片| 亚洲精品国久久99热| 成人久久久精品乱码一区二区三区| 在线亚洲美日韩| 国产午夜精品一区二区三区嫩草| 日本大胆欧美人术艺术动态 | 久久精品男人的天堂| 免费高清在线视频一区·| 亚洲无线观看| 精品国精品自拍自在线| 青青草国产成人av片免费| 69成人精品免费视频| 色哦色哦哦色天天综合| 国产精品免费视频观看| 国产又粗又猛又爽又黄91精品| 国产欧美一级| 中文字幕av不卡| 成人午夜av在线| 欧美日韩精品一区二区三区蜜桃| 亚洲综合在线电影| 欧美日韩国产综合网| 精品国产一区二区三区四区四| 麻豆视频观看网址久久| 国产精品亚洲综合久久| 亚洲色图一区二区三区| 午夜天堂精品久久久久| 久久伊99综合婷婷久久伊| 精品国产百合女同互慰| 国模无码大尺度一区二区三区| 久久一区二区三区av| 亚洲一区二区三区四区在线| 亚洲网站在线| 国产精品一级久久久| 夜夜夜精品看看| 一本色道久久| 亚洲综合在线五月| 在线综合视频| 亚洲一区二区三区四区中文字幕| 亚洲毛片一区| 伊人夜夜躁av伊人久久| 99热精品在线观看| 亚洲视频精选在线| 在线综合亚洲| 亚洲电影中文字幕在线观看| 国产私拍一区| 日日摸夜夜添夜夜添国产精品| 久久激情婷婷| 美女性感视频久久| 5月丁香婷婷综合| 国产91精品在线观看| 亚洲精品一区二区三区精华液| www.日韩在线| 亚洲国产高清在线观看视频| 激情综合视频| 亚洲福利视频一区| 欧美私模裸体表演在线观看| 国产亚洲自拍一区| 国产一区二区三区四区三区四 | 一区二区三区中文在线观看| 亚洲高清视频一区二区| 夜夜亚洲天天久久| 在线一区二区三区做爰视频网站| 韩国欧美国产一区| 久久久欧美精品sm网站| 亚洲经典在线| 日本特黄久久久高潮| 91精品国产黑色紧身裤美女| 91色porny蝌蚪| 亚洲综合久久av| 欧美色图天堂网| 91视频91自| 亚洲福利视频一区二区| 99久久国产综合精品色伊| 国产精品无码永久免费888| 亚洲一区二区三区免费观看| 久久se精品一区二区| 精品日韩成人av| 亚洲精品一区二区三| 奇米色一区二区三区四区| 欧美电影免费观看高清完整版在线观看| 91视频.com| 香蕉成人伊视频在线观看| 91麻豆精品国产91久久久久久久久| 亚洲裸体xxx| 日韩国产精品久久| 欧美区视频在线观看| 99久久伊人久久99| 亚洲制服少妇| 丁香激情综合国产| 国产精品网曝门| 欧美蜜桃一区二区三区| 2014亚洲片线观看视频免费| 亚洲精品色图| 国产传媒一区在线| 亚洲日本免费电影| 欧美精选午夜久久久乱码6080| 国产精品jizz在线观看美国 | 一区二区成人在线| 成人午夜av电影| 一区二区在线免费观看| 日韩欧美专区在线| 免费久久久一本精品久久区| 成人国产一区二区三区精品| 亚洲成人第一页| 亚洲国产高清不卡| 欧美另类久久久品| 亚洲一区高清| 欧美极品一区| 国产成人av影院| 日韩中文字幕av电影| 美国毛片一区二区三区| 中文字幕一区二区三区不卡| 欧美日韩视频在线一区二区| 国产日本精品| 久久综合九色综合97婷婷| 欧美成人嫩草网站| 日韩高清一区在线| 亚洲国产精品v| 日韩小视频在线观看专区| 小嫩嫩精品导航| 亚洲高清资源综合久久精品| 国产91综合一区在线观看| 午夜日韩在线观看| 自拍偷拍国产精品| 精品国产网站在线观看| 国产精品人人爽人人做我的可爱| 99精品视频在线观看| 国产麻豆午夜三级精品| 日韩有码一区二区三区| 亚洲男人的天堂在线aⅴ视频| 久久久久久一二三区| 日韩一区二区影院| 欧美日韩国产综合久久| 色诱视频网站一区| 美女视频一区免费观看| 国产欧美日韩亚洲| 日韩亚洲视频在线| 在线 亚洲欧美在线综合一区| 欧美日韩精品免费观看视频完整| 99综合电影在线视频| 不卡高清视频专区|