You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring框架新手求助:如何用Controller实现通讯录应用注册登录功能

嘿,作为Spring新手能搭起UserController的框架已经很棒啦!针对你要做的通讯录应用,我来一步步帮你完善和推进:

一、完善UserController的注册与登录逻辑

你给出的UserController框架已经有了核心依赖注入,接下来可以补全注册和登录的完整实现:

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private SecurityService securityService;

    @Autowired
    private UserValidator userValidator;

    // 注册页面跳转
    @RequestMapping(value = "/registration", method = RequestMethod.GET)
    public String registration(Model model) {
        model.addAttribute("userForm", new User());
        return "registration";
    }

    // 注册提交处理
    @RequestMapping(value = "/registration", method = RequestMethod.POST)
    public String registration(@ModelAttribute("userForm") User userForm, BindingResult bindingResult, Model model) {
        // 调用验证器校验用户输入
        userValidator.validate(userForm, bindingResult);

        if (bindingResult.hasErrors()) {
            return "registration";
        }

        // 保存用户到数据库
        userService.save(userForm);

        // 自动登录新注册用户
        securityService.autologin(userForm.getUsername(), userForm.getPasswordConfirm());

        return "redirect:/welcome";
    }

    // 登录页面跳转
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login(Model model, String error, String logout) {
        if (error != null) {
            model.addAttribute("error", "用户名或密码错误!");
        }
        if (logout != null) {
            model.addAttribute("message", "已成功退出登录!");
        }
        return "login";
    }

    // 登录成功后的首页(可跳转到通讯录列表)
    @RequestMapping(value = {"/", "/welcome"}, method = RequestMethod.GET)
    public String welcome(Model model) {
        return "welcome";
    }
}

几个关键说明:

  • UserValidator需要实现org.springframework.validation.Validator接口,用来校验用户名是否重复、密码是否匹配等规则
  • SecurityService里的autologin方法需要借助Spring Security的AuthenticationManager来手动触发登录逻辑
  • User实体类要包含用户名、密码、密码确认、邮箱等核心字段,记得加上JPA注解映射数据库表
二、通讯录功能的实现思路

完成登录注册后,就可以开发通讯录核心功能了:

1. 定义Contact实体类

@Entity
@Table(name = "contacts")
public class Contact {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String phone;
    private String email;

    // 关联所属用户,多对一关系
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    // 构造方法、getter、setter省略
}

2. 实现ContactService与ContactRepository

  • ContactRepository继承JpaRepository<Contact, Long>,提供基本的CRUD方法
  • ContactService封装业务逻辑,比如根据当前登录用户查询通讯录、新增/修改/删除联系人:
@Service
public class ContactService {

    @Autowired
    private ContactRepository contactRepository;

    @Autowired
    private UserService userService;

    // 获取当前登录用户的所有联系人
    public List<Contact> findAllByCurrentUser() {
        User currentUser = userService.getCurrentUser();
        return contactRepository.findByUser(currentUser);
    }

    // 保存联系人
    public Contact save(Contact contact) {
        User currentUser = userService.getCurrentUser();
        contact.setUser(currentUser);
        return contactRepository.save(contact);
    }

    // 根据ID删除联系人(需校验归属)
    public void delete(Long id) {
        Contact contact = contactRepository.findById(id).orElseThrow(() -> new RuntimeException("联系人不存在"));
        if (contact.getUser().getId().equals(userService.getCurrentUser().getId())) {
            contactRepository.delete(contact);
        } else {
            throw new RuntimeException("无权限删除该联系人");
        }
    }
}

3. 创建ContactController处理请求

@Controller
@RequestMapping("/contacts")
public class ContactController {

    @Autowired
    private ContactService contactService;

    // 通讯录列表页面
    @RequestMapping(method = RequestMethod.GET)
    public String listContacts(Model model) {
        model.addAttribute("contacts", contactService.findAllByCurrentUser());
        return "contacts/list";
    }

    // 新增联系人页面
    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public String addContactForm(Model model) {
        model.addAttribute("contact", new Contact());
        return "contacts/add";
    }

    // 提交新增联系人
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String saveContact(@ModelAttribute("contact") Contact contact) {
        contactService.save(contact);
        return "redirect:/contacts";
    }

    // 删除联系人
    @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
    public String deleteContact(@PathVariable("id") Long id) {
        contactService.delete(id);
        return "redirect:/contacts";
    }
}
三、核心配置注意事项
  • Spring Security配置:要确保只有登录用户才能访问/contacts相关路径,允许匿名访问/registration和/login
  • 模板页面:配合Thymeleaf等模板引擎编写注册、登录、通讯录列表/新增页面,比如在registration.html里绑定userForm的字段
  • 数据库配置:在application.properties里配置数据库连接信息,开启Hibernate自动建表(开发环境可用)

内容的提问来源于stack exchange,提问作者Adil Tokushev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:38:59