/spring-cloud-demo

spring cloud demo

Primary LanguageJava

SpringCloud学习

相关整理

逻辑分层

  • Bean,JavaBean可以理解为某段JSON的Java类,主要包括字段定义、
  • DAO层主要是做数据持久层的工作,数据库设计的表与DAO层之间一一对应,DAO类需要实现增删查改等库的通用方法
  • Service层主要负责业务模块的逻辑设计,需要操作已定义的单个或多个DAO类来封装业务逻辑,比如生成订单,需要在Service提供的接口中检查库存、检查用户、插入订单记录等逻辑
  • Controller层负责业务模块流程,对外主要表现为暴露页面URL或HTTP接口,其中调用Service层来处理特定URL的业务逻辑,然后返回JSON数据或View视图

Controller层

Controller层负责业务模块流程,对外主要表现为暴露页面URL或HTTP接口,其中调用Service层来处理特定URL的业务逻辑,然后返回JSON数据或View视图

几种类型的对象

阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义,

分层领域模型规约:

  • DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
  • DTO( Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
  • BO( Business Object):业务对象。 由Service层输出的封装业务逻辑的对象。
  • AO( Application Object):应用对象。 在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
  • VO( View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。
  • POJO( Plain Ordinary Java Object):在本手册中, POJO专指只有setter/getter/toString的简单类,包括DO/DTO/BO/VO等。
  • Query:数据查询对象,各层接收上层的查询请求。 注意超过2个参数的查询封装,禁止使用Map类来传输。

领域模型命名规约:

  • 数据对象:xxxDO,xxx即为数据表名。
  • 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
  • 展示对象:xxxVO,xxx一般为网页名称。
  • POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。

mybatis

开启下划线转驼峰需要单独在配置文件中进行声明

mybatis:
  mapper-locations: classpath:dao/*.xml  #配置映射文件
  type-aliases-package: com.example.test.bean #配置实体类
  configuration:
    map-underscore-to-camel-case: true # 下划线转驼峰

lombok

参考

lombok是一个工具库,通过注解的方式消除Java代码的冗长,尤其是POJO对象,一种比较方便的用处是快速格式化请求体的json参数

首先定义dto对象

import lombok.Data;

// 使用@data注解,无需再实现set、get等方法
@Data
public class MessageDto implements Serializable {
    private int pid;
    private int userId;
    private String content;
}

然后在控制器中通过@AllArgsConstructor注解,直接将RequestBody通过dto对象接收并初始化

import lombok.AllArgsConstructor;

import java.util.List;

@RestController
@RequestMapping("/message_board/v1")
@AllArgsConstructor
public class MessageBoardController {
    @Autowired
    MessageService messageService;

    @PostMapping("/submit")
    public ResponseBean<Boolean> submitMessage(@RequestBody MessageDto dto){
        MessageBean bean = new MessageBean();
        BeanUtils.copyProperties(dto, bean);
        return new ResponseBean<>(messageService.insert(bean) > 0);
    }
}

Spring Security

首先添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

然后重启项目,访问一个url,默认情况下会跳转到 http://localhost:8080/login 页面,然后使用账号密码登录

  • 账号,默认user
  • 密码,在项目启动时的控制面板中可以找到Using generated security password: xxxx

登录成功之后就可以正常访问原本的url了,打开浏览器Application面板可以看见多了一个名字为JSESSIONID的cookie,删掉该值后需要重新登录

业务中一般需要接入自己的账号系统,需要继承WebSecurityConfigurerAdapterUserDetailsService

@Configuration
public class BrowerSecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()                    //  定义当需要用户登录时候,转到的登录页面。
                .and()
                .authorizeRequests()        // 定义哪些URL需要被保护、哪些不需要被保护
                .anyRequest()               // 任何请求,登录后可以访问
                .authenticated();
    }
}
@Component
public class MyUserDetailsService implements UserDetailsService {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // TODO 根据用户名,查找到对应的密码,与权限

        System.out.println("loadUserByUsername");
        // 封装用户信息,并返回。参数分别是:用户名,密码,用户权限
        String password = passwordEncoder.encode("123456");
        User user = new User(username, password,
                AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
        return user;
    }
}

然后访问页面重新输入账号admin和密码123456就可以重新登录了。

上面是通过表单提交进行登录然后页面跳转的,在前后端分离的场景下,可能需要提供向前端提供AJAX接口,这种需求场景下,只需要在BrowerSecurityConfig 配置中添加自定义的SimpleUrlAuthenticationSuccessHandlerAuthenticationFailureHandler

http.formLogin()                    //  定义当需要用户登录时候,转到的登录页面。
    .successHandler(authenticationSucessHandler) // 处理登录成功
    .failureHandler(authenticationFailureHandler) // 处理登录失败
    .and()
    .authorizeRequests()        // 定义哪些URL需要被保护、哪些不需要被保护
    .anyRequest()               // 任何请求,登录后可以访问
    .authenticated();

然后在对应的handler中处理鉴权和响应