如何在Java中使用servlet过滤器来更改传入的servlet请求URL? [英] How to use a servlet filter in Java to change an incoming servlet request url?

查看:130
本文介绍了如何在Java中使用servlet过滤器来更改传入的servlet请求URL?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何使用servlet过滤器来更改传入的servlet请求URL

How can I use a servlet filter to change an incoming servlet request url from

http://nm-java.appspot.com / Check_License / Dir_My_App / Dir_ABC / My_Obj_123

http://nm-java.appspot.com/Check_License?Contact_Id=My_Obj_123

更新:根据BalusC的以下步骤,我想出了以下代码:

Update: according to BalusC's steps below, I came up with the following code:

public class UrlRewriteFilter implements Filter {

    @Override
    public void init(FilterConfig config) throws ServletException {
        //
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        String requestURI = request.getRequestURI();

        if (requestURI.startsWith("/Check_License/Dir_My_App/")) {
            String toReplace = requestURI.substring(requestURI.indexOf("/Dir_My_App"), requestURI.lastIndexOf("/") + 1);
            String newURI = requestURI.replace(toReplace, "?Contact_Id=");
            req.getRequestDispatcher(newURI).forward(req, res);
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void destroy() {
        //
    }
}

web.xml 中的相关条目如下所示:

The relevant entry in web.xml look like this:

<filter>
    <filter-name>urlRewriteFilter</filter-name>
    <filter-class>com.example.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>urlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

我尝试了服务器端和客户端重定向以及预期结果。它有效,谢谢BalusC!

I tried both server-side and client-side redirect with the expected results. It worked, thanks BalusC!

推荐答案


  1. 实施 javax.servlet.Filter

  2. doFilter() 方法,强制传入 ServletRequest HttpServletRequest

  3. 使用 HttpServletRequest#getRequestURI() 获取路径。

  4. 使用s traightforward java.lang.String 类似 substring() split() concat() 等提取感兴趣的部分并撰写新路径。

  5. 使用 ServletRequest#getRequestDispatcher() 然后 RequestDispatcher#forward() 将请求/响应转发到新URL(服务器端)重定向,未反映在浏览器地址栏中),投射传入 ServletResponse HttpServletResponse 然后 HttpServletResponse #sendRedirect() 将响应重定向到新URL(客户端重定向,反映在浏览器地址栏中)。

  6. web.xml中注册过滤器 url-pattern / * / Check_License / * ,取决于上下文路径,或者i如果您已经使用Servlet 3.0,请使用 <$取而代之的是c $ c> @WebFilter 注释。

  1. Implement javax.servlet.Filter.
  2. In doFilter() method, cast the incoming ServletRequest to HttpServletRequest.
  3. Use HttpServletRequest#getRequestURI() to grab the path.
  4. Use straightforward java.lang.String methods like substring(), split(), concat() and so on to extract the part of interest and compose the new path.
  5. Use either ServletRequest#getRequestDispatcher() and then RequestDispatcher#forward() to forward the request/response to the new URL (server-side redirect, not reflected in browser address bar), or cast the incoming ServletResponse to HttpServletResponse and then HttpServletResponse#sendRedirect() to redirect the response to the new URL (client side redirect, reflected in browser address bar).
  6. Register the filter in web.xml on an url-pattern of /* or /Check_License/*, depending on the context path, or if you're on Servlet 3.0 already, use the @WebFilter annotation for that instead.

别忘了如果要更改URL 需要并且,请在代码中添加一个检查,然后只需调用 FilterChain #doFilter() ,否则它会自动调用自己。

Don't forget to add a check in the code if the URL needs to be changed and if not, then just call FilterChain#doFilter(), else it will call itself in an infinite loop.

或者您也可以使用现有的第三方API完成所有工作对你而言,例如 Tuckey的UrlRewriteFilter ,它的配置方式与Apache的 mod_rewrite 。

Alternatively you can also just use an existing 3rd party API to do all the work for you, such as Tuckey's UrlRewriteFilter which can be configured the way as you would do with Apache's mod_rewrite.

这篇关于如何在Java中使用servlet过滤器来更改传入的servlet请求URL?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