我用的是struts2,想实现如下的效果:
  以前访问某个资源都是通过 xxx.action?id=123456 的方式来进行的,现在想直接用ID作为uri来访问资源 ,例如:http://localhost:8080/.../0809001.xxx 如此,直接访问一个特定的资源网页。 我尝试用filter来进行处理,对特定的访问后缀进行截获,然后再跳转到特定的action来处理,但是 (HttpServletResponse)httpRes.sendRedirect(uri),跳转之后,不能隐藏action的访问路径,有办法来实现隐藏吗?或者有什么思路可以解决上面的问题呢!
请不吝赐教!

解决方案 »

  1.   

    楼上 大哥 能说具体些吗,或者有个例子,thanks a lot!
      

  2.   

    我使用了 UrlRewriteFilter 方式重写 url
    但 在对 “xxx.action" 进行重写时,总是找不到目标。
    配置如下:
     <rule>
                <from>/param/(.*)</from>
                <to type="forward">
                 /aaa.action?id=$1
                </to>
          </rule>另外,在对 xxx.jsp进行重写时,没有问题,对应配置如下:  <rule>
                <from>/param2/(.*)</from>
                <to>/index2.jsp?param=$1</to>
            </rule>请问,struts2 里的action 的url如何重写?
      

  3.   

    URL重写有个jar包 有配置文件的 你去网上搜一下 很多的
      

  4.   

     采用 UrlRewriteFilter 进行url重写后, xxx.action 就不被后续的struts用的 FilterDispatcher 处理,造成action不被处理。这该如何解决?
      

  5.   

    UrlRewrite就是一个伪静态化,就是将.do后面的过滤成为html格式的
      

  6.   

    我用的是struts2 ,但现在的问题是,经过UrlRewriteFilter 重写url后, *.action 不被处理 。
    同样的地址直接去访问,就没问题。用重写的url访问则找不到地址。问题仅限于*.action, *.jsp方面的应用没有问题。所以估计是 struts2的filter没有再对重写的url进行处理。配置如下://重写规则//
    ==============================================================================
    <rule>
       <from>/param/(.*)</from>
       <to>AAA.action?id=$1</to>
    </rule>
    ==============================================================================
    //struts2过滤器//
     <filter>
      <filter-name>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
     </filter>
    ==============================================================================
      

  7.   

    有没有 filter方面的 专家啊!!!
      

  8.   

    好像关键问题是, struts2 中的 action 请求,不能使用  request.getRequestDispatcher(URL).forward(request, response)方式来实现跳转。
    jsp 方式可以实现。
      

  9.   

    经过研究 我有一个 解决struts2 中 action不被处理的办法,供大家参考:先做一个urlRewite filter ,代码如下:package filter;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.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.*;
    public class URLFilter implements Filter {      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        HttpServletRequest request = (HttpServletRequest) servletRequest;       HttpServletResponse response = (HttpServletResponse) servletResponse;        String realPath = request.getSession().getServletContext().getRealPath("/");       String fileName = realPath + "WEB-INF\\urlreWriteXml.xml";       String uri = request.getServletPath();       String rewriteUrl = getRewriteUrl(uri, fileName);        if (null != rewriteUrl) {        String reJspUrl ="/redirect.jsp"; //重写地址中转请求页
            request.setAttribute("urlAttr", rewriteUrl);    
            
               request.getRequestDispatcher(reJspUrl).forward(request, response);
            
               return;       }       filterChain.doFilter(servletRequest, servletResponse);    }        private String getRewriteUrl(String url, String fileName) {        DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();       try {           DocumentBuilder builder = f.newDocumentBuilder();           Document document = (Document) builder.parse(fileName);           NodeList list = ((org.w3c.dom.Document) document).getElementsByTagName("rule");System.out.println("\r\n list.getLength= " +list.getLength()+" ,url = "+url+"\r\n ");           for (int i = 0; i < list.getLength(); i++) {              Element elemnt = (Element) list.item(i);               NodeList list2 =  elemnt.getElementsByTagName("from");              Element element = (Element) list2.item(0);              String formValue = ((Node) element).getFirstChild().getNodeValue();               NodeList list3 =  elemnt.getElementsByTagName("to");              Element element2 = (Element) list3.item(0); String type = element2.getAttribute("type");              String toValue = element2.getFirstChild().getNodeValue();               String rewriteUrl = url.replaceAll(formValue, toValue);              if (url != null && !"".equals(url.trim()) && !url.equals(rewriteUrl)) {
                   System.out.println("\r\n rewriteUrl= " +rewriteUrl+"\r\n ");
                      return rewriteUrl;              }           }       } catch (Exception ex) {           ex.printStackTrace();       }       return null;    } public void destroy() {
    // TODO Auto-generated method stub

    } public void init(FilterConfig filterConfig) throws ServletException {
    // TODO Auto-generated method stub

    }}
      

  10.   

    然后, redirect.jsp 页面代码如下:<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
    + request.getServerName() + ":" + request.getServerPort()
    + path + "/";
    %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <base href="<%=basePath%>">
    <link type="text/css" rel="stylesheet" rev="stylesheet" href="<%= basePath+"css/wsgr.css"%>" /> </head>
    <body>
     <% 
       String url = request.getAttribute("urlAttr")+"";
       System.out.println("hid rujsp url= "+url);
       %>
     
    <IFRAME name='hidden_frame' id="hidden_frame" marginwidth=0 marginheight=0 frameborder=0 
    src='<%= url%>' width="100%" height="100%" scrolling="yes" vlign="top"></IFRAME> </body>
    </html>
      

  11.   

    最后 解释一下用法。
     
     1) 在web.xml里配置 URLFilter 。
     2) 创建一个 urlReweite.xml ,并定义规则如下(可以自由发挥),如下: <rule>
    <from>^/(\w+)/(\w+)/(\d+)\.shtml$</from>
    <to type="forward">$1.action?$2=$3</to>
    </rule>
     3) action会通过URLFilter 将特定的地址进行翻译,如:show/id/0001.shtml 翻译成  abc.action?id=0001 ;
        之后,将翻译结果 设置为 request 里的一个 attribute ,并发送到 redirect.jsp 里。
     4)redirect.jsp 里取得 request 里的 attribute ,设置到frame里,加以显示即可。
    欢迎大家指摘。 ===============================================================================
    By the way : 论坛不让给自己加分,但总没有合适的答案,之后注册了一个新账户,自己来回答吧!
    =============================================================================== 
     
      

  12.   

    适才 又经过研究,发现 org.tuckey.web.filters.urlrewrite.UrlRewriteFilter 与 struts2 之前冲突的问题 ,根本原因在于 web.xml的配置问题。1) web.xml必须用 2.4版本 否则 不支持 。
    版本参考如下: 
    =========================================================
    <?xml version="1.0" encoding="UTF-8"?><web-app version="2.4"
     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
     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    =========================================================2) urlrewritefilter  的配置必须 在 struts2 的 filter之上 ,就是说,执行完 url重写后,再执行 struts2的filter。
    3) 必须 struts2 filtermapping 在设置 <dispatcher>FORWARD</dispatcher>,如下:
    ==============================================================================
    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    </filter-mapping>==============================================================================以上 三者 缺一不可 ,否则 action 不被相应。总之,现在有了两种解决办法,一是使用 自定义的 rewriteFilter,二是 通过调整配置,使用org.tuckey.web.filters.urlrewrite.UrlRewriteFilter, 以上都可以实现。