Java:Servlet能不能将request传入其他方法,然后在其他方法中跳转页面呢?怎么把request传过去呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java:Servlet能不能将request传入其他方法,然后在其他方法中跳转页面呢?怎么把request传过去呢?相关的知识,希望对你有一定的参考价值。

跳转有两种方式分别是request.getRequestDispatcher("/index.jsp").forward(req, resp);
response.sendRedirect("/index.jsp"); request就相当于一个快递员,从servlet把数据传给jsp页面。当然也可以跳转到其他的servlet,但一定要确保与web.xml中的url一致!希望帮到你。。。
参考技术A 虽然没试过,但是我觉得是没有问题的。跳转方法有两种:
request.getRequestDispatcher("/index.jsp").forward(req, resp);
response.sendRedirect("/index.jsp");
随便选一种就是了。怎么把request传过去这句话很奇怪,作为参数传递过去呗。

如何在 java Servlet 过滤器中更改传入 URL 并将请求重定向到新 URL [重复]

【中文标题】如何在 java Servlet 过滤器中更改传入 URL 并将请求重定向到新 URL [重复]【英文标题】:How to change incoming URL in java Servlet filter and redirect request to the new URL [duplicate] 【发布时间】:2017-08-20 13:46:08 【问题描述】:

我创建了一个 webapp,我正在修改 url 中的参数以解密其中一个参数。解密后,我想将参数附加到新的 URL,以便获得预期的响应。我创建了一个收集输入的 HTML,而登录页面是一个 Java 页面,我正在拦截请求。我不希望请求转到登录页面,而是希望将其发送到新网址。

下面是我的过滤代码。

    package com.test.secondServlet;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

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;
import javax.servlet.http.HttpServletRequestWrapper;

/**
 * Servlet Filter implementation class SecondFilter
 */
@WebFilter("/SecondFilter")
public class SecondFilter implements Filter 
    public String decryptedString;
    private static final String characterEncoding = "UTF-8";
    Properties prop = new Properties();
    InputStream input = null;
    public String globalKey;
    public String RedirectURL;
    public String DN;
    public String TYPE;
    public String NAME;
    public String NUMBER;
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */

     @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 
         //chain.doFilter(req, res);    
         HttpServletRequest request = (HttpServletRequest) req;
            //String requestURI = request.getRequestURI();
            //System.out.println(requestURI);
            String url = ((HttpServletRequest)request).getRequestURL().toString() +"?"+request.getQueryString();
            System.out.println(url);
            String queryString = ((HttpServletRequest)request).getQueryString();
            DN = ((HttpServletRequest) request).getParameter("DN");
            TYPE = ((HttpServletRequest) request).getParameter("TYPE");
            NAME = ((HttpServletRequest) request).getParameter("NAME");
            NUMBER = ((HttpServletRequest) request).getParameter("encryptedssn");
           // String key = ((HttpServletRequest) request).getParameter("aeskey");   

          //Code to load key from property file
            try 

                String filename = "Secretkey.properties";
                input = SecondFilter.class.getClassLoader().getResourceAsStream(filename);
                if(input==null)
                        System.out.println("Sorry, unable to find " + filename);
                    return;
                

                //load a properties file from class path, inside static method
                prop.load(input);
                //get the property value and print it out
                globalKey=prop.getProperty("Secretkey");
                System.out.println("Global Key : "+globalKey);

             catch (IOException ex) 
                ex.printStackTrace();
             
            //code ends 

            if (queryString!=null) 

                //decryptingssnhere
                    byte[] clearText;
                    try 
                        clearText = AesEncryption.decryptBase64EncodedWithManagedIV(NUMBER, globalKey);
                        decryptedString = new String(clearText,characterEncoding);
                        System.out.println("ClearText:" +decryptedString);
                     catch (Exception e) 
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    
                    // System.out.println("ClearText:" + new String(clearText,characterEncoding));

            //if(url.startsWith("/SSNdecrypt/SSNdecrypt"))
            System.out.println("queryString :"+queryString);
            System.out.println("DN : "+DN);
            System.out.println("TYPE : "+TYPE);
            System.out.println("NAME : "+NAME);
            System.out.println("S1/ NUMBER : "+NUMBER);
            //System.out.println("key : "+key);
            System.out.println("decrypted S1/ Number : "+decryptedString);
            //String toReplace = url.substring(38);
            System.out.println("input : "+input);
            //String Redirect = "SSNdecrypt?"+queryString.substring(0,13)+decryptedString;
            //System.out.println("redirect : "+Redirect);
            //String newURI = url.replace(queryString, Redirect);
            //System.out.println("new URL"+newURI);
            //String newURI = url.concat("?"+newquerystring);

            RedirectURL = "http://differentservername.com/contentexplorer/servlet/VipDms?";
            String Redirect =RedirectURL+"DN="+DN+"&TYPE="+TYPE+"&NAME="+NAME+"&-NUMBER="+decryptedString;          
            System.out.println("redircting new URL for DOCVIEW : "+Redirect);

            final HttpServletRequestWrapper wrapped = new HttpServletRequestWrapper(request) 
                @Override
                public StringBuffer getRequestURL() 
                    final StringBuffer originalUrl = ((HttpServletRequest) getRequest()).getRequestURL();
                    return new StringBuffer(Redirect);
                
            ;
            //chain.doFilter(wrapped, res);
            wrapped.getRequestDispatcher(Redirect).forward(wrapped, res);

             else 
                chain.doFilter(req, res);
            
            //SSNdecrypt/SSNdecrypt?encryptedssn=1234
            //res.getWriter().println(requestURI.toString());

        /**if (request instanceof HttpServletRequest) 
             String url = ((HttpServletRequest)request).getRequestURL().toString();
             String queryString = ((HttpServletRequest)request).getQueryString();
            **/
    

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

