Filter案例--登录验证

记录在跟随老师学习过程中学习心得。
先上过滤器代码

package com.fldwws.web.filter;

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

@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        //强转
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        //判断访问资源是否和登录相关
        String[] urls = {"/login.jsp","/imgs/","/css/","/LoginServlet","/CheckCodeServlet","/RegisterServlet","/register.jsp"};

        //获取当前访问路径
        String requestURL = req.getRequestURL().toString();

        //循环判断
        for (String url : urls){
            if (requestURL.contains(url)){
                //放行
                chain.doFilter(request, response);
                return;
            }
        }

        //判断session中是否有user
        HttpSession session = req.getSession();
        Object user = session.getAttribute("user");

        //判断user是否为null
        if(user != null){
            //有数据 已经登录过了
            //放行
            chain.doFilter(request, response);
        }else{
            //未登录
            //存储提示信息并跳转到登录界面
            req.setAttribute("login_msg","您尚未登录!");
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }

    }

    public void init(FilterConfig config) throws ServletException {
    }

    public void destroy() {
    }


}


1. 如何判断用户是否登录?


根据session中是否存在user来进行判定。取user这个对象,看是否存在。如果存在即说明已经登录。

代码:

//判断session中是否有user
        HttpSession session = req.getSession();
        Object user = session.getAttribute("user");

2. 判断用户是否登录之后逻辑是什么?


如果已经登录,则放行。
若未登录,则提示用户未登录,并跳转到登录界面

代码:

//判断user是否为null
        if(user != null){
            //有数据 已经登录过了
            //放行
            chain.doFilter(request, response);
        }else{
            //未登录
            //存储提示信息并跳转到登录界面
            req.setAttribute("login_msg","您尚未登录!");
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }

3.对于与登陆相关资源的处理

这里首先要判断用户当前所在路径,这个也提供了方法。

代码:

//获取当前访问路径
        String requestURL = req.getRequestURL().toString();

其次,我们需要定义,哪些资源是不需要被拦截的。这里需要注意一下路径的写法,注意看,基本所有的路径都是前面加上一个/也就是根目录,但是相对于目录而言,她下面的所有资源都需要被放行,因此在前后都需要加上/

//判断访问资源是否和登录相关
String[] urls = {"/login.jsp","/imgs/","/css/","/LoginServlet","/CheckCodeServlet","/RegisterServlet","/register.jsp"};

再然后就是进行循环判断,由于处于初学阶段,记录下我掌握得不够得地方。

  1. 循环的使用。for循环括号的内部一共分为两部分,其中右侧写数组,左侧写的是数组中每一个值,左侧又可以分为两部分,前部分是该数组的类型,后面的可以自行定义,在之后的操作中,使用后面自行定义的内容即可。
  2. contains的使用。这里用的是用户访问的路径去匹配我们写的路径,其实也合理,因为用户的url是非常长的一串,当然是使用大的去判断是否包含小的,
  3. 放行之后的逻辑。
    可以看到,放行之后直接return掉,就是直接结束了这个拦截的方法,这里确实稍稍有点绕不过弯。那就顺着思考,如果用户正在访问登录界面,即,处于for循环中,我们放行处理,然后就是跑后面的逻辑。后面的逻辑是什么呢?判断用户是不是已经登录,那现在的用户必然没有进行登录,filter又会跳转到登录界面,又将执行for循环的条件,又进行放行,这样会无线循环下去,发生多次请求错误。
//循环判断
        for (String url : urls){
            if (requestURL.contains(url)){
                //放行
                chain.doFilter(request, response);
                return;
            }
        }


在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security是一个在应用程序中为认证和授权提供安全性的框架。在使用Spring Security验证登录时,可以通过配置认证提供程序、授权机制、用户角色等实现登录,以确保应用程序或系统的安全性。 以下是一个Spring Security登录验证案例: 1. 首先,在项目的pom.xml文件中添加Spring Security的依赖。 2. 在web.xml文件中添加一个Filter,该Filter用于拦截所有请求并启用Spring Security验证。 3. 在Spring的配置文件中配置Spring Security,包括认证提供程序、授权机制和用户角色等。 4. 在页面中添加登录表单,并使用Spring Security提供的标签进行验证,如: <form:form method="post" action="/login"> <table> <tr> <td>User Name:</td> <td><form:input path="username" /></td> </tr> <tr> <td>Password:</td> <td><form:password path="password" /></td> </tr> <tr> <td></td> <td><input type="submit" value="Login" /></td> </tr> </table> </form:form> 5. 在控制器中添加登录处理逻辑,并使用Spring Security提供的接口进行验证,如: @RequestMapping(value = "/login", method = RequestMethod.POST) public String login(@ModelAttribute("user") User user, BindingResult result, HttpServletRequest request, Model model) { UserDetails details = userDetailsService.loadUserByUsername(user.getUsername()); UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(details.getUsername(), user.getPassword(), details.getAuthorities()); try { Authentication auth = authenticationManager.authenticate(token); SecurityContextHolder.getContext().setAuthentication(auth); HttpSession session = request.getSession(true); session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext()); return "redirect:/home"; } catch (AuthenticationException ex) { result.rejectValue("username", "invalidUserNameOrPassword"); return "login"; } } 以上就是一个简单的Spring Security登录验证案例,通过Spring Security的安全机制,可以为Web应用程序或系统提供可靠的登录验证机制,从而保证用户信息的安全性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值