过滤器的功能实现

场景描述:

非登录状态下,访问目标页面,登录之后直接进入目标页面而非首页

解决方案:

  • 过滤器代码:
@WebFilter(urlPatterns = {"/user/userInfo"})
public class CheckLoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //获取请求对象
        HttpServletRequest req = (HttpServletRequest) request;
        //获取响应对象
        HttpServletResponse res = (HttpServletResponse) response;
        //从session中获取用户对象
        User user = (User) req.getSession().getAttribute("user");
        //如果用户为空
        if (user == null) {
            //通过请求对象获取请求地址
            String uri = req.getRequestURI();
            //添加请求地址到session中
            req.getSession().setAttribute("uri", uri);
            //打印请求地址
            System.out.println("用户想要访问的地址:" + uri);
            //重定向到用户登录页面
            res.sendRedirect("/user/loginUI");
        } else {
            //否则直接放行
            chain.doFilter(req, res);
        }

    }

    @Override
    public void destroy() {

    }
}
复制代码
  • 控制器代码:
@Controller
@RequestMapping("/user")
public class UserController {
    @PostMapping("/login")
    public String login(HttpSession session, String username, String password,Model model) {
        //通过用户名和密码查询用户
        User user = userService.findOne(username, password);
        //如果用户不为空,通过session获取用户对象
        if (user != null) {
            //保存登录状态
            session.setAttribute("user", user);
            //通过session获取请求地址
            String uri = (String) session.getAttribute("uri");
            //如果请求地址不为空,重定向到目标页面
            if (uri != null) {
                return "redirect:" + uri;
            }
            //否则回到首页
            return "redirect:/";

        }
        //如果用户为空,返回错误信息
        model.addAttribute("msg","用户名或密码错误");
        //转发到登录页面
        return "login";
    }
}
复制代码

你可能感兴趣的:(过滤器的功能实现)