SpringMVC使用注解实现登录功能

下面我将为您详细讲解如何使用注解实现SpringMVC的登录功能。

1. 创建SpringMVC项目

首先,我们需要使用Maven工具创建一个空的SpringMVC项目:

<groupId>com.example</groupId>
<artifactId>springmvcdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>

2. 创建实体类

接着,我们需要创建一个实体类,用于储存用户信息。这里我们创建一个User类:

public class User {
    private String username;
    private String password;

    // getters and setters
}

3. 创建DAO层

然后,我们需要创建一个DAO层,用于查询数据库中的用户信息。这里我们使用JdbcTemplate进行数据库操作:

@Repository
public class UserDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public User getUser(String username) {
        List<User> userList = jdbcTemplate.query(
            "SELECT * FROM user WHERE username = ?",
            new Object[]{username},
            new BeanPropertyRowMapper<>(User.class)
        );

        return userList.isEmpty() ? null : userList.get(0);
    }
}

4. 创建Service层

接下来,我们需要创建一个Service层,对DAO层进行包装,提供更加友好的API:

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    public boolean verifyUser(String username, String password) {
        User user = userDao.getUser(username);
        return user != null && user.getPassword().equals(password);
    }
}

5. 创建Controller

现在我们需要创建Controller层,处理用户请求。这里我们使用注解,实现登录功能。

@Controller
public class LoginController {
    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public String login() {
        return "login";
    }

    @PostMapping("/doLogin")
    public String doLogin(@RequestParam("username") String username,
                          @RequestParam("password") String password,
                          HttpSession session,
                          Model model) {
        if (userService.verifyUser(username, password)) {
            session.setAttribute("username", username);
            return "redirect:/home";
        } else {
            model.addAttribute("msg", "Invalid username or password.");
            return "login";
        }
    }

    @RequestMapping("/home")
    public String home(HttpSession session, Model model) {
        String username = (String) session.getAttribute("username");
        if (username != null) {
            model.addAttribute("username", username);
            return "home";
        } else {
            return "redirect:/login";
        }
    }
}

6. 创建页面

最后,我们需要创建登录页面和主页页面。

login.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <p style="color: red;">${msg}</p>
    <form action="/doLogin" method="post">
        <p>
            <label for="username">Username:</label>
            <input type="text" id="username" name="username">
        </p>
        <p>
            <label for="password">Password:</label>
            <input type="password" id="password" name="password">
        </p>
        <p>
            <input type="submit" value="Login">
        </p>
    </form>
</body>
</html>

home.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Home</title>
</head>
<body>
    <h1>Home</h1>
    <p>Welcome, ${username}!</p>
</body>
</html>

好了,现在您已经学会如何使用注解实现SpringMVC的登录功能。如果您还有疑问,可以参考下面的示例。

示例一

@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class LoginControllerTest {
    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before
    public void setUp() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void testLogin() throws Exception {
        mockMvc.perform(
            MockMvcRequestBuilders.get("/login")
        ).andExpect(
            MockMvcResultMatchers.status().isOk()
        ).andExpect(
            MockMvcResultMatchers.view().name("login")
        );
    }

    @Test
    public void testDoLogin_success() throws Exception {
        mockMvc.perform(
            MockMvcRequestBuilders.post("/doLogin")
                .param("username", "admin")
                .param("password", "123456")
        ).andExpect(
            MockMvcResultMatchers.status().is3xxRedirection()
        ).andExpect(
            MockMvcResultMatchers.view().name("redirect:/home")
        ).andExpect(
            MockMvcResultMatchers.redirectedUrl("/home")
        );
    }

    @Test
    public void testDoLogin_failure() throws Exception {
        mockMvc.perform(
            MockMvcRequestBuilders.post("/doLogin")
                .param("username", "admin")
                .param("password", "654321")
        ).andExpect(
            MockMvcResultMatchers.status().isOk()
        ).andExpect(
            MockMvcResultMatchers.view().name("login")
        ).andExpect(
            MockMvcResultMatchers.model().attributeExists("msg")
        );
    }

    @Test
    public void testHome() throws Exception {
        mockMvc.perform(
            MockMvcRequestBuilders.get("/home")
        ).andExpect(
            MockMvcResultMatchers.status().is3xxRedirection()
        ).andExpect(
            MockMvcResultMatchers.redirectedUrl("/login")
        );
    }
}

