【问题标题】:How to set a parameter ID,1234 in a HttpServletRequest?如何在 HttpServletRequest 中设置参数 ID,1234?
【发布时间】:2021-08-07 23:58:26
【问题描述】:

我有一个包含一些参数的 HttpServletrequest。 我想将此键和值添加到该请求中。 如何用我的代码拦截它并将其添加到我的请求中? 我创建了一个过滤器,如下所示,但实际上无法继续

public class RequestInterceptor implements Filter {        
    public RequestInterceptor() {        
    }

     
    public void destroy() {
         
    }

     
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        
        chain.doFilter(request, response);
    }

     
    public void init(FilterConfig fConfig) throws ServletException {
         
    }

我想做类似 request.setAttribute("ID", "1234") 所以这将被附加或添加到我的请求中

一般我想借助拦截器或过滤器来修改 httpServletRequest

【问题讨论】:

  • 您的问题可以使用更多细节,因为不清楚您要做什么。可能是您在寻找request.getParameter("ID")request.setAttribute("ID", "1234") 吗?
  • @delux247 我要request.setAttribute("ID", "1234")

标签: java servlets interceptor servlet-filters


【解决方案1】:

我相信你可以这样做:

使用 web.xml

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;

public class IdMutatorFilter implements Filter {

    public IdMutatorFilter() {
        // Nothing to construct
    }
    
    @Override
    public void destroy() {
        // Nothing to do here =/
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // Your preferred method to make an object number here.
        request.setAttribute("ID", Integer.parseInt("1234"));
        // Then return they.
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // Nothing to do here
    }


}

您的过滤器将更改请求中的属性并通过调用chain.doFilter 方法将其转发。

在你的 web.xml 文件中,你应该在你的根目录中添加如下内容:

<filter>

    <filter-name>YourFilterName</filter-name>

    <filter-class>com.package.location.YourFilterName</filter-class>

</filter>

<filter-mapping>

    <filter-name>YourFilterName</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

filter 标记注册您的过滤器,为其命名并指向实现它的类。

filter-mapping 注册 url 模式需要应用过滤器。

url-pattern 是您的过滤器将应用的模式,filter-class 是您班级的 fqn。

使用注释

使用这种方法,您不需要在web.xml 文件中注册过滤器,但您的 Servlet API 版本需要至少为 3.0。

你可以看到docs here


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.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

@WebFilter(filterName = "YourFilterName",
urlPatterns = {"/*"})
public class IdMutatorFilter implements Filter {

    public IdMutatorFilter() {
        // Nothing to construct
    }

    @Override
    public void destroy() {
        // Nothing to do here =/
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // Your preferred method to make an object number here.
        request.setAttribute("ID", Integer.parseInt("1234"));
        // Then return they.
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // Nothing to do here
    }


}

【讨论】:

  • 如果不想使用web.xml,也可以使用注解。
  • 我尝试了相同的公共类 RequestInterceptor implements Filter { public RequestInterceptor() { }public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { long UID=System.currentTimeMillis(); request.setAttribute("ID", UID);链.doFilter(请求,响应); } public void init(FilterConfig fConfig) throws ServletException { // TODO 自动生成的方法存根 } } 但没用
  • @stdunbar 我已经添加了过滤器类的注释版本。
  • @akshaykale 您必须确保过滤器已正确注册,并且如果过滤器未注册,您正在测试的 URL 确实使用过滤器使用的 URL 模式进行过滤或者请求的 URL 没有被 URL 模式考虑,过滤器将不会用于该请求。
  • @ooredroxoo 我也试过了,但还是没有加入到请求中
【解决方案2】:
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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

/**
 * Servlet Filter implementation class RequestInterceptor
 */
@WebFilter("/RequestInterceptor")
public class RequestInterceptor implements Filter  {

    
    
    
    public RequestInterceptor() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        RequestInterceptionforIDWrappper wrapper =new RequestInterceptionforIDWrappper((HttpServletRequest) request);
        long ID=85965894;
        wrapper.setUniqueID("UID",ID);
        chain.doFilter(wrapper, response);
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }



}

=============================

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class RequestInterceptionforIDWrappper extends HttpServletRequestWrapper {
    HashMap UIDkeyValue=new HashMap<>();
    public RequestInterceptionforIDWrappper(HttpServletRequest request) {
        super(request);      
    }
    
    public void setUniqueID(String UID,long ID) {
        
        UIDkeyValue.put(UID, ID);
    }
    
    @Override
    public String getParameter(String key) {
        return UIDkeyValue.toString();
    }

}

这是我尝试将键值添加到请求中的两个类,你能检查一下有什么问题吗 @ooredroxoo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 2016-01-12
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多