JavaWeb项目中如何扩展一个Request对象——包装器HttpServletRequestWrapper

一、使用场景

在一个JavaWeb中我们会遇到统一处理出入参或者处理特殊参数的场景,这些场景就需要我们扩展我们的Request对象。所谓的包装器就是在原来的基础上包装一下就是在原来功能上添加一些其他功能。具体使用场景如下:

  1. 处理过滤器中参数统一加解密问题
  2. 需要为特殊请求扩展参数问题。
二、具体实现
1、首先继承HttpServletRequestWrapper
public class MyRequestWrapper extends HttpServletRequestWrapper {

    private Map params = new HashMap<>();

    public MyRequestWrapper(HttpServletRequest request, Map newParams) {
        super(request);
        if(request.getParameterMap() != null){
            this.params.putAll(request.getParameterMap());
        }
        if(newParams != null){
            this.params.putAll(newParams);
        }
    }

    //主要覆盖这个方法来获取新的参数对象
    @Override
    public Map getParameterMap() {
        return params;
    }

    public Enumeration getParameterNames() {
        Vector l = new Vector(params.keySet());
        return l.elements();
    }


    @Override
    public String[] getParameterValues(String name) {
        Object v = params.get(name);
        if (v == null) {
            return null;
        } else if (v instanceof String[]) {
            return (String[]) v;
        } else if (v instanceof String) {
            return new String[]{(String) v};
        } else {
            return new String[]{v.toString()};
        }
    }

    /**
     * 根据参数的key获取参数
     * @param name
     * @return
     */
    @Override
    public String getParameter(String name) {
        Object v = params.get(name);
        if (v == null) {
            return null;
        } else if (v instanceof String[]) {
            String[] strArr = (String[]) v;
            if (strArr.length > 0) {
                return strArr[0];
            } else {
                return null;
            }
        } else if (v instanceof String) {
            return (String) v;
        } else {
            return v.toString();
        }
    }
}

2、编写过滤器代码
public class MyFilter implements Filter {
    //日志
    private static final Logger LOGGER = LogManager.getLogger();
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        LOGGER.info("MyFilter过滤器初始化");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //获取HttpServletRequest对象
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String ipAddr = HttpUtil.getIpAddress(httpServletRequest);
        LOGGER.info("ip地址为:" + ipAddr);
        Map paramMap = new HashMap<>();
        paramMap.put("ipAddr", ipAddr);
        MyRequestWrapper myRequestWrapper = new MyRequestWrapper(httpServletRequest, paramMap);
        chain.doFilter(myRequestWrapper, response);
    }
    @Override
    public void destroy() {
        LOGGER.info("MyFilter过滤器被销毁");
    }
}

编写完过滤器需要在web.xml添加过滤器配置

    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.leo.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
3、编写测试代码
    @RequestMapping(value = "/getIpAddr", method = RequestMethod.GET)
    @ResponseBody
    public String getIpAddr(HttpServletRequest request){
        String ipAddr = request.getParameter("ipAddr");
        LOGGER.info("获取参数:" + ipAddr);
        return ipAddr;
    }

启动项目,访问:http://localhost:8080/springmvc/getIpAddr
测试结果
后台日志:

