Filter过滤器

让一个页面不被非登录用户访问的方法



场景:

  • 我现在有个登录页面,登录成功之后跳到管理页面。
  • 如果我现在直接绕过登录页面页面,那是不是会很不安全?
  • 所以我们就要判断用户是否有绕过登录的权限。



做权限判断的3种方法:

控制单个页面权限



在页面使用session做判断


Login.jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="DemoServlet" method="post">
        <input type="text" name="username"><p>
        <input type="text" name="password">
        <input type="checkbox" name="rememberMe" value="yes">记住我<br>
        <input type="submit" value="提交">
    </form>
</body>
</html>



Servlet.java



功能:如果匹配帐号成功则分配一个session

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class DemoServlet
 */
@WebServlet("/DemoServlet")
public class DemoServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public DemoServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 先判断一个当前有没有session,如果有session就不用再登录了,直接跳转到管理页面
        // 获取到当前用户的session
        HttpSession session = request.getSession();
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if (username.equals("admin") && password.equals("123456")) {
            // 用户登录成功,我们在服务器端给session设置一个属性
            session.setAttribute("isLogin", "yes");
            session.setAttribute("username", username);
            //判断用户有没有选中“记住我”,如果需要记住的话,服务端写一个cookie到客户端
            if(request.getParameter("rememberMe") != null){
                Cookie cookie = new Cookie("username",username);
                response.addCookie(cookie);
            }

            request.getRequestDispatcher("admin/manager.jsp").forward(request, response);

        } else {
            if (session.getAttribute("username") == null) {
                // 如果当前的用户的一个属性username为null,说明这个用户还没登录过,
                // 重定向(跳转)到用户登录页
                response.sendRedirect("login.jsp");
            } else {
                // 如果用户已经登录过,就跳转到管理页
                request.getRequestDispatcher("admin/manager.jsp").forward(request, response);
            }
        }

        //response.getWriter().append("Hello world!");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}



登录成功之后的manager.jsp页面



session.getAttribute(“username”) 为空 ,表示用户在登录的时候是失败的,并没有servlet分配给用户的session,所以这时候

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

    <%
    //让一个页面不被非登录用户访问的方法是,在页面里做session的判断

    if(session.getAttribute("username") == null){
        System.out.println("转发请求到../login.jsp");
        response.sendRedirect("../login.jsp");
    }

        //String username  = (String)session.getAttribute("username");


    %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
管理员页面!
</body>
</html>

控制多个页面权限

场景:

  • 如果用session做权限判断时会有很多页面,这时我们就要在每个页面都写上session判断,为了减少代码的冗余,我们可以单独创建一个页面专门处理session逻辑

创建一个空页面专门处理session的判断逻辑,其他页面运行的时候将这个空页面包涵进来即可


checkLogin.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%

    //这个页面只负责处理权限,可以不需要html代码

    //如果cookie不为空的话,才会往下执行
     if (request.getCookies() != null) {
        //判断一下客户端来的时候有没有带着rm(rememberMe)这个cookie
        Cookie cookies[] = request.getCookies();
        String username = "";
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("username")) {
                username = cookie.getValue();
                session.setAttribute("username", username);
            }
        }
    }

    if (session.getAttribute("username") == null) {
        System.out.println("转发请求到../login.jsp");
        response.sendRedirect("../login.jsp");
    } 
%>

manager.jspcheckLogin.jsp包涵进来即可

<%@ include file=”checkLogin.jsp” %>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

    <%--

        第二种方法:使用<%@include %>,把代码包涵进来
            被包涵的代码,首先被加载到当前的页面,然后跟当前页面一起执行

     --%>
<%@ include file="checkLogin.jsp" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
管理员页面!
</body>
</html>

Filter过滤器


在线API文档:

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/Filter.html


Filter是Java web过滤器



Filter常用的场景

  • 1) Authentication Filters 权限过滤器
  • 2) Logging and Auditing Filters 日志和审计过滤器
  • 3) Image conversion Filters 图片转换过滤器
  • 4) Data compression Filters 数据转换
  • 5) Encryption Filters 加密
  • 6) Tokenizing Filters 词法分析
  • 7) Filters that trigger resource access events 资源访问事件触发过滤器
  • 8) XSL/T filters xsl/t
  • 9) Mime-type chain Filter 文件类型链过滤器


常用的类Filter

javax.servlet.Filter

1


javax.servlet.FilterConfig

2


javax.servlet.FilterChain

3



初始化方法init

public void init(FilterConfig fConfig) throws ServletException {
    // TODO Auto-generated method stub
}


销毁方法destroy

public void destroy() {
    // TODO Auto-generated method stub
}


过滤方法体doFilter

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    chain.doFilter(request, response);
}

登录过滤器

4



填写类名,过滤的目录

5



项目结构

5



LoginFilter.java

/**
     * 监控"/admin/*" 下的所有内容
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        //获取用户的请求
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        //获取用户的session
        HttpSession session = req.getSession();
        //如果session为空
        if (session.getAttribute("username") == null) {
            System.out.println("过滤器:username为空,返回到login.jsp页面");
            res.sendRedirect("../login.jsp");
        }

        // pass the request along the filter chain
        chain.doFilter(request, response);
    }


当直接访问admin/manager.jsp 的时候,过滤器会自动拦截掉

6

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值