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

您的位置:首頁技術文章
文章詳情頁

Springboot前后端分離項目配置跨域實現過程解析

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

項目登錄流程如下

用戶進入前端登錄界面,輸入賬號密碼等,輸入完成之后前端發送請求到后端(攔截器不會攔截登錄請求),后端驗證賬號密碼等成功之后生成Token并存儲到數據庫,數據庫中包含該Token過期時間,然后返回生成的Token到前端。

前端收到Token,表示登錄成功,把這個Token存儲本地。然后跳轉到用戶中心頁面,用戶中心頁面在ajax的請求頭中帶上Token,跟隨請求用戶數據接口一起帶到后端。

后端通過攔截器攔截到這個請求,去判斷這個Token是否有效,有效就放過去做他該做的事情,無效就拋出異常。

跨域配置

先說一下這個前后分離的項目,已經配置過跨域這些問題。我這里后端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); }}

前端每次發送請求也都有在ajax里面設置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); } //獲取請求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已過期!', 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); } /** * 獲取請求的token */ private String getRequestToken(HttpServletRequest httpRequest) { //從header中獲取token String host = httpRequest.getHeader('token'); //如果header中不存在token,則從參數中獲取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; } /** * 獲取請求的loginId */ private String getRequestloginId(HttpServletRequest httpRequest) { //從header中獲取token String loginId = httpRequest.getHeader('loginId'); //如果header中不存在token,則從參數中獲取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; }/** * 對跨域提供支持 */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')); // 跨域時會首先發送一個option請求,這里我們給option請求直接返回正常狀態 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; }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91精品国产调教在线观看| 久久国产精品美女| 亚洲精品麻豆| 里番精品3d一二三区| 色婷婷狠狠五月综合天色拍| 少妇精品久久久一区二区三区| 久久伊人亚洲| 夜久久久久久| 精品欧美日韩精品| 欧美高清一区| 麻豆视频一区二区| 亚洲欧美日韩国产一区二区| 欧美日韩一区自拍| 九九在线精品| 国产精品调教| 欧美成人高清| 久久国产电影| 人人草在线视频| 色综合五月天| 精品视频网站| 国产成人精品一区二区三区视频| 日韩在线网址| 日韩激情综合| 日韩精品午夜视频| 美女视频黄 久久| 精品国产中文字幕第一页| 久色成人在线| 国产日韩综合| 国产亚洲久久| 国产精品二区影院| 精品国产一区二区三区噜噜噜| 香蕉久久久久久| 在线观看视频免费一区二区三区| 视频在线在亚洲| 欧美交a欧美精品喷水| 久久中文精品| 成人三级高清视频在线看| 亚洲午夜黄色| 丝袜美腿亚洲一区二区图片| 日韩精品亚洲专区在线观看| 正在播放日韩精品| 久草精品视频| 精品一区毛片| 日韩精品免费视频一区二区三区 | 日韩一区二区三区免费视频 | 国产精品多人| 首页国产精品| 精品一区毛片| 免费观看亚洲天堂| 亚洲精品一区二区妖精| 午夜电影一区| 六月婷婷综合| 婷婷中文字幕一区| 日本久久一区| 久久中文亚洲字幕| 美女久久精品| 一区在线视频观看| 亚洲精品一级| 色综合www| 国产日韩三级| 国产婷婷精品| 蜜桃tv一区二区三区| 国产精品亚洲综合久久| 蜜桃视频第一区免费观看| 手机在线电影一区| 国产麻豆精品久久| 欧美日韩国产一区精品一区| 国产美女精品视频免费播放软件| 日韩亚洲国产欧美| 国产精品91一区二区三区| 日韩国产在线一| 视频一区视频二区中文字幕| 国产一区二区三区成人欧美日韩在线观看 | 精品国产三区在线| 久久国产精品99国产| 欧美三级精品| 国产aa精品| 国产成人精品一区二区三区免费 | 涩涩av在线| 亚洲一区二区av| 鲁大师成人一区二区三区| 精品1区2区3区4区| 国产综合色产| 日韩精品不卡一区二区| 精品三级av在线导航| 日本成人手机在线| 日韩精品视频在线看| 国产精品a久久久久| 国产精品三级| 精品丝袜在线| 91日韩欧美| 日韩欧美不卡| 国产在线欧美| 日韩精品第二页| 国产精品久久| 国产一区精品福利| 蜜桃久久久久| 91精品国产成人观看| 欧美不卡高清| 亚洲a级精品| 精品久久影院| 国产一级久久| 国产日产精品_国产精品毛片| 亚洲欧美日韩国产一区| 国产精品亚洲成在人线| 国产精品久久久久av蜜臀| 麻豆一区在线| 亚洲欧美日韩国产综合精品二区| 视频一区日韩| 99久久久久| 亚洲aⅴ网站| 欧美13videosex性极品| 夜久久久久久| 成人在线超碰| 日欧美一区二区| 国产成人久久精品一区二区三区| 好吊日精品视频| 国产精品自在| 亚洲一区国产一区| 国产一区二区三区日韩精品| 99在线观看免费视频精品观看| 免费在线日韩av| 亚洲精品a级片| 欧美一区成人| 男女精品网站| 久久久人人人| 精品视频高潮| 麻豆精品久久久| 国产欧美88| 日韩 欧美一区二区三区| 美女久久99| 国产精品主播| 97成人超碰| 亚洲18在线| 日本精品久久| 美国欧美日韩国产在线播放| 日韩网站中文字幕| 日韩国产欧美| 天堂中文在线播放| 国产精品www.| 国产精品一区免费在线| 日本综合视频| 欧美一区91| 日韩激情视频网站| 日本天堂一区| 亚洲精品影视| 四虎国产精品免费久久| 亚洲免费在线| 亚洲欧洲国产精品一区| 国产伦精品一区二区三区视频 | 在线视频亚洲欧美中文| 欧美午夜不卡| 丝袜美腿一区二区三区| 日韩精品一二三区| 国产福利资源一区| 久久人人精品| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产中文一区| 五月天久久网站| 亚洲制服少妇| 免费在线观看一区| 激情婷婷综合| 视频一区二区三区中文字幕| 91精品国产经典在线观看 | 免费日韩成人| 亚洲第一精品影视| 欧美日韩亚洲一区| 在线日韩中文| 国产精品午夜一区二区三区| 岛国av在线播放| 欧美日韩在线网站| 亚洲精品在线国产| 久久男人av资源站| 日韩中文字幕亚洲一区二区va在线| 久久国产精品色av免费看| 激情亚洲影院在线观看| 美女被久久久| 91精品一区二区三区综合在线爱| 91精品蜜臀一区二区三区在线| 日韩欧美中文字幕电影| 国内不卡的一区二区三区中文字幕| 不卡一区2区| 国产成人1区| 日韩国产精品久久久久久亚洲| 婷婷激情一区| 久久黄色影视| 欧美不卡视频| 视频二区不卡| 国产极品一区| 综合激情视频| 噜噜噜久久亚洲精品国产品小说| 国产精品调教视频| 日韩三级精品| 国产一区二区三区不卡视频网站 | 久久九九电影| 亚洲精品乱码久久久久久蜜桃麻豆| 91精品观看| 黄色不卡一区| 国产综合婷婷| sm捆绑调教国产免费网站在线观看 |