2020-06-04 23:53:26.365 INFO  com.leo.util.HttpUtil:25 [http-apr-8080-exec-3] - getIpAddress(HttpServletRequest) - X-Forwarded-For - String ip=null
2020-06-04 23:53:26.368 INFO  com.leo.util.HttpUtil:33 [http-apr-8080-exec-3] - getIpAddress(HttpServletRequest) - Proxy-Client-IP - String ip=null
2020-06-04 23:53:26.369 INFO  com.leo.util.HttpUtil:39 [http-apr-8080-exec-3] - getIpAddress(HttpServletRequest) - WL-Proxy-Client-IP - String ip=null
2020-06-04 23:53:26.370 INFO  com.leo.util.HttpUtil:45 [http-apr-8080-exec-3] - getIpAddress(HttpServletRequest) - HTTP_CLIENT_IP - String ip=null
2020-06-04 23:53:26.371 INFO  com.leo.util.HttpUtil:51 [http-apr-8080-exec-3] - getIpAddress(HttpServletRequest) - HTTP_X_FORWARDED_FOR - String ip=null
2020-06-04 23:53:26.372 INFO  com.leo.util.HttpUtil:57 [http-apr-8080-exec-3] - getIpAddress(HttpServletRequest) - getRemoteAddr - String ip=127.0.0.1
2020-06-04 23:53:26.373 INFO  com.leo.filter.MyFilter:38 [http-apr-8080-exec-3] - ip地址为:127.0.0.1
2020-06-04 23:53:26.375 INFO  com.leo.interceptor.HandlerInterceptor1:26 [http-apr-8080-exec-3] - HandlerInterceptor1 preHandle
2020-06-04 23:53:26.376 INFO  com.leo.controller.HelloController:129 [http-apr-8080-exec-3] - 获取参数:127.0.0.1
2020-06-04 23:53:26.380 INFO  com.leo.interceptor.HandlerInterceptor1:34 [http-apr-8080-exec-3] - HandlerInterceptor1 postHandle
2020-06-04 23:53:26.381 INFO  com.leo.interceptor.HandlerInterceptor1:39 [http-apr-8080-exec-3] - HandlerInterceptor1 afterCompletion
2020-06-04 23:53:26.382 INFO  com.leo.interceptor.HandlerInterceptor1:42 [http-apr-8080-exec-3] - HandlerInterceptor1 过滤的接口耗时:6ms

完整代码请参考:
chapter-6-springmvc-mybatis1(常规整合)
https://gitee.com/leo825/spring-framework-learning-example.git

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个简单的基于JavaWeb的聊天室的完整代码: 1. 创建一个名为ChatRoom的工程 2. 创建一个名为ChatServletservlet ```java package com.example.chatroom; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/chat") public class ChatServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static List<String> messages = new ArrayList<String>(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String message = request.getParameter("message"); if (message != null && !message.isEmpty()) { messages.add(message); } request.setAttribute("messages", messages); request.getRequestDispatcher("/WEB-INF/views/chat.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } ``` 3. 在ChatServlet使用JSP来实现聊天室的UI 在src/main/webapp/WEB-INF/views/目录下创建chat.jsp文件,内容如下: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Chat Room</title> </head> <body> <h1>Chat Room</h1> <form method="post" action="${pageContext.request.contextPath}/chat"> <input type="text" name="message"> <button type="submit">Send</button> </form> <hr> <ul> <c:forEach items="${messages}" var="message"> <li>${message}</li> </c:forEach> </ul> </body> </html> ``` 4. 在ChatServlet使用WebSocket来实现聊天室的实时通信 首先在pom.xml文件添加以下依赖: ```xml <dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> <version>8.0.9</version> </dependency> ``` 然后修改ChatServlet的doGet方法,添加WebSocket的支持: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String message = request.getParameter("message"); if (message != null && !message.isEmpty()) { messages.add(message); for (Session session : sessions) { session.getBasicRemote().sendText(message); } } request.setAttribute("messages", messages); request.getRequestDispatcher("/WEB-INF/views/chat.jsp").forward(request, response); } private static List<Session> sessions = new ArrayList<>(); @OnOpen public void onOpen(Session session) { sessions.add(session); } @OnMessage public void onMessage(String message, Session session) { try { for (Session s : sessions) { s.getBasicRemote().sendText(message); } } catch (IOException e) { e.printStackTrace(); } } @OnClose public void onClose(Session session) { sessions.remove(session); } ``` 最后,在ChatServlet添加WebSocket的注解: ```java @WebServlet(urlPatterns = { "/chat" }) @ServerEndpoint("/chat") public class ChatServlet extends HttpServlet { // ... } ``` 这样就完成了一个简单的基于JavaWeb的聊天室。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leo825...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值