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

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

Springboot 如何實現filter攔截token驗證和跨域

瀏覽:103日期:2023-02-17 15:30:23
Springboot filter攔截token驗證和跨域背景

web驗證授權合法的一般分為下面幾種

使用session作為驗證合法用戶訪問的驗證方式 使用自己實現的token 使用OCA標準

在使用API接口授權驗證時,token是自定義的方式實現起來不需要引入其他東西,關鍵是簡單實用。

合法登陸后一般使用用戶UID+鹽值+時間戳使用多層對稱加密生成token并放入分布式緩存中設置固定的過期時間長(和session的方式有些相同),這樣當用戶訪問時使用token可以解密獲取它的UID并據此驗證其是否是合法的用戶。

#springboot中實現filter

一種是注解filter 一種是顯示的硬編碼注冊filter

先有filter

import javax.servlet.annotation.WebFilter;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import springfox.documentation.spring.web.json.Json;import com.alibaba.fastjson.JSON; import java.io.IOException;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*************** * token驗證攔截 * @author bamboo zjcjava@163.com * @time 2017-08-01 */@Component//@WebFilter(urlPatterns = { '/api/v/*' }, filterName = 'tokenAuthorFilter')public class TokenAuthorFilter implements Filter { private static Logger logger = LoggerFactory .getLogger(TokenAuthorFilter.class); @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse rep = (HttpServletResponse) response; //設置允許跨域的配置 // 這里填寫你允許進行跨域的主機ip(正式上線時可以動態配置具體允許的域名和IP) rep.setHeader('Access-Control-Allow-Origin', '*'); // 允許的訪問方法 rep.setHeader('Access-Control-Allow-Methods','POST, GET, PUT, OPTIONS, DELETE, PATCH'); // Access-Control-Max-Age 用于 CORS 相關配置的緩存 rep.setHeader('Access-Control-Max-Age', '3600'); rep.setHeader('Access-Control-Allow-Headers','token,Origin, X-Requested-With, Content-Type, Accept'); response.setCharacterEncoding('UTF-8'); response.setContentType('application/json; charset=utf-8'); String token = req.getHeader('token');//header方式 ResultInfo resultInfo = new ResultInfo(); boolean isFilter = false; String method = ((HttpServletRequest) request).getMethod(); if (method.equals('OPTIONS')) { rep.setStatus(HttpServletResponse.SC_OK); }else{ if (null == token || token.isEmpty()) { resultInfo.setCode(Constant.UN_AUTHORIZED); resultInfo.setMsg('用戶授權認證沒有通過!客戶端請求參數中無token信息'); } else { if (TokenUtil.volidateToken(token)) { resultInfo.setCode(Constant.SUCCESS); resultInfo.setMsg('用戶授權認證通過!'); isFilter = true; } else { resultInfo.setCode(Constant.UN_AUTHORIZED); resultInfo.setMsg('用戶授權認證沒有通過!客戶端請求參數token信息無效'); } } if (resultInfo.getCode() == Constant.UN_AUTHORIZED) {// 驗證失敗 PrintWriter writer = null; OutputStreamWriter osw = null; try { osw = new OutputStreamWriter(response.getOutputStream(), 'UTF-8'); writer = new PrintWriter(osw, true); String jsonStr = JSON.toJSONString(resultInfo); writer.write(jsonStr); writer.flush(); writer.close(); osw.close(); } catch (UnsupportedEncodingException e) { logger.error('過濾器返回信息失敗:' + e.getMessage(), e); } catch (IOException e) { logger.error('過濾器返回信息失敗:' + e.getMessage(), e); } finally { if (null != writer) { writer.close(); } if (null != osw) { osw.close(); } } return; } if (isFilter) { logger.info('token filter過濾ok!'); chain.doFilter(request, response); } } } @Override public void init(FilterConfig arg0) throws ServletException { }}注解配置filter

加上如下配置則啟動時會根據注解加載此filter

