栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > Web开发 > Vue.js

前后端分离 Spring Booot + Vue 开发单页面应用 个人总结(一)

Vue.js 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

前后端分离 Spring Booot + Vue 开发单页面应用 个人总结(一)

2018/01/30 更新

关于跨域:在实际开发过程中,发现跨域问题并不是那么好解决的 因为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
    以后可能完善,谢谢。
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号