“Cookie”是小量信息,由网络服务器发送出来以存储在网络浏览器上,从而下次这位独一无二的访客又回到该网络服务器时,可从该浏览器读回此信息。Cookie 是个存储在浏览器目录的文本文件,当浏览器运行时,存储在 RAM 中。一旦你从该网站或网络服务器退出,Cookie 也可存储在计算机的硬驱上。
Cookie的特点
Cookie内存大小受限
Cookie具有生命周期
Cookie可以保持登录信息到用户下次与服务器的会话。
Cookie在生成时就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。
Cookie满足同源策略
网站同属,域名不一样,不能互相操作彼此的Cookie。
通过Filter获取请求的值,OncePerRequestFilter是spring boot中实现filter的抽象类,确保在一次请求中只需要一次filter,而不需要重复执行;在使用SpringSecurity过程中,SpringSecurity中的Filter可能被加载了两次或多次的情况。
@Component
public class CookieFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException{
Cookie[] cookies = request.getCookies();
UserAuthentication userAuthentication = new UserAuthentication();
if(cookies !=null){
for(Cookie cookie :cookies){
if("sso_user".equals(cookie.getName())){
userAuthentication.setName(cookie.getValue());
}
if("sso_user_cn".equals(cookie.getName())){
userAuthentication.setNameCN(URLDecoder.decode(cookie.getValue()));
}
if("sso_email".equals(cookie.getName())){
userAuthentication.setEmail(cookie.getValue() );
}
}
}
SecurityContextHolder.getContext().setAuthentication(userAuthentication);
filterChain.doFilter(request,response);
}
}
UserAuthentication实体类保存从Cookie中获取的值,Authentication是Spring Security中实现安全访问控制。Spring Security的安全访问控制分为Authentication(认证)和Authorization(授权)。认证指的是用户登录的信息验证,判断你账号密码是否正确;授权指的是当用户访问一个页面时判断他有没有这个权限。
public class UserAuthentication implements Authentication {
private static final long serialVersionUID = 1L;
private String name;
private String email;
private String nameCN;
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public Object getCredentials() {
return null;
}
@Override
public Object getDetails() {
return null;
}
@Override
public Object getPrincipal() {
return null;
}
@Override
public boolean isAuthenticated() {
return false;
}
@Override
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
}
public String getNameCN() {
return nameCN;
}
public void setNameCN(String nameCN) {
this.nameCN = nameCN;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
pom依赖
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
</dependency>
在后端接口中对cookie信息的使用
UserAuthentication userAuthentication = (UserAuthentication) SecurityContextHolder.getContext().getAuthentication();
String staffNamePY = userAuthentication.getName();