Java之Filter

MVC三層架構

什麼是MVC?

Model View Controller 模型 視圖 控制器

模型:可理解爲實體類與表中對應的字段

視圖:比如jsp頁面

控制器:Servlet控制頁面跳轉與request和response處理

Filter過濾器

Filter:過濾網站數據,如登錄驗證,中文亂碼處理等

Filter開發步驟:1、導包。2、編寫過濾器。3、web.xml配置Filter

Filter接口爲import javax.servlet.*;包下的。implents接口需要實現三個方法

//初始化
public void init(FilterConfig filterConfig) throws ServletException {

}

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

}

//銷燬
public void destroy() {

}

編寫Filter

1、過濾器中所有代碼在過濾特定請求時都會執行

2、必須要讓過濾器filterChain.doFilter()將req和resp轉交給後面的過濾器,繼續通行

3、filterChain.doFilter(servletRequest,servletResponse); //讓我們的請求繼續走,如果不寫,程序到這裏就被攔截停止。後面還有其他過濾器,需要把這次的req和resp傳給後面的Filter

public class CharacterEncodingFilter implements Filter {

    /*
    1、過濾器中所有代碼在過濾特定請求時都會執行
    2、必須要讓過濾器filterChain.doFilter()將req和resp轉交給後面的過濾器,繼續通行
     */
    //初始化:web服務器啓動就進行了初始化
public void init(FilterConfig filterConfig) throws ServletException { System.out.println("CharacterEncodingFilter Init..."); }

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    servletRequest.setCharacterEncoding("UTF-8");
    servletResponse.setCharacterEncoding("UTF-8");
    System.out.println("Filter run start......");
    filterChain.doFilter(servletRequest,servletResponse);   //讓我們的請求繼續走,如果不寫,程序到這裏就被攔截停止。後面還有其他過濾器,需要把這次的req和resp傳給後面的Filter
    System.out.println("Filter run stop......");

}

//銷燬:web服務器關閉時,Filter銷燬
public void destroy() { System.out.println("CharacterEncodingFilter Destmroy..."); }
}

註冊Filter

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.zh1z3ven.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
<!--        在此設定的路由下的請求都會經過Filter處理-->
    <url-pattern>/servlet/*</url-pattern>
</filter-mapping>

下面簡單測試下,創建兩個路由,一個走過濾器,一個不走過濾器

servlet

public class ShowServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("你好,世界");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

Web.xml

<servlet>
    <servlet-name>show</servlet-name>
    <servlet-class>com.zh1z3ven.servlet.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>show</servlet-name>
    <url-pattern>/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>show</servlet-name>
    <url-pattern>/servlet/show</url-pattern>
</servlet-mapping>

Filter實現權限攔截

Jsp中實現過濾

<%--在jsp中實現鑑權。如果用戶未攜帶session就跳轉到login頁面--%>
<%
    Object user_session = request.getSession().getAttribute("USER_SESSION");
    if (user_session==null){
        response.sendRedirect("/login.jsp");
    }
%>

但是這樣success.jsp和error.jsp都要寫一遍,代碼寫的就很臃腫,不如Filter來實現比較方便和易於管理

主要實現用戶登錄之後,判斷是否存在session,若有才可以進入/sys/success頁面。若不存在則跳到error界面。

Login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>login</title>
</head>
<body>
<h2>登錄</h2>
<form action="/servlet/login" method="post" >
    <input name="username" type="text">
    <input name="submit" type="submit">
</form>

</body>
</html>

error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>error</title>
</head>
<body>
<h2>error</h2>
<h2><a href="/login.jsp">返回首頁</a> </h2>
</body>
</html>

/sys/success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>success</title>
</head>
<body>
<h2>success</h2>
<p><a href="/servlet/logout" name="logout">logout</a> </p>
</body>
</html>

LoginServlet

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");

        if ("admin".equals(username)){
            req.getSession().setAttribute(Contant.USER_SESSION,req.getSession().getId());
            resp.sendRedirect("/sys/success.jsp");
        }else {
            resp.sendRedirect("/error.jsp");
        }

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

LogoutServlet

public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Object user_session = req.getSession().getAttribute(Contant.USER_SESSION);

        if (user_session!=null){
            req.getSession().removeAttribute(Contant.USER_SESSION);
            resp.sendRedirect("/login.jsp");
        }else {
            resp.sendRedirect("/login.jsp");
        }

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

SysFilter

public class SysFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest Req = (HttpServletRequest) servletRequest;
        HttpServletResponse Resp = (HttpServletResponse) servletResponse;

        if (Req.getSession().getAttribute(Contant.USER_SESSION)==null){
            Resp.sendRedirect("/error.jsp");
        }


        filterChain.doFilter(Req,Resp);
    }

    public void destroy() {

    }
}

/util/Contant.java 將session處理爲常量,便於編寫和修改代碼

public class Contant {
    public final static String USER_SESSION = "USER_SESSION";
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.zh1z3ven.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/servlet/login</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>logout</servlet-name>
        <servlet-class>com.zh1z3ven.servlet.LogoutServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>logout</servlet-name>
        <url-pattern>/servlet/logout</url-pattern>
    </servlet-mapping>
  
    <filter>
        <filter-name>SysFilter</filter-name>
        <filter-class>com.zh1z3ven.filter.SysFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SysFilter</filter-name>
        <url-pattern>/sys/*</url-pattern>
    </filter-mapping>

</web-app>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章