我不想使用 urlrewriter 并且想在同一个过滤器中使用它。如何更改请求的 URL?

【问题讨论】:

您在代码中遇到的问题是什么? 我的请求 URL 是 http://localhost/SSNdecrypt/SSNdecrypt?DN=Docview_Test&TYPE=OL&NAME=OLDNEW_GUL&encryptedssn=FwMzepVbKyMDmEAJPB1gLdVwwWUtwgWmJZTBurg6Bh0%3D,我想将 URL 更改为 http://servername.com/contentexplorer/servlet/VipDms?DN=Docview_Test&TYPE=OL&NAME=GUL&-NUMBER=123456789。这里的 NUMBER 是来自请求 URL 的加密 SSN。我能够解密并且只需要更改 url 来发送请求。参数部分正在处理中。 试试这个 response.sendRedirect("your_url?NUMBER=" + URLEncoder.encode("yourdecryptString", "UTF-8")); 在我的 doFilter 方法中,我无法使用它。它给出了错误,因为未定义 servletResponse 的 sendredirect。 您是否将“response”替换为“res”? 【参考方案1】:

我正在使用HttpServletResponse resp = (HttpServletResponse) res; resp.sendRedirect(Redirect); 而不是转发wrapped.getRequestDispatcher(Redirect).forward(wrapped, res); 的请求。我没有使用请求 qrapper,而是使用 HTTP 响应包装器,并且能够从请求 url 修改完整的 URL。

【讨论】:

以上是关于Java:Servlet能不能将request传入其他方法,然后在其他方法中跳转页面呢?怎么把request传过去呢?的主要内容,如果未能解决你的问题,请参考以下文章

java写的简单的登录界面,login.jsp能显示页面,但是执行servlet时不能正常跳转,页面出错

java的servlet 不通过request能获取到服务器IP与提供的端口号吗。

Servlet运行原理

如何将数据库中的值经过servlet传入到jsp页面,并且用EL表达式显示出值

如何将servlet中的数据显示在jsp页面中

java servlet获取客户端IP