成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_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国内精品久久久久久久
日韩电影一区二区三区| 日韩一级二级三级| 91精品国产综合久久精品app | 国产精品区一区二区三区| 成人黄色小视频在线观看| 欧美久久婷婷综合色| 老司机精品视频一区二区三区| 久久综合影音| 天天亚洲美女在线视频| 欧美亚洲三区| 亚洲视频免费看| 狠狠综合久久av一区二区老牛| 国产精品私房写真福利视频| 午夜精品一区二区三区四区| 国产三区在线成人av| 91一区二区在线观看| 久久综合五月天婷婷伊人| 国产成人亚洲综合a∨婷婷| 337p亚洲精品色噜噜噜| 国产乱码精品一区二区三区av | 波多野结衣中文一区| 精品久久久久久久久久久久久久久| 极品销魂美女一区二区三区| 欧美精品黑人性xxxx| 国产·精品毛片| 久久久一区二区三区捆绑**| 91农村精品一区二区在线| 精品成人a区在线观看| 色综合久久中文字幕综合网| 中文字幕av免费专区久久| 亚洲第一网站| 亚洲aaa精品| 欧美亚洲动漫精品| 国模一区二区三区白浆| 日韩欧美黄色影院| 97久久超碰国产精品| 国产精品天美传媒沈樵| 国产精品大片| 一区二区三区欧美在线观看| 色婷婷综合久久| 国产乱人伦偷精品视频免下载| 精品国产一区二区三区久久久蜜月 | 欧美三级三级三级| 国产一区二区免费视频| 日韩久久精品一区| 99久久国产综合精品麻豆| 一区在线观看视频| 久久久夜精品| 国产另类ts人妖一区二区| 久久久久国色av免费看影院| 日韩午夜免费视频| 日本vs亚洲vs韩国一区三区二区| 欧美一级淫片007| 色综合久久综合网欧美综合网| 亚洲欧洲制服丝袜| 色先锋资源久久综合| 国产麻豆视频精品| 久久综合久久综合亚洲| 亚洲第一毛片| 日本大胆欧美人术艺术动态| 7777精品伊人久久久大香线蕉超级流畅| av中文字幕一区| 亚洲卡通欧美制服中文| 欧美在线一区二区三区| 91亚洲资源网| 亚洲国产日韩a在线播放性色| 91精品在线麻豆| 欧美激情四色| 天堂在线亚洲视频| 国产日韩精品视频一区二区三区| 亚洲乱码中文字幕| 欧美在线小视频| 成人国产在线观看| 亚洲欧美一区二区三区极速播放 | 亚洲精选成人| 蜜臀av性久久久久蜜臀av麻豆| 欧美成人精品高清在线播放| 日韩一级大片| 国产成人高清视频| 亚洲欧美视频在线观看视频| 欧美三级电影一区| 欧美日韩专区| 另类小说一区二区三区| 26uuu国产电影一区二区| 亚洲一区二区三区在线观看视频| 黄色日韩三级电影| 国产日韩欧美亚洲| 在线观看中文字幕不卡| 好吊色欧美一区二区三区四区| 狠狠色狠狠色综合日日91app| 中文字幕一区av| 欧美一级生活片| 久久xxxx精品视频| 欧美激情第二页| 久久成人av少妇免费| 综合网在线视频| 欧美成人欧美edvon| 久久婷婷麻豆| 午夜精品视频| 久久精品理论片| 国产精品视频线看| 欧美日韩国产免费一区二区 | aaa亚洲精品| 91精品啪在线观看国产60岁| 日韩精品五月天| 日韩欧美视频在线| 在线综合视频| 国产成人a级片| 亚洲高清视频中文字幕| 久久久精品人体av艺术| 91国产免费看| 91久久精品www人人做人人爽| 国产黑丝在线一区二区三区| 亚洲免费av高清| 欧美一卡二卡在线| 久久天天狠狠| 亚洲精品免费观看| 欧美在线黄色| 国产馆精品极品| 秋霞电影网一区二区| 亚洲欧美偷拍另类a∨色屁股| 日韩一区二区三区免费看| 麻豆精品网站| 亚洲性人人天天夜夜摸| 成人av电影在线播放| 蜜乳av一区二区三区| 一区二区三区中文字幕电影| 久久亚洲二区三区| 在线免费不卡电影| 亚洲少妇一区| 欧美激情无毛| 成人avav影音| 国产精品一区在线| 日本亚洲天堂网| 亚洲精品美国一| 中文字幕欧美日本乱码一线二线| 欧美一区2区视频在线观看| 欧美在线看片a免费观看| 国产日韩欧美亚洲一区| 欧美午夜影院| 色综合久久中文综合久久牛| 风间由美一区二区av101| 极品销魂美女一区二区三区| 亚洲1区2区3区4区| 一区二区三区中文在线观看| 中文字幕在线播放不卡一区| 久久精品人人做人人爽人人| 欧美成人video| 欧美精品久久一区| 91精品办公室少妇高潮对白| 国产亚洲在线观看| 亚洲午夜精品久久久久久浪潮| 91色.com| 99久久99久久精品国产片果冻 | 国产自产高清不卡| 久热成人在线视频| 日产国产高清一区二区三区 | 日本一道高清亚洲日美韩| 亚洲一区二区黄色| 一区二区三区日韩欧美精品| 国产精品国产三级国产有无不卡| 欧美国产一区视频在线观看| 久久美女高清视频| 久久综合久久综合久久| 欧美一区二区三区四区久久| 欧美日韩一区二区三区免费看| 日本道精品一区二区三区| 色综合久久66| 91传媒视频在线播放| 久久久久久9| 日本道在线观看一区二区| 久久精品91| 久久人人97超碰国产公开结果| 午夜在线精品偷拍| 久久久久久久久一区二区| 久久精品首页| 欧洲一区二区三区在线| 欧美亚洲日本国产| 欧美日韩国产另类一区| 这里只有精品电影| 欧美一区二区三区的| 欧美本精品男人aⅴ天堂| 精品国产百合女同互慰| 久久久噜噜噜久久中文字幕色伊伊 | 精品一区二区在线看| 精品一区二区三区日韩| 精品无人区卡一卡二卡三乱码免费卡| 九色porny丨国产精品| 国产在线精品国自产拍免费| 久久99精品视频| 国产精选一区二区三区| 东方欧美亚洲色图在线| 91浏览器打开| 国产一区二区在线观看免费播放| 在线看片日韩| 亚洲综合99| 欧洲国内综合视频| 3atv在线一区二区三区| 日韩欧美一区二区在线视频| 欧美精品一区二区不卡|