1. 程式人生 > >Java-Web過濾器應用案例

Java-Web過濾器應用案例

這裡寫圖片描述
這裡我們的案例主要表現前兩個應用場景,即驗證是否已經登陸還有編碼轉換。
這裡我們先寫一個登陸jsp,還有成功的頁面以及失敗的頁面,同時建立servlet
登陸頁面

<body>
<h1>歡迎訪問本網站,請登入</h1>
<hr>
<form method="post" action="servletAnLi" >
使用者名稱:<input type="text" name="username" /><br>
密  碼 :<input type="password" name="password"
/>
<br> <input type="submit" value="提交" /> </form> </body>

成功及失敗頁面

<body>
    登陸成功,歡迎您,<%= (request.getSession()).getAttribute("username") %>
</body>

<body>
    登入失敗,您的使用者名稱和密碼有誤,請重新輸入
</body>

servlet.java及web.xml配置,把doget方法刪掉,重寫dopost方法

protected
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String username=request.getParameter("username"); String password=request.getParameter("password"); System.out.println(username); if
("admin".equals(username)&&"admin".equals(password)) { //校驗通過,如通過我們應該跳轉到成功介面,同時把登陸資訊放到我們session裡面,如果裡面沒有則跳轉到我們登陸頁面 HttpSession session=request.getSession(); session.setAttribute("username", username); response.sendRedirect(request.getContextPath()+"/success.jsp"); }else { //校驗失敗 response.sendRedirect(request.getContextPath()+"/fail.jsp"); } } <servlet> <servlet-name>servletAnLi</servlet-name> <servlet-class>com.imooc.servlet.servletAnLi</servlet-class> </servlet> <servlet-mapping> <servlet-name>servletAnLi</servlet-name> <url-pattern>/servletAnLi</url-pattern> </servlet-mapping>

這只是一個簡單的登陸,在測試後可以正確進入頁面。出現的問題,剛建立servlet時系統會自動生成@WebServlet,此時可以直接在這裡寫servlet的web配置,或者手動去web.xml檔案中配置,一開始沒有注意這個,總是導致打開出錯。
下面開始實現過濾器功能

@Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        // TODO 自動生成的方法存根
        HttpServletRequest request=(HttpServletRequest)arg0;
        HttpServletResponse response=(HttpServletResponse)arg1;
        HttpSession session=request.getSession();
        if(session.getAttribute("username")!=null) {
            arg2.doFilter(request, response);
        }else {
            response.sendRedirect("login.jsp");
        }

    }


<filter>
    <filter-name>servletFilter</filter-name>
    <filter-class>com.imooc.filter.servletFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>servletFilter</filter-name>
    <url-pattern>/success.jsp</url-pattern>
  </filter-mapping>

在訪問success.jsp頁面時進行過濾,如果沒有使用者名稱則返回登陸介面。但是如果是使用者名稱密碼錯誤,還會進入fail.jsp,此時該如何讓他們變成登陸介面呢?如果我們把過濾頁面設定成所有/*,當跳轉到登陸介面後會陷入無限迴圈。。因為沒有使用者名稱就會自動跳轉。這時我們可以想辦法將地址和我們的登陸地址相匹配如果包含它則不再跳轉。

//如果是原來的地址則不過濾,此時發現變成這樣後原來的success又進不去了,賬號密碼無誤還是會程式設計login也就是登陸的頁面,這時由於它把servlet的訪問也給過濾掉了
        if(request.getRequestURI().indexOf("login.jsp")!=-1) {
            arg2.doFilter(request, response);
            return;
        }
//修改後的
if(request.getRequestURI().indexOf("login.jsp")!=-1||
                request.getRequestURI().indexOf("servletAnLi")!=-1||
                request.getRequestURI().indexOf("fail.jsp")!=-1
                ) {
            arg2.doFilter(request, response);
            return;
        }

我們會發現修改後的地址會越來越多,有沒有其他方法呢?這時我們會用到一個物件,我們一直沒有用到過的,init方法的引數,物件FilterConfig,配置web.xml,他有一個初始化的引數,我們就可以利用它來進行這些操作

package com.imooc.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 servletFilter implements Filter {
    private FilterConfig config;
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        // TODO 自動生成的方法存根
        HttpServletRequest request=(HttpServletRequest)arg0;
        HttpServletResponse response=(HttpServletResponse)arg1;
        HttpSession session=request.getSession();

        String configs=config.getInitParameter("noLoginPath");
        if(configs!=null) {
            String sttr[]=configs.split(";");
            for(int i=0;i<sttr.length;i++) {
                if(sttr[i]!=null||"".equals(sttr[i])) {
                    if(request.getRequestURI().indexOf(sttr[i])!=-1) {
                        arg2.doFilter(request, response);
                        return;
                    }
                }
            }

        }


        //如果是原來的地址則不過濾
        /**if(request.getRequestURI().indexOf("login.jsp")!=-1||
                request.getRequestURI().indexOf("servletAnLi")!=-1||
                request.getRequestURI().indexOf("fail.jsp")!=-1
                ) {
            arg2.doFilter(request, response);
            return;
        }
        */

        if(session.getAttribute("username")!=null) {
            arg2.doFilter(request, response);
        }else {
            response.sendRedirect("login.jsp");
        }

    }

    @Override
    public void init(FilterConfig config1) throws ServletException {
        config=config1;
    }
}



 <filter>
    <filter-name>servletFilter</filter-name>
    <filter-class>com.imooc.filter.servletFilter</filter-class>
    <init-param>
    <param-name>noLoginPath</param-name>
    <param-value>login.jsp;servletAnLi;fail.jsp</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>servletFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <servlet>
    <servlet-name>servletAnLi</servlet-name>
    <servlet-class>com.imooc.servlet.servletAnLi</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>servletAnLi</servlet-name>
    <url-pattern>/servletAnLi</url-pattern>
  </servlet-mapping>

編碼問題則在過濾器中設定

request.setCharacterEncoding("UTF-8");