前言:
眼前咱们对“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登录验证功能怎么实现