日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:25日期: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)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久久久亚洲精品美女| 亚洲一区日韩在线| 丝袜国产日韩另类美女| 欧美色图国产精品| 不卡视频在线| 黄色日韩精品| 自拍自偷一区二区三区| 日韩影片在线观看| 欧美日韩亚洲国产精品| 日韩午夜视频在线| 国产一卡不卡| 精品视频99| 日韩免费看片| 亚洲精品国产偷自在线观看| 亚洲综合欧美| 日韩av网站在线观看| 国产精品欧美在线观看| 成午夜精品一区二区三区软件| 激情综合婷婷| 久久三级福利| 丝袜美腿亚洲一区二区图片| 亚洲91网站| 欧美日韩伊人| 国产一区精品福利| 成人福利视频| 欧美在线资源| 亚洲青青久久| 国产精品4hu.www| 欧美日韩免费观看视频| 9色国产精品| 日韩av网站在线观看| 国内一区二区三区| 日韩视频久久| 欧美日韩一区二区三区在线电影| 91亚洲国产高清| 日韩午夜av在线| 日韩高清一区在线| 成人国产综合| 精品欧美激情在线观看| 蜜桃视频一区二区三区在线观看| 国产精品亚洲片在线播放| 神马午夜在线视频| 香蕉精品999视频一区二区| 久久国际精品| 日韩国产一区二区| 亚洲毛片在线免费| 成人高清一区| 蜜桃视频免费观看一区| 精品久久电影| 久久成人精品| 久久精品国产免费| 奶水喷射视频一区| 国产不卡精品| 中文一区一区三区免费在线观 | 麻豆中文一区二区| 欧美一级专区| 日韩欧美精品综合| 欧美一区二区三区高清视频| 欧美1区2区3区| 蜜桃视频在线观看一区| 国产精品天天看天天狠| 亚洲一级大片| 日本а中文在线天堂| 国产视频亚洲| 久久亚洲黄色| 视频一区二区三区入口| 91亚洲国产| 婷婷综合成人| 久久一级电影| 麻豆精品久久久| 日韩中文字幕不卡| 欧美精选视频一区二区| 日韩精品三区四区| 深夜视频一区二区| 欧美视频二区| 午夜在线精品| 国产精品亚洲四区在线观看| 国产精品美女久久久| 久久只有精品| 亚洲欧美网站在线观看| 国产综合色区在线观看| 国产精品亚洲产品| 影音先锋久久精品| 激情综合网址| bbw在线视频| 国产日韩亚洲| 只有精品亚洲| 今天的高清视频免费播放成人| 激情综合婷婷| 国产亚洲一区二区三区不卡| 亚洲永久字幕| 神马午夜在线视频| 久久三级中文| 欧美在线看片| 久色成人在线| 91成人超碰| 91欧美在线| 另类小说一区二区三区| 91精品丝袜国产高跟在线| 中文字幕日韩欧美精品高清在线| 免费av一区| 日韩国产网站| 黄色在线网站噜噜噜| 精品淫伦v久久水蜜桃| 国产欧美日韩在线一区二区| 日本vs亚洲vs韩国一区三区二区| 久久久久国产精品一区二区| www.com.cn成人| 91亚洲国产成人久久精品| 精品九九久久| 久久精品国产久精国产| 久久亚洲人体| 国产伊人久久| 久久影院午夜精品| 日本在线高清| 久久精品国语| 亚洲调教视频在线观看| 午夜av一区| 亚洲在线电影| 久久亚洲图片| 中文字幕一区日韩精品| 羞羞答答国产精品www一本| 亚洲一区成人| 综合亚洲自拍| 亚洲ww精品| 97久久超碰| 国产黄色精品| 国产精品二区不卡| av资源亚洲| 99精品综合| 午夜国产欧美理论在线播放 | 亚洲精品四区| 视频国产精品| 日本中文字幕不卡| 青草综合视频| 久久不卡日韩美女| 亚洲一区资源| 亚洲网站视频| 久久亚洲风情| 日本午夜精品久久久| 国产精品中文字幕制服诱惑| 精品国产a一区二区三区v免费| 岛国av在线播放| 欧美搞黄网站| 视频一区视频二区在线观看| 青青草91视频| 97人人精品| 午夜精品亚洲| 亚洲色图国产| 国产精品chinese| 黄在线观看免费网站ktv| 99成人在线视频| 蜜臀av亚洲一区中文字幕| 国产伦精品一区二区三区视频 | 欧美 日韩 国产精品免费观看| 欧美在线网站| 亚洲一区二区三区久久久| 国产日韩欧美中文在线| 日韩高清欧美| 视频一区国产视频| 国产精品网址| 欧美不卡高清一区二区三区| 亚洲综合三区| 国产日本久久| 日韩国产一区二区| 老鸭窝亚洲一区二区三区| 国产欧美日韩视频在线| 亚洲成人一区在线观看| 亚洲欧洲美洲国产香蕉| 精品一区二区男人吃奶| 亚洲精品a级片| 日韩国产91| 神马午夜在线视频| 一区二区三区网站| 精品视频91| 免费精品视频| 久久男人av| 99视频精品| 美女久久久精品| 国产视频久久| 国精品产品一区| 免费看黄色91| 国产精品久久久久蜜臀| 亚洲精品成a人ⅴ香蕉片| 麻豆视频在线看| 亚洲精品影院在线观看| 久久久久久自在自线| 免费久久99精品国产| 成人影视亚洲图片在线| 亚洲色图网站| 日韩电影二区| 日本视频中文字幕一区二区三区| 91精品韩国| 国产亚洲欧美日韩在线观看一区二区| 国产99久久| 欧美国产不卡| 三级亚洲高清视频| 日韩欧美中文| 国产精品久久国产愉拍| 丝袜美腿亚洲一区|