首页 > 编程语言 >java 后端 控制跨域问题

java 后端 控制跨域问题

时间:2024-08-02 11:28:20浏览次数:13  
标签:控制 java String authMan request return originDomainRegex response 跨域

 

@Component
public class UserLoginInterceptor implements HandlerInterceptor {
	private static final Logger logger = LoggerFactory.getLogger(UserLoginInterceptor.class);
	
	@Value("${zyplayer.doc.manage.originDomainRegex:}")
	private String originDomainRegex;
	
	private final ThreadLocal<Long> startTimeThreadLocal = new ThreadLocal<>();
	
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3) {
		Long startTime = startTimeThreadLocal.get();
		startTime = Optional.ofNullable(startTime).orElse(System.currentTimeMillis());
		long totalTime = System.currentTimeMillis() - startTime;
		String clientIP = ServletUtil.getClientIP(request);
		logger.info("IP:{},总耗时:{}ms,URI:{}", clientIP, totalTime, request.getRequestURI());
		startTimeThreadLocal.remove();
		// 清理用户信息
		DocUserUtil.clean();
	}
	
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
	}
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
		startTimeThreadLocal.set(System.currentTimeMillis());
		// 指定域名可跨域访问
		if (StringUtils.isNotBlank(originDomainRegex)) {
			String origin = request.getHeader("Origin");
			if (StringUtils.isNotBlank(origin) && origin.toLowerCase().matches(originDomainRegex)) {
				response.setHeader("Access-Control-Allow-Origin", origin); // 允许访问的域
				response.setHeader("Access-Control-Allow-Methods", "HEAD,GET,POST,PUT,DELETE");// 允许GET、POST的外域请求
				response.setHeader("Access-Control-Allow-Credentials", "true"); // 允许请求带cookie到服务器
				response.setContentType("application/json; charset=utf-8"); // 设定JSON格式标准输出、及编码
			}
		}
		if (!(handler instanceof HandlerMethod)) {
			return true;
		}
		// 清理用户信息
		DocUserUtil.clean();
		// 设置token
		Cookie cookie = ServletUtil.getCookie(request, HttpConst.ACCESS_TOKEN);
		String accessToken = (cookie == null) ? null : cookie.getValue();
		DocUserUtil.setAccessToken(accessToken);
		AuthMan authMan = ((HandlerMethod) handler).getMethod().getAnnotation(AuthMan.class);
		if (authMan == null) {
			authMan = ((HandlerMethod) handler).getMethod().getDeclaringClass().getAnnotation(AuthMan.class);
			if (authMan == null) {
				return true;
			}
		}
		DocUserDetails currentUser = DocUserUtil.getCurrentUser();
		if (currentUser == null) {
			String reason = "你访问的内容需要登录,请登录后再试";
			DocResponseJson.failure(HttpConst.TOKEN_TIMEOUT, reason).send(response);
			return false;
		}
		// 判断权限是否足够
		boolean haveAuth = DocUserUtil.haveAuth(authMan.value());
		if (haveAuth) {
			return true;
		}
		String reasonStr = "没有操作权限,请联系管理员";
		DocResponseJson.warn(reasonStr).send(response);
		return false;
	}
	
}

 

# 系统根域名,调试UI时需要使用,同时需要在host文件里配置:127.0.0.1 local.zyplayer.com
#originDomainRegex: .*\.zyplayer\.com(:\d+|)$
originDomainRegex: .*\.zyplayer\.com(:\d+|)$

 

标签:控制,java,String,authMan,request,return,originDomainRegex,response,跨域
From: https://www.cnblogs.com/lcaiqin/p/18338390

相关文章

  • 深入理解Java中的时间处理与时区管理
    在Java开发中,时间处理和时区管理是常见的需求,特别是在全球化应用中。Java8引入了新的时间API(java.time包),使时间处理变得更加直观和高效。本文将详细介绍Java中的时间处理与时区管理,通过丰富的代码示例帮助读者掌握这些概念。1.Java8之前的时间处理在Java8之前,时间处理主......
  • Java中的运算符
    Java中的运算符Java中的运算符用于执行程序中的各种操作,如赋值、算术运算、比较、逻辑运算等。以下是Java中的主要运算符类型及其用法:赋值运算符(=):用于将右侧的值赋给左侧的变量。算术运算符:+加法-减法*乘法/除法%取模(求余数)++递增(使变量值增加1)--......
  • 流程控制语句结构
    Java三种流程控制语句简介从结构化程序设计角度出发,一般使用顺序结构、分支结构、循环结构进行程序设计和流程控制。详细的使用方法如下。顺序结构​顺序结构是程序的基本结构代码会由上而下的进行执行,中途不会出现判断或跳转。案例:publicclassProcessControl{publ......
  • Java身份证二要素核验集成方式、身份认证
    身份证二要素核验是实名认证中比较简单、便捷的身份验证技术,其主要核验身份证号码、姓名两个要素信息是否一致,从而确保用户注册时提供身份的真实性,,以此来保障人们的财产及信息安全。现如今无论是人们的生活还是工作,均需要进行个人信息的实名认证,下面以身份证二要素实名认证Jav......
  • Java的编译和运行命令
    Java的编译和运行命令Java是一种编译型语言,但与传统的编译型语言(如C或C++)不同,Java的编译和运行过程涉及到几个关键步骤,这些步骤使得Java能够实现其“一次编写,到处运行”(WriteOnce,RunAnywhere,WORA)的特性。以下是Java编译和运行的基本原理:编写源代码:开发者使用文本编辑器......
  • Java swing项目汇总
    Javaswing项目汇总序号项目名称1(无需数据库)swing推箱子小游戏2(无需数据库)swing学生基本信息管理系统3(无需数据库)仓库管理系统(源码+详细注释+详细报告)4(无需数据库)调色盘应用5(无需数据库)课程成绩录入系统6(无需数据库)课程信息管理系统7swingsqlserver学生管理系统(详细报告+......
  • JavaAPI
    JavaAPIJavaAPI(应用程序编程接口)是一组预先定义的类和接口,它们为Java程序员提供了一种构建应用程序的框架。JavaAPI定义了大量可以被Java程序调用的方法和属性,使得开发者可以利用这些预先构建的组件来执行常见的任务,而无需从头开始编写所有代码。以下是JavaAPI的一些关键特点......
  • Java的跨平台原理
    Java的跨平台原理Java源代码:开发者编写的Java源代码是平台无关的,使用Java语言特有的语法。Java编译器:使用javac命令将Java源代码编译成字节码(.class文件)。字节码是一种中间形式的代码,它不是特定于任何操作系统或硬件平台的机器码。字节码:编译生成的字节码是平台......
  • 远程控制设备没有屏幕怎么办?ToDesk扩展屏幕性能
    当你遇到要远程控制的电脑没有显示屏或屏幕无法打开,只有主机能够正常运行时,这时候该怎么办?小社长发现ToDesk远程控制软件的虚拟屏功能就能帮你解决此等难题,搭配扩展屏使用还能让你的工作效率更上一层楼!如何用虚拟屏来帮助没有屏幕的电脑进行远程控制?跟着小社长一起来科普了解一......
  • JAVA基础-关键字和保留字
    关键字和保留字目录关键字和保留字1.关键字(Keywords)2.保留字(ReservedWords)3.伪关键字(Literals)4.使用关键字和保留字的注意事项示例在Java中,关键字和保留字是一些具有特定含义的单词,它们在Java语言中扮演着重要的角色。理解这些关键字和保留字对于编写正确的Java程序至关重要。......