- JPA(Java Persistence API)是SUN官方推出的Java持久化规范
- 这里需要一个自定义一个Repository继承JpaRepository
public interface UserRepository extends JpaRepository<User,Integer>{}
- 查看JPA接口源码 (T指的是实体类,ID指的是实体类)
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAllById(Iterable<ID> var1);
<S extends T> List<S> saveAll(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
- 在JpaRepository可以定义自己的方法,但是一定要符合命名规范,一般来说IDEA会补充方法名
- 相关的注解
- @Getter / @Setter
注解对象为类,加上该注解后就可使用相应的get,set方法 - @Data
注解对象为类,加上该注解后就可使用相应的get和set方法,并且添加equals、canEquals、hashCode、toString方法 - @NotNull
注解对象为属性,在参数中使用时,如果调用时传了null值,就会抛出空指针异常 - @NoArgsConstructor
注解对象为类,创建一个无参构造方法 - @AllArgsConstructor
注解对象为类,创建一个全参数构造方法 - @EqualsAndHashCode
注解对象为类,重写equals和hashCOde方法 - @Slf4j
对象为类,在类方法中直接调用log.XXX即可记录日志 - @Synchronized
用于方法,可以锁定指定的对象,如果不指定,则默认创建一个对象锁定
- @Getter / @Setter
参考学习博客 跨域问题产生的原因
官网 MDN
这里可以去了解同源策略,CSRF攻击(跨站请求伪造)和Jsonp
解决方案 使用@CrossOrigin决绝CORS跨域
@CrossOrigin源码
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {
String[] DEFAULT_ORIGINS = { "*" };
String[] DEFAULT_ALLOWED_HEADERS = { "*" };
boolean DEFAULT_ALLOW_CREDENTIALS = true;
long DEFAULT_MAX_AGE = 1800;
/**
* 同origins属性一样
*/
@AliasFor("origins")
String[] value() default {};
/**
* 所有支持域的集合,例如"http://domain1.com"。
* <p>这些值都显示在请求头中的Access-Control-Allow-Origin
* "*"代表所有域的请求都支持
* <p>如果没有定义,所有请求的域都支持
* @see #value
*/
@AliasFor("value")
String[] origins() default {};
/**
* 允许请求头重的header,默认都支持
*/
String[] allowedHeaders() default {};
/**
* 响应头中允许访问的header,默认为空
*/
String[] exposedHeaders() default {};
/**
* 请求支持的方法,例如"{RequestMethod.GET, RequestMethod.POST}"}。
* 默认支持RequestMapping中设置的方法
*/
RequestMethod[] methods() default {};
/**
* 是否允许cookie随请求发送,使用时必须指定具体的域
*/
String allowCredentials() default "";
/**
* 预请求的结果的有效期,默认30分钟
*/
long maxAge() default -1;
}
对于这个注解是不配参数的,但是有时候跨域需要参数配置,而且跨域默认为*,这个是不安全的
- 前端代码
demo.html
设置Access-Control-Allow-Origin: *就可以了(该属性@CrossOrigin注解中默认设置为 *)
在发送真正的请求前, 会先发送一个方法为OPTIONS的预请求(preflight request), 用于试探服务端是否能接受真正的请求.
如果options获得的回应是拒绝性质的,比如404\403\500等http状态,就会停止post、put等请求的发出。
解决方案: 设置与请求处理
- 方案一:在springsecurity中的webSecurityConfig类中配置Options请求
- 在JWT的Filter中设置与请求处理 相关的处理见GitHub项目模板