电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Springboot 如何實(shí)現(xiàn)filter攔截token驗(yàn)證和跨域

瀏覽:54日期:2023-02-17 15:30:23
Springboot filter攔截token驗(yàn)證和跨域背景

web驗(yàn)證授權(quán)合法的一般分為下面幾種

使用session作為驗(yàn)證合法用戶訪問的驗(yàn)證方式 使用自己實(shí)現(xiàn)的token 使用OCA標(biāo)準(zhǔn)

在使用API接口授權(quán)驗(yàn)證時(shí),token是自定義的方式實(shí)現(xiàn)起來不需要引入其他東西,關(guān)鍵是簡(jiǎn)單實(shí)用。

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

#springboot中實(shí)現(xiàn)filter

一種是注解filter 一種是顯示的硬編碼注冊(cè)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驗(yàn)證攔截 * @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; //設(shè)置允許跨域的配置 // 這里填寫你允許進(jìn)行跨域的主機(jī)ip(正式上線時(shí)可以動(dòng)態(tài)配置具體允許的域名和IP) rep.setHeader('Access-Control-Allow-Origin', '*'); // 允許的訪問方法 rep.setHeader('Access-Control-Allow-Methods','POST, GET, PUT, OPTIONS, DELETE, PATCH'); // Access-Control-Max-Age 用于 CORS 相關(guān)配置的緩存 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('用戶授權(quán)認(rèn)證沒有通過!客戶端請(qǐng)求參數(shù)中無token信息'); } else { if (TokenUtil.volidateToken(token)) { resultInfo.setCode(Constant.SUCCESS); resultInfo.setMsg('用戶授權(quán)認(rèn)證通過!'); isFilter = true; } else { resultInfo.setCode(Constant.UN_AUTHORIZED); resultInfo.setMsg('用戶授權(quán)認(rèn)證沒有通過!客戶端請(qǐng)求參數(shù)token信息無效'); } } if (resultInfo.getCode() == Constant.UN_AUTHORIZED) {// 驗(yàn)證失敗 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

加上如下配置則啟動(dòng)時(shí)會(huì)根據(jù)注解加載此filter

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

在application.java中加入如下代碼

//注冊(cè)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; }

以上兩種方式都可以實(shí)現(xiàn)filter

跨域說明

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

區(qū)局設(shè)置跨域方式如下

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

//跨域設(shè)置 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服務(wù)端設(shè)置Respone Header頭中Access-Control-Allow-Origin 2配合前臺(tái)使用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 & 允許跨域請(qǐng)求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.啟動(dòng)類

加注解:

@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請(qǐng)求代碼實(shí)例:

<!DOCTYPE html><html><head> <meta charset='utf-8'></head><body><div id='app'><hr><h2>模型列表</h2><a href='http://www.hdgsjgj.cn/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.hdgsjgj.cn/bcjs/12861.html#' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' >編輯</a>&nbsp;&nbsp; <a href='http://www.hdgsjgj.cn/bcjs/12861.html#' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' >發(fā)布</a>&nbsp;&nbsp; <a href='http://www.hdgsjgj.cn/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',//服務(wù)端用于接收callback調(diào)用的function名的參數(shù) }).done((data) => { console.log(’done’); console.log(data); this.models = data;}).fail((error) => { console.log(’fail’); console.log(’error’);}); } }) </script> </body></html>

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 | 齿轮减速机电机一体机_齿轮减速箱加电机一体化-德国BOSERL蜗轮蜗杆减速机电机生产厂家 | 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 橡胶膜片,夹布膜片,橡胶隔膜密封,泵阀设备密封膜片-衡水汉丰橡塑科技公司网站 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 青岛侦探调查_青岛侦探事务所_青岛调查事务所_青岛婚外情取证-青岛狄仁杰国际侦探公司 | 驾驶人在线_专业学车门户网站| 东莞工厂厂房装修_无尘车间施工_钢结构工程安装-广东集景建筑装饰设计工程有限公司 | 模具硅橡胶,人体硅胶,移印硅胶浆厂家-宏图硅胶科技 | 成都亚克力制品,PVC板,双色板雕刻加工,亚克力门牌,亚克力标牌,水晶字雕刻制作-零贰捌广告 | 缠绕机|缠绕膜包装机|缠绕包装机-上海晏陵智能设备有限公司 | 棉柔巾代加工_洗脸巾oem_一次性毛巾_浴巾生产厂家-杭州禾壹卫品科技有限公司 | 三效蒸发器_多效蒸发器价格_四效三效蒸发器厂家-青岛康景辉 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 中红外QCL激光器-其他连续-半导体连续激光器-筱晓光子 | 耐力板-PC阳光板-PC板-PC耐力板 - 嘉兴赢创实业有限公司 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 一礼通 (www.yilitong.com)-企业礼品解决方案一站式服务平台 | 温州在线网 | 济南电缆桥架|山东桥架-济南航丰实业有限公司 | 化工ERP软件_化工新材料ERP系统_化工新材料MES软件_MES系统-广东顺景软件科技有限公司 | 心得体会网_心得体会格式范文模板 | 高精度电阻回路测试仪-回路直流电阻测试仪-武汉特高压电力科技有限公司 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 家用净水器代理批发加盟_净水机招商代理_全屋净水器定制品牌_【劳伦斯官网】 | 阳光1号桔柚_无核沃柑_柑橘新品种枝条苗木批发 - 苧金网 | 熔体泵_熔体出料泵_高温熔体泵-郑州海科熔体泵有限公司 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 中开泵,中开泵厂家,双吸中开泵-山东博二泵业有限公司 | 实验室装修_实验室设计_实验室规划设计- 上海广建净化工程公司 | 517瓜水果特产网|一个专注特产好物的网站| 生物制药洁净车间-GMP车间净化工程-食品净化厂房-杭州波涛净化设备工程有限公司 | 湖南自考_湖南自学考试 | 钢衬玻璃厂家,钢衬玻璃管道 -山东东兴扬防腐设备有限公司 | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 | 氨水-液氨-工业氨水-氨水生产厂家-辽宁顺程化工 | 手持气象站_便携式气象站_农业气象站_负氧离子监测站-山东万象环境 | 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 |