`

防跨域

 
阅读更多

1、建立CrossDomainFilter.java

package net.hlj.common.filter;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

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;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @项目名:houseInfo
 * @包名:net.hlj.common.filter
 * @文件名:CrossDomainFilter.java
 * @日期:Feb 9, 2012 3:49:24 PM
 * @备注:防跨域
 * @作者:apple
 */
public class CrossDomainFilter implements Filter{

	private static Log log = LogFactory.getLog(CrossDomainFilter.class);

	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest request = (HttpServletRequest) arg0;
		HttpServletResponse response = (HttpServletResponse) arg1;
		String servername_str = request.getServerName();//取前一个地址
		String currentURI = request.getRequestURI();
		Enumeration headerValues = request.getHeaders("Referer");
		String tmpHeaderValue = "";
		boolean isValid = true;
		//指定需要跳过拦截的页面地址,如果需要新增,可直接在数组中添加。
		String [] ignoreURIS={"/back/"};
		while (headerValues.hasMoreElements()) {
			// 得到完整的路径:如“http://www.xxx.com/xxx/xxx.jsp?id=xxx”
		    tmpHeaderValue = (String) headerValues.nextElement();
		    }
//		if(log.isInfoEnabled()){
//		    log.info(" 获得的参数url为: " + tmpHeaderValue );
//		    log.info(" 系统取得的url为:"+ currentURI);
//		   }

		if ("".equals(tmpHeaderValue)) {
		    isValid = false;
//		    if(log.isInfoEnabled()){
//		     log.info(" 获得的参数url为: empty");
//		     log.info(" 系统取得的url为:"+ currentURI);
//		     log.info("系统提示:请求可能来自外域!"); 
//		    }

		   } else {
//		    if(log.isInfoEnabled()){
//		     log.info("获得的参数长度为:"+tmpHeaderValue.length());
//		    }
		    tmpHeaderValue = tmpHeaderValue.toLowerCase();
		    servername_str = servername_str.toLowerCase();

		    int len = 0;
		    if (tmpHeaderValue.startsWith("https://")) {
		     len = 8;
		    } else if (tmpHeaderValue.startsWith("http://")) {
		     len = 7;
		    }

//		    if(log.isInfoEnabled()){
//		     log.info("截取前的字符串为:" + tmpHeaderValue );
//		     log.info( "从第 " + len + " 位开始截取,截取长度为:" + servername_str.length());
//		    }
		    String tmp = tmpHeaderValue.substring(len, servername_str.length() + len);
//		    if(log.isInfoEnabled()){
//		     log.info("截取后的字符串为:" + tmp);
//		    }
		    if (tmp.length() < servername_str.length()) { // 长度不够
		     isValid = false;
//		     if(log.isInfoEnabled()){
//		      log.info("截取后的字符串长度不够,请求可能来自外域!");
//		     }
		    } else if (!tmp.equals(servername_str)) {// 比较字符串(主机名称)是否相同
		     isValid = false;
//		     if(log.isInfoEnabled()){
//		      log.info("域名匹配失败,请求来自外域!");
//		     }
		    }
		   }
		  
		  
		   // 跳过指定需要拦截的页面地址
		   for (String ignoreURI : ignoreURIS) {
		    if(currentURI.contains(ignoreURI)){
		     isValid=true;
//		     if(log.isInfoEnabled()){
//		      log.info("系统已跳过检查以下url:"+currentURI);
//		     }
		    }
		   }
		   
		   //如果第一次访问
		   if(tmpHeaderValue.equals("")){
			   isValid=true;
		   }
		   
		   if (!isValid) {
		   
//		    if(log.isInfoEnabled()){
//		     log.info("系统提示信息:URL为跨域请求,即将重定向到首页。 ");
//		    }
//		    response.sendRedirect("/example/exampleIndex.jsp");
			   
			PrintWriter out=response.getWriter();
			out.print("Page Not Found!");
		   } else {
		    arg2.doFilter(arg0, arg1);
		   }


	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

 2、web.xml

 	<!-- 防跨域 -->
	<filter>
		<filter-name>CrossDomainFilter</filter-name> 
		<filter-class>net.hlj.common.filter.CrossDomainFilter</filter-class> 
	</filter> 
	<filter-mapping> 
		<filter-name>CrossDomainFilter</filter-name> 
		<url-pattern>*</url-pattern> 
	</filter-mapping> 

 

分享到:
评论

相关推荐

    Python项目跨域问题解决方案

    在Web开发中,跨域(Cross-Origin)是一个常见的问题,特别是在前后端分离的架构中,前端通常通过Ajax请求与后端API进行交互。由于浏览器的安全策略限制,不同源的资源之间不能自由通信,这就需要我们采取一些措施来...

    jquery跨域调用 js跨域调用

    在Web开发中,"跨域调用"是一个关键的话题,特别是在使用JavaScript进行AJAX操作时。由于浏览器的同源策略(Same-Origin Policy),一个域下的文档或脚本不能请求另一个域下的资源,除非这两个域完全相同。这限制了...

    cors-proxy:基于Java Jersey的CORS代理绕过javascript跨域请求限制

    cors-proxy 基于Java Jersey的CORS代理绕过javascript跨域请求限制关于由于浏览器实施的CORS限制,来自浏览器的Javascript无法访问来自其他域的资源。 该Web代理将绕过这些限制。环境Java 1.7以上Tomcat 7以上用法在...

    PHP防止跨域提交表单

    跨域提交表单即为CSRF攻击的一种形式,其原理是利用用户在某个站点的身份认证信息,通过恶意站点发起对合法站点的操作,从而达到非法目的。为了避免此类问题的发生,采用有效的防御措施变得尤为重要。 #### 防止...

    跨域依赖jar.zip

    跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种机制,允许Web应用从不同的源(比如不同的域名、协议或端口)获取资源。在传统的同源策略下,浏览器限制了JavaScript从一个源向另一个源发送HTTP请求,以...

    Canvas引入跨域的图片导致toDataURL()报错的问题的解决

    本文介绍了Canvas引入跨域的图片导致toDataURL()报错的问题的解决,分享给大家,具体如下: 【场景】 用户打开网页,则请求腾讯COS(图片服务器)上的图片。使用canvas绘图。 然后,用户可以重新选择图片、裁剪、...

    即时通讯聊天程序源码IM聊天系统即时通讯系统源码VUE开发.zip

    前端开发语言:Vue( 安卓,IOS,Web为一套前端代码),服务器端开发语言: PHP+WebSocket,数据库:MySql + Mongodb,前端打包工具:Hbuilder 服务器搭建工具...后台登录用户名:admin 密码:123456 TP伪静态,防跨域关掉

    frame,iframe,中的js的相互访问示例

    // 检查来源以防跨域攻击 console.log('收到消息:', event.data); }, false); ``` 6. **安全性与隐私** - 使用`frame`和`iframe`时,应考虑隐私和安全问题。例如,不要在未经用户同意的情况下加载第三方内容...

    跨域上传文件,多服务器相互调用

    在现代Web应用开发中,"跨域上传文件"是一个常见的需求,特别是在大型系统或分布式环境中。这个场景下,为了优化服务器资源分配,减轻单个服务器的压力,并减少项目文件的迁移和改动,通常会采用多服务器相互调用的...

    XSS跨域攻击讲义

    ### XSS跨域攻击知识点详解 #### 一、XSS攻击概览 - **定义与起源**:跨站脚本(Cross-Site Scripting,简称XSS)是一种常见的Web应用程序安全漏洞,最早出现于1996年。XSS攻击利用的是网站对用户输入数据过滤不严...

    子页面和父页面的相互调用

    // 检查来源以防跨域攻击 console.log('Parent received:', event.data); }, false); ``` 在`childPage.html`中发送消息: ```html window.parent.postMessage('Hello from child!', '...

    asp.net 跨域单点登陆Demo

    在ASP.NET中实现跨域SSO,主要涉及到以下几个关键知识点: 1. **身份验证模式**:ASP.NET支持多种身份验证模式,如Forms Authentication、Windows Authentication、Cookie Authentication等。在SSO场景中,通常使用...

    XSS跨域攻击在web项目中的防范,基于antisamy技术

    以下是对XSS跨域攻击防范和antisamy技术的详细阐述: 1. XSS类型: - 存储型XSS:恶意脚本被存储在服务器上,然后在其他用户访问相关页面时执行。 - 反射型XSS:恶意脚本通过URL参数传递,当用户点击链接或在地址...

    跨域资源那些事.pdf

    跨域资源分享(Cross-Origin Resource Sharing,简称CORS)是Web开发中解决浏览器同源策略限制的一种机制。同源策略是浏览器内置的安全措施,限制了来自不同源的“脚本”对网页内容的访问,以防止恶意代码窃取数据。...

    论文研究-跨域访问控制与边界防御方法研究.pdf

    为保障跨域访问过程中的信息网络安全,在深入分析其所面临安全风险的基础上,提出了一种跨域访问控制与边界防御模型,该模型将跨域访问过程划分为域内和跨域两个阶段,同时结合相关安全技术进行策略决策和策略实施,...

    php跨域提交及伪造SeSSION

    首先,让我们来了解一下跨域的概念。在Web应用中,浏览器实施同源策略(Same-origin Policy),这意味着一个网页只能访问与其来源URL相同协议、域名和端口的资源。当尝试从一个域名下的页面请求另一个域名的数据时,...

    基于二级链结构的跨域数据融合溯源框架设计.pdf

    基于二级链结构的跨域数据融合溯源框架设计 自动化 安全分析 安全对抗 威胁情报 网络安全

    iframe跨域高度自适应例子源码

    // 验证来源以防XSS攻击 var iframe = document.getElementById('myIframe'); // 设置iframe的高度 iframe.style.height = event.data.height + 'px'; }, false); ``` 在这个例子中,压缩包中的`content.html`...

    jsp防止跨域提交数据的具体实现.docx

    ### jsp防止跨域提交数据的具体实现 #### 概述 跨域问题一直是Web开发中的一个常见问题。当用户浏览器发起请求时,由于同源策略的限制,不同域名下的资源不能互相访问。为了保证网站安全,JSP项目也需要考虑如何...

    跨域数据共享与应用.pptx

    ### 跨域数据共享的概念与挑战 跨域数据共享是指在不同的组织、部门或系统之间进行数据交流的过程。这一概念的提出旨在打破信息孤岛,促进数据资源的有效利用,为决策提供更全面的支持。然而,跨域数据共享面临着一...

Global site tag (gtag.js) - Google Analytics