[Java]Spring增加Cookie属性SameSite

前言:

          SameSite 属性相对项目的 javax.servlet-api:3.1.0还是太新了,而项目是 Spring 的,并且 Cookie 并没有 SameSite 这个属性,那么对于新的浏览器(chrome 80 之后等)多了 SameSite 属性,比如说单点登录这种,导致没有带上 token 而用户一直登录不了,现在就得给cookie带上 SameSite。

SameSite:

          防止第三方恶意 CSRF 攻击,所以用于控制第三方 Cookie,有 Strict、Lax、None 三个值,当设置为 None 时候,需要配合 Secure 使用,并且只能够 Https 访问才允许第三方发送。


增加 Maven 依赖

加一个 redies 包的依赖,需要调用到里面的类

<dependency>
     <groupId>org.springframework.session</groupId>
     <artifactId>spring-session-data-redis</artifactId>
     <version>2.5.1</version>
</dependency>

增加配置类:

我之所以用 @Service,是因为项目里面没有 @Configuration 或者 @Configurable,是因为项目都用 xml 进行配置。

考虑到项目配置管理问题,要么全部 xml 或者要么全部 类配置,避免重名的 xml 和 类已经属性配置相互加载覆盖(spring 的配置加载顺序)。

import org.springframework.stereotype.Service;
import org.springframework.context.annotation.Bean;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;

@Service
public class SpringCookieConfiguration {

    private static final String cookieName = "SSO_LOGIN";

    @Bean
    public CookieSerializer loginInCookieConfig() { // 作为单例配置
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName(cookieName); // 设置 Key
        serializer.setCookieMaxAge(60 * 60 * 24);
        serializer.setCookiePath("/test/");

        serializer.setSameSite("NONE");  // 增加 SameSite
        serializer.setUseSecureCookie(true); // 增加 Secure
        return serializer;
    }
}

注入配置类:


import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.session.web.http.CookieSerializer;


@Service
public class LoginService {

    @Autowired
    private CookieSerializer l;

    /**
     * 设置 跨域/Https cookie
     */
    public void setToken(HttpServletRequest rq, HttpServletResponse rp, String t) {
        CookieSerializer.CookieValue c = new CookieSerializer.CookieValue(rq,rp, t);
        l.writeCookieValue(c); // 这里已经写入了 response
    }

}



后记:

看上面代码好像没写入cookie一样,这就是不看源码的人:

查看  writeCookieValue 这个方法就能看到 CookieValue 其实是封装类, response 被封了进去,然后方法内又拿了出来,最后 response 进行 addHeader(区别于 setHeader),这个方法和 response.addCookie 核心处理是相同的流程处理,并且增加了 SameSite 的属性.

此外还得注意 HttpOnly、cookieName 这些源码都是单独设置有默认值的

CookieSerializer:

Response:

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Spring是一个开源的轻量级应用框架,它可以用于构建企业级应用程序。Spring框架的主要优点包括:依赖注入和面向切面编程的支持、轻量级、可测试性、松散耦合等。Spring框架可以帮助开发人员更快地构建高质量的Java应用程序,并且可以减少开发时间和成本。Spring框架的核心是IoC容器,它可以管理应用程序中的对象并处理它们之间的依赖关系。Spring框架还提供了许多其他功能,例如Web框架、数据访问框架、安全框架等,这些功能可以帮助开发人员更轻松地构建各种类型的应用程序。 以下是一个简单的Java Spring示例,演示如何使用Spring框架创建一个简单的Hello World应用程序: 1.创建一个名为HelloWorld的Java类,实现MessageService接口: ```java public class HelloWorld implements MessageService { public String getMessage() { return "Hello World!"; } } ``` 2.创建一个名为MessageService的Java接口: ```java public interface MessageService { String getMessage(); } ``` 3.创建一个名为App的Java类,使用Spring框架创建HelloWorld对象并调用getMessage方法: ```java import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); MessageService service = (MessageService) context.getBean("messageService"); System.out.println(service.getMessage()); } } ``` 4.创建一个名为applicationContext.xml的Spring配置文件,配置HelloWorld对象: ```xml <beans> <bean id="messageService" class="HelloWorld"/> </beans> ``` 以上示例演示了如何使用Spring框架创建一个简单的Hello World应用程序。通过使用Spring框架,我们可以轻松地管理应用程序中的对象,并处理它们之间的依赖关系,从而更快地构建高质量的Java应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值