• 过滤器


    中文乱码

    @WebFilter(filterName = "CharacterEncodingFilter", urlPatterns = "/*")
    public class CharacterEncodingFilter implements Filter {
        public static String encoding;
    
        public void init(FilterConfig config) throws ServletException {
            // Web服务器启动就初始化了
            encoding = config.getServletContext().getInitParameter("encoding");
        }
    
        public void destroy() {
            // Web服务器关闭就销毁
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
            request.setCharacterEncoding(encoding);
            response.setContentType("text/html;charset=" + encoding);
            chain.doFilter(request, response);
        }
    }
    

    登陆拦截

    拦截器

    @WebFilter(filterName = "AuthorityFilter", urlPatterns = "/*")
    public class AuthorityFilter implements Filter {
        public static List<String> passPath = new ArrayList<>();
        public void init(FilterConfig config) throws ServletException {
            passPath.add("login.jsp");
            passPath.add("login");
        }
    
        public void destroy() {
        }
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) resp;
            String requestURI = request.getRequestURI().substring(request.getRequestURI().lastIndexOf("/") + 1);
            String userID = (String) request.getSession().getAttribute("UserID");
            if (!passPath.contains(requestURI)) {
                // 不在放行范围内的其他链接,如果没有登陆则跳到登陆页面
                if (userID == null) {
                    response.sendRedirect(request.getContextPath() + "/login.jsp");
                } else {
                    chain.doFilter(request, response);
                }
            } else {
                // 被放行的链接,如果已登陆则跳到首页
                if (userID != null) {
                    response.sendRedirect(request.getContextPath() + "/index.jsp");
                }else {
                    chain.doFilter(request, response);
                }
            }
        }
    }
    

    LoginServlet

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if ("admin".equals(username) && "admin".equals(password)) {
            request.getSession().removeAttribute("msg");
            request.getSession().setAttribute("UserID", request.getSession().getId());
            response.sendRedirect(request.getContextPath() + "/common/LoginSuccess.jsp");
        } else {
            request.getSession().setAttribute("msg", "账号或密码错误");
            response.sendRedirect(request.getContextPath() + "/login.jsp");
        }
    }
    

    LogoutServlet

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getSession().removeAttribute("UserID");
        response.sendRedirect(request.getContextPath() + "/login.jsp");
    }
    

    LoginJSP

    <body>
    <form action="${pageContext.request.contextPath}/login">
        用户名:<input type="text" name="username"> <br/>
        密码:<input type="password" name="password"> <br/>
        <input type="submit" value="登陆"> ${pageContext.session.getAttribute("msg")}
    </form>
    </body>
    

    LogSuccessJSP

    <body>
    <h1>登陆成功!</h1>
    <form action="${pageContext.request.contextPath}/logout">
        <input type="submit" value="注销">
    </form>
    </body>
    

    总结

    折腾了好久,登陆拦截器的关键点在于某些路径需要放行,否则会造成各种问题。且在过滤器里进行重定向的链接一定不能执行chain.doFilter(request, response);,否则继续执行后续代码如果有再有重定向就会报错,最好就是重定向完就不继续chain了,直接执行重定向代码。这也是chain的意义。

  • 相关阅读:
    数据仓库的一些理解(转)
    常见ETL工具一览,你知多少?
    dhcpv6开源软件配置
    svn
    js原型模式
    combo扩展:禁止手工改变输入框的值
    SQLite错误总结 error code 19: constraint failed
    ntp源码解读(一)
    ntp-keygen.c
    6.2.2认证
  • 原文地址:https://www.cnblogs.com/shenleg/p/14263719.html
Copyright © 2020-2023  润新知