Loading

javaweb-filter过滤器

通过过滤器实现解决中文乱码问题

编写一个过滤器

@WebFilter(urlPatterns = "/filter/*")
public class HelloFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //chain.doFilter表示继续进行下去,如果不执行这句话直接return,就是中止访问目标了
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {

    }
}

编写一个简单的servlet

@WebServlet(urlPatterns = {"/hello","/filter/hello"})
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().println("hello,你好呀!");
    }

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

上面这串代码的意思就是如果说通过/filter/hello访问了HelloServlet,就会经过过滤器,否则不经过过滤器

过滤器的作用是解决乱码问题

也就是只要访问/filter/hello,就不会有中文乱码,而访问/hello会有中文乱码

执行后的效果如下:

image-20200810161325756image-20200810161349614

使用过滤器来实现权限访问

比如有些资源必须是要登录的时候才能使用

所以可以在Filter中进行验证

image-20200810174421327

一共四个页面,其中success.html文件需要登录之后才能访问

代码如下

过滤器:

@WebFilter(urlPatterns = "/success.html")
public class LoginFilter extends HttpFilter {
    @Override
    protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
        Object isLoginObject =  req.getSession().getAttribute("isLogin");
        if(isLoginObject ==null){
            res.sendRedirect("/error.html");
        }else {
           if((boolean) isLoginObject){
               chain.doFilter(req,res);
           }else {
               res.sendRedirect("/error.html");
           }
        }

    }
}

登录Servlet

@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        HttpSession session = req.getSession();
        if(username.equals("kehao")&&password.equals("123456")){
            session.setAttribute("isLogin",true);
            resp.sendRedirect("/success.html");
        }else {
            session.setAttribute("isLogin",false);
            resp.sendRedirect("/error.html");
        }

    }

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

登出Servlet

@WebServlet(urlPatterns = "/logout")
public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.setAttribute("isLogin",false);
        resp.sendRedirect("/login.html");
    }

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

登录页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="/login" method="post">
    <input type="text" name="username" value=""><br>
    <input type="password" name="password" value=""><br>
    <input type="submit" value="登录">
</form>

</body>
</html>
posted @ 2021-03-25 21:37  克豪  阅读(66)  评论(0)    收藏  举报