@WebFilter(urlPatterns = { “/api/*” }, filterName = “tokenAuthorFilter”)硬編碼注冊filter

在application.java中加入如下代碼

//注冊filter @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(); TokenAuthorFilter tokenAuthorFilter = new TokenAuthorFilter(); registrationBean.setFilter(tokenAuthorFilter); List<String> urlPatterns = new ArrayList<String>(); urlPatterns.add('/api/*');registrationBean.setUrlPatterns(urlPatterns); return registrationBean; }

以上兩種方式都可以實現filter

跨域說明

springboot可以設置全局跨域,但是對于filter中的攔截地址并不其中作用,因此需要在dofilter中再次設置一次

區局設置跨域方式如下

方式1.在application.java中加入如下代碼

//跨域設置 private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin('*'); corsConfiguration.addAllowedHeader('*'); corsConfiguration.addAllowedMethod('*'); return corsConfiguration; } /** * 跨域過濾器 * @return */ @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration('/**', buildConfig()); // 4 return new CorsFilter(source); } 方式2.配置注解

必須集成WebMvcConfigurerAdapter類

/********** * 跨域 CORS:使用 方法3 * 方法: 1服務端設置Respone Header頭中Access-Control-Allow-Origin 2配合前臺使用jsonp 3繼承WebMvcConfigurerAdapter 添加配置類 http://blog.csdn.net/hanghangde/article/details/53946366 * @author xialeme * */@Configuration public class CorsConfig extends WebMvcConfigurerAdapter{ /* @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping('/**') .allowedOrigins('*') .allowCredentials(true) .allowedMethods('GET', 'POST', 'DELETE', 'PUT') .maxAge(3600); } */ private CorsConfiguration buildConfig() {CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.addAllowedOrigin('*'); // 1corsConfiguration.addAllowedHeader('*'); // 2corsConfiguration.addAllowedMethod('*'); // 3return corsConfiguration; } @Bean public CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration('/**', buildConfig()); // 4return new CorsFilter(source); } } springboot配置Filter & 允許跨域請求1.filter類

加注解:

@WebFilter(filterName = 'authFilter', urlPatterns = '/*')

代碼如下:

package com.activiti.filter; import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException; // renwenqiang@WebFilter(filterName = 'authFilter', urlPatterns = '/*')public class SystemFilter implements Filter { public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;response.setHeader('Access-Control-Allow-Origin','*');System.out.println(request.getRequestURL());filterChain.doFilter(request, servletResponse); } @Override public void destroy() { } @Override public void init(FilterConfig arg0) throws ServletException { }}2.啟動類

加注解:

@ServletComponentScan(basePackages = {'com.activiti.filter'})

代碼如下:

package com; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.servlet.ServletComponentScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean;import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication(exclude = {org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration.class,org.activiti.spring.boot.SecurityAutoConfiguration.class })@ServletComponentScan(basePackages = {'com.activiti.filter'})public class DemoActiviti0108Application {@Bean public HibernateJpaSessionFactoryBean sessionFactory() {return new HibernateJpaSessionFactoryBean(); } public static void main(String[] args) {SpringApplication.run(DemoActiviti0108Application.class, args); } }3.jquery ajax請求代碼實例:

<!DOCTYPE html><html><head> <meta charset='utf-8'></head><body><div id='app'><hr><h2>模型列表</h2><a href='http://www.piao2010.com/bcjs/12861.html#' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' id='huizhi'>繪制流程</a><hr><table border='1'> <tr><td>id</td><td>deploymentId</td><td>name</td><td>category</td><td>optional</td> </tr> <tr v-for='item in models'><td>{{ item.id }}</td><td>{{ item.deploymentId }}</td><td>{{ item.name }}</td><td>{{ item.category }}</td><td> <a href='http://www.piao2010.com/bcjs/12861.html#' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' >編輯</a>&nbsp;&nbsp; <a href='http://www.piao2010.com/bcjs/12861.html#' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' >發布</a>&nbsp;&nbsp; <a href='http://www.piao2010.com/bcjs/12861.html#' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' >刪除</a></td> </tr></table></div> <script src='https://cdn.bootcss.com/jquery/2.2.2/jquery.js'></script> <script src='https://cdn.bootcss.com/vue/2.6.10/vue.js'></script> <script> new Vue({ el: ’#app’, data: {models: [] }, created: function () {$.ajax({ type: ’GET’, url: ’http://localhost:8081/activiti/model/all’, beforeSend: function() {console.log(’beforeSend’); }, data:{}, dataType: 'json', xhrFields: {withCredentials: false }, crossDomain: true, async: true, //jsonpCallback: 'jsonpCallback',//服務端用于接收callback調用的function名的參數 }).done((data) => { console.log(’done’); console.log(data); this.models = data;}).fail((error) => { console.log(’fail’); console.log(’error’);}); } }) </script> </body></html>

大功告成 回家睡覺 嘻嘻嘻~

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
最新国产精品久久精品| 亚洲经典视频在线观看| 欧美a级一区| 精品视频在线免费看| 亚洲视频一区二区在线| 成人av在线播放网址| 欧美日韩精品一区视频| 日韩国产高清影视| 亚洲一区欧美二区| 亚洲欧美一区二区三区孕妇| 欧美日韩妖精视频| 久久久亚洲午夜电影| 国产福利电影一区二区三区| 欧美日韩欧美一区二区| 麻豆成人久久精品二区三区红 | 91视视频在线观看入口直接观看www | 成人h动漫精品| 91精品国产综合久久精品app| 蜜臀av一区二区在线免费观看| 久久久精彩视频| 亚洲成av人综合在线观看| 国产农村妇女精品一二区| 亚洲柠檬福利资源导航| 国内精品嫩模av私拍在线观看| 中文欧美字幕免费| 欧美二区在线| 国产欧美日韩一区二区三区在线观看| 99亚偷拍自图区亚洲| 久久综合色播五月| 91尤物视频在线观看| 久久久久久久综合色一本| 91性感美女视频| 国产亚洲欧美日韩俺去了| 色综合久久综合网| 国产日韩精品一区| 欧美日韩在线大尺度| 欧美国产一区在线| 欧美日一区二区在线观看| 久久久亚洲高清| 粉嫩aⅴ一区二区三区四区| 日韩欧美激情四射| 99久久精品国产一区二区三区| 国产亚洲欧美一级| 狠狠色综合网| 亚洲一线二线三线久久久| 亚洲一区二区三区涩| 日韩在线一二三区| 亚洲一区二区网站| 蜜臀久久久久久久| 777奇米四色成人影色区| 国产精品亚洲专一区二区三区| 日韩情涩欧美日韩视频| 91在线免费视频观看| 欧美国产禁国产网站cc| 亚洲视频高清| 亚洲一本大道在线| 欧美性猛交xxxx黑人交| 国产成人在线色| 国产偷国产偷精品高清尤物 | 色婷婷亚洲综合| 久久精品99国产精品日本| 91精品国产高清一区二区三区蜜臀 | 蜜桃av一区二区三区电影| 欧美日本韩国一区| 国产精品亚洲成人| 亚洲国产精品精华液ab| 国产精品有限公司| 精品一区二区免费| 久久久精品国产免大香伊| 亚洲成人在线| 美女一区二区视频| 国产亚洲美州欧州综合国| 国产欧美一区二区三区另类精品 | 日韩激情一区二区| 欧美成人性战久久| 99综合精品| 国产福利一区二区三区视频在线| 中文字幕一区二区在线观看| 欧美日韩综合不卡| 韩日精品视频| 紧缚奴在线一区二区三区| 国产精品色婷婷久久58| 在线观看视频91| 欧美日韩国产在线一区| 麻豆视频观看网址久久| 欧美激情一区三区| 久久精品国产清高在天天线 | 日韩在线一二三区| 欧美成人精品1314www| 欧美日韩亚洲国产精品| 日韩国产成人精品| 精品美女一区二区| 亚洲久久一区| 蜜桃精品在线观看| 精品蜜桃在线看| 国语精品中文字幕| 蜜桃av噜噜一区| 日韩欧美在线网站| 亚洲视频日本| 天堂蜜桃91精品| 91精品国产91综合久久蜜臀| 韩国在线一区| 亚洲日本成人在线观看| 在线视频精品| 国产一区在线看| 国产亚洲综合在线| 久久黄色影院| 不卡的看片网站| 亚洲伦理在线精品| 欧美日韩精品一区二区| 欧美激情1区2区| 一区二区成人在线| 欧美一区二区精品| 伊人蜜桃色噜噜激情综合| 五月婷婷综合网| 久久综合九色综合97婷婷女人 | 久久精品国产久精国产爱| 久久午夜免费电影| 香蕉久久国产| 国产成a人亚洲精| 亚洲综合区在线| 欧美成人综合网站| 久久字幕精品一区| 91蝌蚪porny| 天堂在线亚洲视频| 久久青草国产手机看片福利盒子| 午夜亚洲伦理| 国产69精品久久99不卡| 亚洲免费电影在线| 在线91免费看| 香蕉久久a毛片| 成a人片国产精品| 石原莉奈一区二区三区在线观看| 久久亚洲综合色一区二区三区| 久久一区免费| 午夜精品区一区二区三| 免费在线观看一区| 久久久久免费观看| 欧美一级理论性理论a| 亚洲女同同性videoxma| 99riav一区二区三区| 久久国产精品一区二区| 自拍偷拍国产精品| 欧美一区二区三区四区视频| 亚洲深夜福利| 成人黄色大片在线观看| 久久av老司机精品网站导航| 自拍偷在线精品自拍偷无码专区| 日韩精品专区在线| 在线亚洲高清视频| 极品裸体白嫩激情啪啪国产精品| 国产a区久久久| 日韩精品一二三四| 国产亚洲综合av| 欧美xxxx在线观看| 欧美日韩一区精品| 午夜一级久久| 欧美激情1区2区| 国产传媒久久文化传媒| 日韩精品免费专区| 亚洲色图另类专区| 欧美成人午夜电影| 在线电影国产精品| 毛片一区二区| 欧美日韩精品| 成人一二三区视频| 美国三级日本三级久久99| 国产精品久久久久一区| 欧美成人高清电影在线| 欧美专区亚洲专区| 免费久久99精品国产自在现线| 91丨porny丨国产入口| 激情六月婷婷久久| 三级在线观看一区二区| 国产精品久久久久久亚洲毛片 | 性欧美大战久久久久久久久| 日本一区二区三区四区| 欧美一区二区三区免费视频 | 97精品久久久久中文字幕| 国产成人h网站| 精品一区二区三区在线观看国产 | 亚洲国产合集| 午夜精品一区二区在线观看| 成人国产精品免费观看动漫| 国产精品一区在线观看你懂的| 精久久久久久久久久久| 欧美aa在线视频| 亚洲成人av一区二区三区| 一区二区三区视频在线观看| 国产精品美女久久久久久久久久久| 精品日韩一区二区三区| 欧美一区二区观看视频| 69精品人人人人| 欧美肥妇bbw| 欧美日韩成人一区| 91国产免费观看| 欧美色偷偷大香| 在线欧美日韩国产| 欧美中文字幕一二三区视频| 色94色欧美sute亚洲线路一久|