17. JSP - 使用过滤器控制访问登录权限

当用户访问某网站时,有些页面或 Servlet 在不登录的情况下是可以访问的,例如首页、登录页面等。除此之外大部分资源是必须登录后才能访问的。此时,可以定义一个权限过滤器,对每一个访问该应用的请求进行过滤:若具有访问权限,则直接跳转到相应资源即可;若不具有访问权限,则跳转到登录页面。
修改一下之前写过的登录功能,当用户没有登录时,不能访问login_success页面。

 

讲下思路: 

实现过滤器,获取到hsq和 hsp【这里强转即可】,然后我们取到Session,判断是否登录【Session参数是否为空】,如果为空,则直接返回去,如果是有登录,我们让他看到未登录看不到的JSP:

因为要过滤 所以在WebContent文件夹下创建一个文件夹存放 登录成功才能被查看的JSP,这里是否登录成功用Servlet + 重定向 来写:

 

首先来个代码结构:

 

 

login.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>    

    <!-- 非常简单的一个登录 输入密码bi-hu就往Session里填充 -->
    <form action="${ pageContext.request.contextPath }/login" method="post" accept-charset="utf-8">
        请输入秘钥登录:<input type="password" name="pass" >
        <input type="submit" value="登录">
    
    </form>

</body>
</html>

  

login.java【这个是登录判断的Servlet】

 

package Servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 登录Servlet 后台
 */
public class login extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
    }

    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String password = request.getParameter("pass");
            
            HttpSession session = request.getSession();
            if(password.equals("bi-hu")) {
                session.setAttribute("isLogin",true );
                PrintWriter out  = response.getWriter();
                out.print( "您已登录成功 请访问 login_success/ok.jsp 查看你的的信息吧!  ");
            }else {
                    //密码错误就重定向 就不提示什么了 简单测试
                     response.sendRedirect(request.getContextPath() + "/login.jsp");
                     
                
            }
    }

}

cuccess.java 【这是过滤器 过滤全部代码 其中加判断拦截未登录用户【返回登录页面】 记得XML配置】

package filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *     过滤器 过滤未登录的请求    //此过滤器已设置过滤全部网址
 */
public class cuccess implements Filter {
    
    

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //好习惯 先来个编码:
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        
        //先拿到带Http的Request 和 response 先 【ServletRequest 和 ServletResponse的子类】
        HttpServletRequest hsq = (HttpServletRequest)request;
        HttpServletResponse hsp = (HttpServletResponse)response;
        //获取请求的路径    【注意这里是请求路径 不是根路径!!】
        String path = hsq.getServletPath();
        if(path.startsWith("/login_success")) {
            HttpSession session = hsq.getSession();
            if(session == null) {
                hsp.sendRedirect(hsq.getContextPath() + "/login.jsp");        //重新登录 Session为空
            }else {
                if(session.getAttribute("isLogin") == null || ((boolean)session.getAttribute("isLogin") == false)) {
                    hsp.sendRedirect(hsq.getContextPath() + "/login.jsp");    //重新登录 Session为空 或 为假
                }
            }
        }
        
        
        
        chain.doFilter(request, response);
    }
}

login_success 目录下的 ok.jsp  :

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
        <h1>你已登录! 你看到我了!!!</h1>
</body>
</html>

所以你可以尝试:

http://localhost:8080/filter/login_success/ok.jsp 你未登录 访问他 会无限返回登录页面

posted @ 2021-06-09 15:39  咸瑜  阅读(545)  评论(0编辑  收藏  举报