使用HttpSession和过滤器实现一个简单的用户登录认证的功能

这篇文章分享一下怎么通过session结合过滤器来实现控制登录访问的功能,涉及的代码非常简单,通过session保存用户登录的信息,如果没有用户登录的话,会在过滤器中处理,重定向回登录页面。

创建一个springboot项目,添加springbooot-starter-web和lombok的依赖。创建对应的实体类、controller、service,并创建两个简单的html页面测试过滤器的效果。

一、登录功能实现

controller

package cn.edu.sgu.www.login.controller;

import cn.edu.sgu.www.login.entity.User;
import cn.edu.sgu.www.login.service.UserService;
import cn.edu.sgu.www.login.util.UserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

/**
 * @author heyunlin
 * @version 1.0
 */
@RestController
@RequestMapping(path = "/user", produces = "application/json;charset=utf-8")
public class UserController {

    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public void login(User user) throws IOException {
        userService.login(user);

        UserUtils.getResponse().sendRedirect("/index.html");
    }

}

service

UserService

package cn.edu.sgu.www.login.service;

import cn.edu.sgu.www.login.entity.User;

/**
 * @author heyunlin
 * @version 1.0
 */
public interface UserService {

    /**
     * 登录认证
     * @param user 用户输入的信息
     */
    void login(User user);
}

UserServiceImpl

package cn.edu.sgu.www.login.service.impl;

import cn.edu.sgu.www.login.entity.User;
import cn.edu.sgu.www.login.service.UserService;
import cn.edu.sgu.www.login.util.UserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author heyunlin
 * @version 1.0
 */
@Service
public class UserServiceImpl implements UserService {

    private final UserUtils userUtils;

    @Autowired
    public UserServiceImpl(UserUtils userUtils) {
        this.userUtils = userUtils;
    }

    @Override
    public void login(User user) {
        String username = user.getUsername();
        String password = user.getPassword();

        if (username == null || "".equals(username)) {
            throw new RuntimeException("用户名不能为空~");
        } else if (password == null || "".equals(password)) {
            throw new RuntimeException("密码不能为空~");
        } else {
            if (username.equals("admin") && password.equals("12345")) {
                userUtils.getSession().setAttribute("user", user);
            } else {
                throw new RuntimeException("用户名或密码错误!");
            }
        }
    }

}

二、过滤器实现资源访问控制

LoginFilter

package cn.edu.sgu.www.login.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 登录过滤器
 * @author heyunlin
 * @version 1.0
 */
@WebFilter(filterName = "loginFilter", urlPatterns = {"/", "/html/*", "/index.html"})
public class LoginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpSession session = request.getSession();

        // 获取登录信息
        Object obj = session.getAttribute("user");

        if (obj == null) { // 未登录,重定向到登录页
            /*
             * 登录页面的地址
             */
            String loginPage = "/login.html";
            // 获取响应对象
            HttpServletResponse response = (HttpServletResponse) resp;

            response.sendRedirect(loginPage);
        } else { // 当前有用户登录,放行
            filterChain.doFilter(req, resp);
        }
    }

}

在任意配置类上使用@ServletComponentScan("cn.edu.sgu.www.login.filter")开启servlet的组件扫描~

package cn.edu.sgu.www.login;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan("cn.edu.sgu.www.login.filter")
@SpringBootApplication
public class FilterLoginApplication {

    public static void main(String[] args) {
        SpringApplication.run(FilterLoginApplication.class, args);
    }

}

文章设计的代码已上传到git仓库,可按需获取~

使用过滤器实现一个最简单的登录认证功能icon-default.png?t=N7T8https://gitee.com/muyu-chengfeng/filter-login.git

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个基于Spring Boot前后端分离,使用过滤器实现用户登录的代码示例: 后端代码: 1. 定义一个过滤器,用于验证用户是否登录,如果未登录则拦截求并返回未登录提示信息。 ```java @Component public class LoginFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; // 判断用户是否已经登录 HttpSession session = request.getSession(false); if (session == null || session.getAttribute("user") == null) { // 如果未登录,则返回未登录提示信息 response.setContentType("application/json;charset=UTF-8"); response.getWriter().write("{\"code\":401,\"msg\":\"未登录\"}"); return; } // 如果已登录,则放行求 filterChain.doFilter(request, response); } } ``` 2. 在Spring Boot的配置类中配置过滤器,指定过滤器拦截的路径。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private LoginFilter loginFilter; // 添加过滤器 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginFilter) .addPathPatterns("/api/**") // 拦截所有/api/**的求 .excludePathPatterns("/api/user/login"); // 除了登录求,其他求都需要登录才能访问 } } ``` 3. 在Controller中添加登录接口,用于验证用户登录,并将用户信息存入Session中。 ```java @RestController @RequestMapping("/api/user") public class UserController { @PostMapping("/login") public Result login(@RequestBody User user, HttpSession session) { // 验证用户账号密码是否正确,这里省略具体实现 if ("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())) { // 如果账号密码正确,则将用户信息存入Session session.setAttribute("user", user); return Result.success(); } else { return Result.error("账号或密码错误"); } } } ``` 前端代码: 1. 在登录页面中,获取用户输入的账号密码,并发送登录求。 ```html <form> <div class="form-group"> <label for="username">用户名:</label> <input type="text" class="form-control" id="username" name="username"> </div> <div class="form-group"> <label for="password">密码:</label> <input type="password" class="form-control" id="password" name="password"> </div> <button type="button" class="btn btn-primary" onclick="login()">登录</button> </form> ``` ```javascript function login() { var username = $("#username").val(); var password = $("#password").val(); $.ajax({ url: "/api/user/login", type: "POST", contentType: "application/json;charset=UTF-8", data: JSON.stringify({username: username, password: password}), success: function (result) { if (result.code == 200) { // 登录成功 window.location.href = "/index.html"; } else { // 登录失败,显示错误信息 alert(result.msg); } } }); } ``` 2. 在其他页面中,需要判断用户是否已登录,如果未登录则跳转到登录页面。 ```javascript $(function () { $.ajax({ url: "/api/user", type: "GET", success: function (result) { if (result.code == 401) { // 用户登录,跳转到登录页面 window.location.href = "/login.html"; } } }); }); ``` 以上就是一个基于Spring Boot前后端分离,使用过滤器实现用户登录的代码示例,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值