我用的是struts2,想实现如下的效果:
以前访问某个资源都是通过 xxx.action?id=123456 的方式来进行的,现在想直接用ID作为uri来访问资源 ,例如:http://localhost:8080/.../0809001.xxx 如此,直接访问一个特定的资源网页。 我尝试用filter来进行处理,对特定的访问后缀进行截获,然后再跳转到特定的action来处理,但是 (HttpServletResponse)httpRes.sendRedirect(uri),跳转之后,不能隐藏action的访问路径,有办法来实现隐藏吗?或者有什么思路可以解决上面的问题呢!
请不吝赐教!
以前访问某个资源都是通过 xxx.action?id=123456 的方式来进行的,现在想直接用ID作为uri来访问资源 ,例如:http://localhost:8080/.../0809001.xxx 如此,直接访问一个特定的资源网页。 我尝试用filter来进行处理,对特定的访问后缀进行截获,然后再跳转到特定的action来处理,但是 (HttpServletResponse)httpRes.sendRedirect(uri),跳转之后,不能隐藏action的访问路径,有办法来实现隐藏吗?或者有什么思路可以解决上面的问题呢!
请不吝赐教!
但 在对 “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如何重写?
同样的地址直接去访问,就没问题。用重写的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>
==============================================================================
jsp 方式可以实现。
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
}}
<%
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>
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 : 论坛不让给自己加分,但总没有合适的答案,之后注册了一个新账户,自己来回答吧!
===============================================================================
版本参考如下:
=========================================================
<?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, 以上都可以实现。