zoukankan      html  css  js  c++  java
  • Servlet Filter 示例

    1. CityQuery.java

    package com.xxx.servlet;
    
    import com.google.common.collect.Lists;
    import com.xxx.data.HotelInfo;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.List;
    
    /**
     * Created with IntelliJ IDEA.
     * User: zhenwei.liu
     * Date: 13-7-15
     * Time: 下午7:39
     * To change this template use File | Settings | File Templates.
     */
    public class CityQuery extends HttpServlet {
        private static String PAGE_NO = "pageNo";
        private static String PAGE_SIZE = "pageSize";
        private static String CITY = "city";
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String city = req.getParameter(CITY);
            String pageNo = req.getParameter(PAGE_NO);
            String pageSize = req.getParameter(PAGE_SIZE);
    
            if (city == null || city.equals("")
                    || pageNo == null || pageNo.equals("")
                    || pageSize == null || pageSize.equals(""))
                resp.getWriter().println("参数缺失");
    
            // 筛选城市
            List<String> hotelList = Lists.newArrayList();
            HotelInfo hotelInfo = HotelInfo.getInstance();
            for (String hotelCode : hotelInfo.getHotelInfo().keySet()) {
                if (hotelCode.contains(city))
                    hotelList.add(hotelInfo.getHotelInfo().get(hotelCode));
            }
    
            // 分页
            int pageSizeInt = Integer.valueOf(pageSize);
            int pageNoInt = Integer.valueOf(pageNo);
            int startIndex = pageSizeInt * (pageNoInt - 1);
            int endIndex = startIndex + pageSizeInt;
            if (startIndex < 0)
                startIndex = 0;
            if (startIndex > hotelList.size() - 1)
                startIndex = hotelList.size() - 1;
            if (endIndex > hotelList.size() - 1)
                endIndex = hotelList.size() - 1;
    
            hotelList = hotelList.subList(startIndex, endIndex + 1);
            resp.getWriter().println("City: " + city);
            resp.getWriter().println("Page: " + pageNo);
            resp.getWriter().println("PageSize: " + pageSize);
            for (String hotel : hotelList)
                resp.getWriter().println(hotel);
        }
    }

    2.HotelQuery.java

    package com.xxx.servlet;
    
    import com.google.common.base.Charsets;
    import com.google.common.base.Splitter;
    import com.google.common.collect.Lists;
    import com.google.common.collect.Maps;
    import com.google.common.io.Files;
    import com.google.common.io.LineProcessor;
    import com.xxx.data.HotelInfo;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    import java.util.Map;
    
    /**
     * Created with IntelliJ IDEA.
     * User: zhenwei.liu
     * Date: 13-7-15
     * Time: 下午5:27
     * To change this template use File | Settings | File Templates.
     */
    public class HotelQuery extends HttpServlet {
        private static String SEQ = "seq";
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String hotelCode = req.getParameter(SEQ);
            HotelInfo hotelInfo = HotelInfo.getInstance();
            if (hotelCode == null || hotelCode.equals(""))
                resp.getWriter().println("参数缺失");
            else
                resp.getWriter().println(hotelCode + " " + hotelInfo.getHotelInfo().get(hotelCode));
        }
    }

    3.WhiteListFilter

    package com.xxx.filter;
    
    import com.google.common.io.Files;
    import com.xxx.data.WhiteList;
    import com.xxx.util.HttpTools;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    import java.util.List;
    
    /**
     * Created with IntelliJ IDEA.
     * User: zhenwei.liu
     * Date: 13-7-15
     * Time: 下午11:19
     * To change this template use File | Settings | File Templates.
     */
    public class WhiteListFilter implements Filter {
        private static String IP = "ip";
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
        /**
         * 过滤白名单
         *
         * @param servletRequest
         * @param servletResponse
         * @param filterChain
         * @throws IOException
         * @throws ServletException
         */
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest) servletRequest;
            HttpServletResponse resp = (HttpServletResponse) servletResponse;
            String ip = HttpTools.getRemoteAddress(req);
            WhiteList whiteList = WhiteList.getInstance();
            if (!whiteList.getWhiteList().contains(ip)) {
                resp.setCharacterEncoding("UTF-8");
                resp.getWriter().println("您的IP受限");
            } else {
                resp.setCharacterEncoding("UTF-8");
                filterChain.doFilter(req, resp);
            }
        }
    
        @Override
        public void destroy() {
        }
    
    
    }

    4.HotelInfo.java

    package com.xxx.data;
    
    import com.google.common.base.Charsets;
    import com.google.common.base.Splitter;
    import com.google.common.collect.Lists;
    import com.google.common.collect.Maps;
    import com.google.common.io.Files;
    import com.google.common.io.LineProcessor;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    import java.util.Map;
    
    /**
     * Created with IntelliJ IDEA.
     * User: zhenwei.liu
     * Date: 13-7-15
     * Time: 下午7:40
     * To change this template use File | Settings | File Templates.
     */
    public class HotelInfo {
        private static String INFO_FILENAME = HotelInfo.class.getClassLoader().getResource("hotelinfo.txt").getPath();
        private Map<String, String> hotelInfo;    // 酒店列表静态数据
        private static HotelInfo instance;
        private static Object lock = new Object();  // 锁对象
    
        public Map<String, String> getHotelInfo() {
            return hotelInfo;
        }
    
        public static HotelInfo getInstance() {
            if (instance == null) {
                synchronized (lock) {
                    if (instance == null) {
                        instance = new HotelInfo();
                        instance.hotelInfo = Maps.newHashMap();
                        // 初始化酒店信息,读入Map中
                        File file = new File(INFO_FILENAME);
                        try {
                            // 读取文件同时处理每行数据
                            Files.readLines(file, Charsets.UTF_8, new LineProcessor<List<String>>() {
                                @Override
                                public boolean processLine(String s) throws IOException {
                                    // 使用正则切分空字符
                                    List<String> data = Lists.newArrayList(
                                            Splitter.onPattern("\s").trimResults().omitEmptyStrings().split(s));
                                    instance.hotelInfo.put(data.get(0), data.get(1));
                                    return true;
                                }
    
                                @Override
                                public List<String> getResult() {
                                    return null;
                                }
                            });
                        } catch (IOException ex) {
                            ex.printStackTrace();
                        }
                    }
                }
            }
            return instance;
        }
    }

    5.WhiteList.java

    package com.xxx.data;
    
    import com.google.common.base.Charsets;
    import com.google.common.io.Files;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    
    /**
     * Created with IntelliJ IDEA.
     * User: zhenwei.liu
     * Date: 13-7-15
     * Time: 下午11:39
     * To change this template use File | Settings | File Templates.
     */
    public class WhiteList {
        private static String WHITE_LIST_FILENAME = WhiteList.class.getClassLoader().getResource("whitelist.txt").getPath();
        ;
        private List<String> whiteList;   // 白名单静态数据
        private static WhiteList instance;
        private static Object lock = new Object();
    
        public static WhiteList getInstance() {
            if (instance == null) {
                synchronized (lock) {
                    if (instance == null) {
                        instance = new WhiteList();
                        File file = new File(WHITE_LIST_FILENAME);
                        try {
                            instance.whiteList = Files.readLines(file, Charsets.UTF_8);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            return instance;
        }
    
        public List<String> getWhiteList() {
            return whiteList;
        }
    }

    7.web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
             version="2.4">
        <display-name>Servlet Test</display-name>
        <description>
            Servlet Test
        </description>
        <servlet>
            <servlet-name>hotelQuery</servlet-name>
            <servlet-class>com.xxx.servlet.HotelQuery</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>hotelQuery</servlet-name>
            <url-pattern>/hotelQuery</url-pattern>
        </servlet-mapping>
        <servlet>
            <servlet-name>cityQuery</servlet-name>
            <servlet-class>com.xxx.servlet.CityQuery</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>cityQuery</servlet-name>
            <url-pattern>/cityQuery</url-pattern>
        </servlet-mapping>
    
        <!-- 白名单filter配置 -->
        <filter>
            <filter-name>WhiteListFilter</filter-name>
            <filter-class>com.xxx.filter.WhiteListFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>WhiteListFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    </web-app>

    8.pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>ServletTest</groupId>
        <artifactId>ServletTest</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <parent>
            <groupId>xxx.common</groupId>
            <artifactId>xxx-supom-generic</artifactId>
            <version>1.2.32</version>
        </parent>
    
        <dependencies>
            <!-- servlet -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
            </dependency>
    
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
            </dependency>
    
        </dependencies>
    
    </project>
  • 相关阅读:
    【noip2011】选择客栈
    【noip2013】货车运输
    【bzoj3732】Network
    Codeforces 111C Petya and Spiders (状压dp)
    线段树优化 dijkstra (CF787D Legacy)
    Codeforces 908G Yet Another Maxflow Problem (最小割定理,线段树)
    IOI 2007 Sail (线段树+贪心)
    Codeforces 474E Pillars (树状数组+dp)
    Bzoj 3688 折线统计(dp+树状数组)
    Gorgeous Sequence (线段树)
  • 原文地址:https://www.cnblogs.com/zemliu/p/3193149.html
Copyright © 2011-2022 走看看