示例二

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("/login")
    public Map<String, Object> login(@RequestParam("username") String username,
                                     @RequestParam("password") String password,
                                     HttpSession session) {
        Map<String, Object> resultMap = new HashMap<>();
        if (userService.verifyUser(username, password)) {
            session.setAttribute("username", username);
            resultMap.put("code", 0);
            resultMap.put("msg", "Login success.");
        } else {
            resultMap.put("code", 1);
            resultMap.put("msg", "Invalid username or password.");
        }

        return resultMap;
    }

    @GetMapping("/home")
    public Map<String, Object> home(HttpSession session) {
        Map<String, Object> resultMap = new HashMap<>();
        String username = (String) session.getAttribute("username");
        if (username != null) {
            resultMap.put("code", 0);
            resultMap.put("msg", "Welcome, " + username + "!");
        } else {
            resultMap.put("code", 1);
            resultMap.put("msg", "Please login first.");
        }

        return resultMap;
    }
}

希望这些内容能够帮助到您。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC使用注解实现登录功能 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • cemtos 7 linux 安装与卸载 tomcat 7的教程

    CentOS 7 Linux安装Tomcat 7教程 步骤一:安装Java 在CentOS 7中,我们可以使用yum来安装Java。在命令行终端中运行以下命令来安装: sudo yum install java-1.8.0-openjdk-devel 该命令将在系统中安装OpenJDK 1.8。 步骤二:下载Tomcat 7 您可以从Tomcat官方网站 h…

    Java 2023年5月19日
    00
  • Java中代码的执行顺序

    结论 注意 只有显式的加载类 JVM才会加载到内存中 先加载父类的静态代码块 然后执行子类静态代码块 当前类存在类静态变量注意引用类型没进行赋值操作初始化为null 并不会显式的加载类又存在静态代码块 会先执行前者进行初始化 再执行静态代码块 在实例化类的时候 执行顺序 构造代码块–>构造方法存在父类先执行父类 注意 静态成员变量/静态代码块只在JV…

    Java 2023年4月23日
    00
  • 详解Struts2中Action访问Servlet API的几种方法

    详解Struts2中Action访问Servlet API的几种方法 在Struts2框架中,我们可以通过在Action类中访问Servlet API来实现一些特殊操作。本文将详细介绍Struts2中Action访问Servlet API的几种方法。 方法一:继承ServletActionContext类 我们可以继承Struts2中的ServletActi…

    Java 2023年6月15日
    00
  • centos7下搭建ZooKeeper3.4中间件常用命令小结

    下面是详细讲解“centos7下搭建ZooKeeper3.4中间件常用命令小结”的完整攻略。 一、ZooKeeper介绍 ZooKeeper是一个分布式协调服务,可以用于分布式应用的协调管理。ZooKeeper提供了高可用性和高性能的数据管理和协调功能,这些功能包括配置管理、命名服务、分布式同步、群组服务等。 二、ZooKeeper安装 以下是在CentOS…

    Java 2023年5月20日
    00
  • SpringBoot中的响应式web应用详解

    Spring Boot是一个用于构建基于Spring框架开发的应用程序的工具。其提供了快速的应用程序开发和易于使用的API,并确定了一些最佳实践,使得开发人员可以更加专注于应用程序功能和业务逻辑。而“响应式web应用”则是指使用非阻塞I/O的方式,能够更快地处理请求、响应更迅速和更多的请求、更少的资源消耗等特点。 搭建响应式web 应用,我们需要依赖于以下的…

    Java 2023年5月15日
    00
  • Android仿QQ圆形头像个性名片

    作为网站的作者,我很乐意为大家讲解Android仿QQ圆形头像个性名片的完整攻略。整个过程可以分成以下步骤: 步骤一:导入CircleImageView库 进入项目的gradle文件,在dependencies选项下加入以下代码: compile ‘de.hdodenhof:circleimageview:2.2.0’ 同步gradle,等待依赖库下载完毕。…

    Java 2023年5月26日
    00
  • Java的idea连接mongodb数据库的详细教程

    以下是Java连接MongoDB数据库的详细教程。 准备工作 安装MongoDB数据库 在IDEA中安装MongoDB插件 创建Java项目 在IDEA中创建一个新的Java项目。 在项目中添加MongoDB驱动程序依赖库,可以通过Maven进行依赖导入,或者手动下载驱动程序依赖库并添加到项目中。 <dependency> <groupId…

    Java 2023年5月19日
    00
  • 纯jsp打造无限层次的树代码

    关于“纯jsp打造无限层次的树代码”的攻略,主要涉及到以下几个方面: 1.准备工作 在开始打造树代码之前,需要准备好数据。一般来说,树形结构的数据可以使用嵌套的Map、List或是递归对象等进行表示。同时,可以根据实际需求,对数据进行排序、分页等操作。 2.代码实现 在jsp页面中打造树代码,主要是通过使用标签库、JavaScript等技术实现的。我们可以通…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部