关于跨域:在实际开发过程中,发现跨域问题并不是那么好解决的 因为Springboot安全控制框架使用了Securtiy,它的身份认证基于 JSESSIonID 而axios框架默认是不发送cookie的,因此需要在axios配置中添加
axios.defaults.withCredentials = true
然而因为跨域策略问题,Springboot后端跨域设置也要修改
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
// addAllowedOrigin 不能设置为* 因为与 allowCredential 冲突
corsConfiguration.addAllowedOrigin("http://localhost:9528");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
// allowCredential 需设置为true
corsConfiguration.setAllowCredentials(true);
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlbasedCorsConfigurationSource source = new UrlbasedCorsConfigurationSource();
source.registerCorsConfiguration("
public interface SysUserRepository extends JpaRepository {
//...
}
我们在SysUserRepository中只添加一个findFirstByNameAndPassword方法就够了,详细源码参见 repository/SysUserRepository
接着,搭建服务层,服务层遵循服务接口 + 实现 的模式,我们现在还没有创建用户,那么就提供 saveUser 和 checkLogin 两个服务好啦,详细代码参阅 service/SysUserService 和 service/SysUserServiceImpl
服务层实现方式都比较简单粗暴,通过修改实现类可以增加密码加密等更多功能
然后,该搭建控制层了,为控制类添加 @RestController 就可以实现该类下所有方法都会自动以Json格式返回数据啦!
@RestController
@RequestMapping("/user")
@Validated
public class SysUserController {
//...
}
现在还不急着实现控制层,因为我们先要约定前后端交互的格式,下面是一个简易的格式 ,code是状态码200代表正常,message是消息通常应该是简单的一句话,data是额外的内容
消息格式及生成大量参考了 spring-boot-api-project-seed
的代码,在此表示感谢
{
"code":200,
"message":"附带的消息",
"data":{}
}
为此,在entity下创建class RestResult 和 enum ResultCode 约定消息格式及状态码,因为RestResult十分常用,设置却比较麻烦,为防止错误返回,建议采用工厂模式生成,所以要在utils下添加一个生成类ResultGenerator
相关代码参阅 entity/RestResult entity/ResultCode utils/ResultGenerator
好啦,这些搭完终于可以写controller了 /(ㄒoㄒ)/~~ java啰嗦果然名不虚传
现在我们只提供两个接口 分别是 register/login ,但是要添加参数验证
@RequestMapping("/register")
public RestResult register(@Valid SysUser user, BindingResult bindingResult) {
return generator.getSuccessResult("用户注册成功",userService.saveUser(user));
}
@RequestMapping(value = "/login",method = RequestMethod.POST)
public RestResult login(@NotNull(message = "用户名不能为空") String name,@NotNull(message = "密码不能为空") String password, HttpSession session) {
SysUser user = userService.checkLogin(name, password);
if(user != null) {
//储存到session中
session.setAttribute("user",user);
return generator.getSuccessResult("登陆成功",user);
}
return generator.getFailResult("用户名/密码错误");
}
这样我们的接口就写好了,但是如果参数没通过验证怎么办呢?程序报异常但是用户却得不到反馈是明显不可以的,所以我们添加一个exceptionHandler
@ExceptionHandler(ConstraintViolationException.class)
public RestResult handleConstraintViolationException(ConstraintViolationException cve) {
//这里简化处理了,cve.getConstraintViolations 会得到所有错误信息的迭代,可以酌情处理
String errorMessage = cve.getConstraintViolations().iterator().next().getMessage();
return generator.getFailResult(errorMessage);
}
//在后面添加了一个主键/唯一约束异常处理器,见源码
完整版代码请参阅 controller/SysUserController
项目跑一下,访问localhost:8888 ... 嗯 404 我们没有主页,那在resources/static 下创建一个index.html,将就一下
这是主页
这是主页
ok 在缺省配置下,框架会自动找到static下index.html 作为主页的
访问 http://localhost:8888/user/register?name=myadmin&password=123456 看是不是返回一个json,告诉你注册成功了呢?
{"code":200,"message":"用户注册成功","data":{"id":1,"name":"myadmin","password":"123456"}}
好,那再访问一次 http://localhost:8888/user/register?name=myadmin&password=1234 看是不是返回一个json,告诉你密码应设为6至18位了呢?
{"code":400,"message":"密码应设为6至18位","data":null}
好玩,再来一次 http://localhost:8888/user/register?name=myadmin&password=456789 看是不是返回一个json,告诉你违反主键/唯一约束条件了呢?
试着登陆一下 http://localhost:8888/user/login?name=myadmin&password=123456 应该是一个404,因为只接受post请求,如果要验证可以通过其它方法
配置还没有结束 因为前后端分离,为了开发的方便,我们需要配置一下跨域,关于跨域问题,不理解的话可以去查阅一下资料 在config下新建一个CorsConfig
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlbasedCorsConfigurationSource source = new UrlbasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig());
return new CorsFilter(source);
}
}
完整体源码 -> spring-vue-demo
前端项目搭建后续内容 前后端分离 Spring Boot + Vue 开发单页面应用 个人总结(一)
项目展示及源码- 服务端代码 spring-vue-demo
- 前端项目代码 vue-spring-demo
以后可能完善,谢谢。



