龙空技术网

「JavaWeb 20-5」Filter 案例—登录验证

chenxin118 117

前言:

眼前咱们对“jsp登录验证功能怎么实现”大体比较重视,看官们都想要剖析一些“jsp登录验证功能怎么实现”的相关内容。那么小编也在网上汇集了一些关于“jsp登录验证功能怎么实现””的相关内容,希望姐妹们能喜欢,我们快快来了解一下吧!

#头条创作挑战赛#

10.6 案例1. 需求

访问服务器资源时,需要先进行登录验证,如果没有登录,则自动跳转到登录页面

2. 分析

要实现该功能是在每一个资源里加入登陆状态校验的代码吗?显然是不需要的,只需要写一个 Filter ,在该过滤器中进行登陆状态校验即可。而在该 Filter 中逻辑如下:

3. 代码实现创建 Filter,在 FilterDemo 工程创建 web.filter 包,再改下创建名为 LoginFilter 的过滤器在 doFilter() 方法中编写登录状态校验的逻辑代码从 session 对象中获取用户信息,但是 ServletRequest 类型的 request 对象没有获取 session 对象的方法,需要将 request 对象强制转换成 HttpServletRequest 对象HttpServletRequest req = (HttpServletRequest) request;获取 Session 对象从 Session 对象中获取名为 user 的数据判断获取到的数据是否是 null若不是,说明已经登陆过,放行若是,说明未登录,将提示信息存储到域对象中并跳转到登录界面

代码如下:

 package web.filter;  import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException;  /**  * @Author 晨默  * @Date 2022/9/11 20:50  */ @WebFilter("/*") public class LoginFilter implements Filter {     @Override     public void init(FilterConfig filterConfig) throws ServletException {     }      @Override     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {         HttpServletRequest req = (HttpServletRequest) servletRequest;          // 1. 判断session中是否有user         HttpSession session = req.getSession();         Object user = session.getAttribute("user");          // 2. 判断user是否为null         if(user != null){             // 登陆过了             // 放行             filterChain.doFilter(servletRequest,servletResponse);         }else{             // 还未登陆,存储提示信息,跳转到登录界面             req.setAttribute("login_msg","您尚未登录!");             req.getRequestDispatcher("/login.jsp").forward(req,servletResponse);         }     }      @Override     public void destroy() {     } }

只列出更改的代码,其他的代码跟之前的 BrandDemo 案例的代码一样

测试并抛出问题

测试结果如下所示:

从上面效果可以看出没有登陆确实是跳转到登陆页面了,但是登陆页面没有展示成设定的效果

问题分析

登陆页面需要 css/login.css 这个文件进行样式的渲染,下图是登陆页面引入的css文件图解

而在请求这个css资源时被过滤器拦截,就相当于没有加载到样式文件导致的

解决这个问题,只需要对所以的登陆相关的资源进行放行即可

还有一种情况就是当我没有用户信息时需要进行注册,而注册时也希望被过滤器放行。

解决方法如下:

需要在判断session中是否包含用户信息之前,应该加上对登陆及注册相关资源放行的逻辑处理

 package web.filter;  import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException;  /**  * @Author 晨默  * @Date 2022/9/11 20:50  */ @WebFilter("/*") public class LoginFilter implements Filter {     @Override     public void init(FilterConfig filterConfig) throws ServletException {     }      @Override     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {         HttpServletRequest req = (HttpServletRequest) servletRequest;          // 判断访问资源路径是否和登录注册相关         // 1. 在数组中存储登录和注册相关的资源路径         String[] urls = {"/login.jsp","/imgs/","/css/","/LoginServlet","/register.jsp","/registerServlet","/checkCodeServlet"};         // 2. 获取当前访问的资源路径         String url  = req.getRequestURL().toString();         // 3. 遍历数组,获取到每一个需要放行的资源路径         for(String u : urls){             // 4. 判断当前访问的资源路径字符串是否包含要放行的资源路径字符串             /*             * 比如当前访问的资源路径是 /FilterDemo_war/login.jsp             * 而字符串 /FilterDemo_war/login.jsp 包含了字符串 /login.jsp             * 这个字符串就要放行             * */             if(url.contains(u)){                 // 找到了,放行                 filterChain.doFilter(req,servletResponse);                 // break                 return;             }         }          // 1. 判断session中是否有user         HttpSession session = req.getSession();         Object user = session.getAttribute("user");          // 2. 判断user是否为null         if(user != null){             // 登陆过了             // 放行             filterChain.doFilter(servletRequest,servletResponse);         }else{             // 还未登陆,存储提示信息,跳转到登录界面             req.setAttribute("login_msg","您尚未登录!");             req.getRequestDispatcher("/login.jsp").forward(req,servletResponse);         }     }      @Override     public void destroy() {     } }

效果如下:

标签: #jsp登录验证功能怎么实现