springboot和vue的前后端分离技术的相关配置

版权声明:欢迎转载,注明作者和出处就好!如果不喜欢或文章存在明显的谬误,请留言说明原因再踩哦,谢谢,我也可以知道原因,不断进步! https://blog.csdn.net/csonst1017/article/details/85329865

因为新进入的公司现在做的项目是前后端分离的,后端用的是springboot加mybatis,登录验证用的是secutiry,前端用的是vue.js。而我之前都是在做前后端一起开发的,所以在这方面还不是太明白,百度了许多资料,终于成功实现登录功能了(json参数传递)。
在这里借助一位老哥的前端vue.js代码代码链接,但是用这位老哥的前端代码过程中出了一些问题,在这里把一些需要注意的地方写出来。

前端:

vue项目文件夹\src\main.js

springboot和vue的前后端分离技术的相关配置

vue项目文件夹\config\index.js

springboot和vue的前后端分离技术的相关配置
注意这两个个配置,这是用axios进行端口转发的配置,配的地址一定要和后端springboot配置的server端口地址一样,如图。
springboot和vue的前后端分离技术的相关配置
我后端springboot配置文件是yml,配置的是8082端口,那么vue项目文件夹\src\main.js的axios地址配置和proxyTable里的也要配成跟后端一样的(http://localhost:8082),因为实现前后端分离就是,我运行vue项目,浏览器输入vue项目的地址(http://localhost:8080),然后通过这个配置项把数据进行端口转发到后端的端口。这样就不需要把前端的文件放进springboot项目里去了,各自开发各的,知道彼此的端口就行了。

还有就是登陆页点击提交的地址问题:
vue项目文件夹\src\components\manage\BlogLogin.vue
springboot和vue的前后端分离技术的相关配置

画圈里的地址是后端controller层的mapping地址,我把controller层图贴出来。
springboot和vue的前后端分离技术的相关配置

记住不需要把前端文件放进后端的项目文件夹里,之前放进去弄半天,后来才知道原来不需要,直接npm run dev把vue项目跑起来然后浏览器输vue的地址端口会自动转发传参数!!!(极度舒服)
springboot和vue的前后端分离技术的相关配置

后端:
因为后端代码是公司的,所以不好贴出来,在这里就只贴login的把。

package com.likemoney.controller;

import com.likemoney.dao.entity.Employee;
import com.likemoney.form.LoginUserForm;
import com.likemoney.config.security.SecurityUserDetails;
import com.likemoney.config.security.jwt.JwtTokenUtil;
import com.likemoney.log.factory.LogTaskFactory;
import com.likemoney.model.ResponseBean;
import com.likemoney.utils.PasswordEncoder;
import com.likemoney.service.IEmployeeService;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import static com.likemoney.utils.HttpKit.getIp;

/**
 * @author gj
 * @date 2018/12/20
 */
@RestController
public class LoginController {
    private static final Logger log = LogManager.getLogger(LoginController.class);
    @Autowired
    private AuthenticationManager authenticationManager;
    @Autowired
    //对redis进行操作
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private IEmployeeService iEmployeeService;
    @Value("${jwt.header}")
    private String header;
    @CrossOrigin
    @PostMapping("/admin/login")
    public ResponseBean login(HttpServletResponse response, @RequestBody @Valid LoginUserForm userForm) {
        Employee employee = iEmployeeService.getByAccount(userForm.getUserName());
        //调用ProviderManager的authenticate方法进行验证(
//        实际是方法中调用类中的List<AuthenticationProvider> providers集合中的各个AuthenticationProvider接口实现类中的authenticate(Authentication authentication)方法进行验证),默认DaoAuthenticationProvider
//        认证通过返回带有权限信息的authentication,AuthenticationManager的实现类ProviderManager
        //获取账户信息和密码匹配都在该方法里,详见https://www.jianshu.com/p/32fa221e03b7
        final Authentication authentication = authenticationManager.authenticate(
                //UsernamePasswordAuthenticationToken的超父类是Authentication
                new UsernamePasswordAuthenticationToken(
                        userForm.getUserName(),
                        PasswordEncoder.encode(userForm.getPassword(), employee.getEmployeeBirthday().getTime())
                )
        );
        //验证通过则把用户权限信息封装到spring全局缓存SecurityContextHolder中
        SecurityContextHolder.getContext().setAuthentication(authentication);
        //getPrincipal()返回的其实是一个UserDetails的实例,UserDetails是Spring Security中一个核心的接口。其中定义了一些可以获取用户名、密码、权限等与认证相关的信息的方法
        //认证通过后会将该UserDetails赋给认证通过的Authentication的principal
        final SecurityUserDetails userDetails = (SecurityUserDetails) authentication.getPrincipal();

        String token = JwtTokenUtil.generateToken(userDetails);
        response.addHeader(header, token);
        userDetails.setToken(token);
        //opsForValue()操作字符串
        redisTemplate.opsForValue().set("auth" + employee.getEmployeePhone(), userDetails, 60L, java.util.concurrent.TimeUnit.MINUTES);
        com.likemoney.log.LogManager.me().executeLog(LogTaskFactory.loginLog(userDetails.getId(), getIp()));
        return new ResponseBean(200, "Login success");
    }

}

在这里返回的是一个JSON类对象,里面存JSON数据。贴上代码。

package com.likemoney.model;
/**
 * @author jgh
 * @date 2018/8/20
 */
public class ResponseBean {

    // http 状态码
    private int code;

    // 返回信息
    private String msg;

    // 返回的数据
    private Object data;

    public ResponseBean(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public ResponseBean(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

springboot和vue的前后端分离技术的相关配置
随便输个账号密码测试,接收到后端传过来的json数据,测试成功,实现了参数传递功能。

好了,目前就只做到登录前后端分离了,后面可能会更新其他模块的博客(可能)。有什么问题欢迎大家在评论区互相交流!必答!