欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java-Web过滤器应用案例

程序员文章站 2022-03-22 21:28:46
...

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");
相关标签: 编码