2017-06-21 在web.xml中使用UrlRewriteFilter来对url进行重写

摘自:http://blog.csdn.net/kite30/article/details/52081512

摘自:http://www.cnblogs.com/youngkind/p/3551225.html


什么是伪静态?

  • 伪静态字面理解就是假的静态,说的官方点就是“地址重写,用户得到的全部地址都是经过处理后的URL地址”。

为什么要伪静态呢?

  • 提高安全性,可以有效的避免一些参数名、ID等完全暴露在用户面前,如果用户随便乱输的话,不符合规则的话直接会返回个404或错误页面,这比直接返回500或一大堆服务器错误信息要好的多
  • 美化URL,去除了那些比如*.do之类的后缀名、长长的参数串等,可以自己组织精简更能反映访问模块内容的URL
  • 更有利于搜索引擎的收入,通过对URL的一些优化,可以使搜索引擎更好的识别与收录网站的信息


配置web.xml:其实urlrewrite其实就是个过虑器,它将会过虑用户的所有请求,符合规则的便对其进行重定向

一般来说,使用struts之后url的访问实际上访问的是action的地址,为了不让该地址暴露给别人,可以采用UrlRewriteFilter来对url进行重写。

首先,在web.xml里面配置:

     <filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
        <!-- 
            设备文件重加载间隔 (0默示随时加载, -1默示不重加载, 默认-1) 
        -->
        <init-param>
            <param-name>confReloadCheckInterval</param-name>
            <param-value>60</param-value>
        </init-param>
        
        <!-- 自定义配置文件的路径,是相对context的路径,(默认位置 /WEB-INF/urlrewrite.xml) -->
        <init-param>
            <param-name>confPath</param-name>
            <param-value>/WEB-INF/urlrewrite.xml</param-value>
        </init-param>
        
        <!-- 
            设置日志级别(将被记录到日志中)
               可以为: TRACE, DEBUG, INFO (default), WARN, ERROR, FATAL, log4j, commons, slf4j,
               比如 sysout:DEBUG(设置到控制台调试输出级别) 
            (默认级别 WARN) -->
        <init-param>
            <param-name>logLevel</param-name>
            <param-value>ERROR</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

要在struts的mapping里面加上

UrlRewriteFilter要放在struts Filter之前。web.xml里面过滤器需要讲究顺序,一般是这样子的顺序:字符编码过滤器,hibernate open session in view 过滤器,Urlrewrite过滤器,struts过滤器。

         <dispatcher>REQUEST</dispatcher>
         <dispatcher>FORWARD</dispatcher>

然后在WEB-INF里面新建urlrewrite.xml文件,

该文件为UrlRewriteFilter的配置文件,通过在里面定义rule规则对URL进行更替。


   下面是urlrewrite.xml

<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
        "http://tuckey.org/res/dtds/urlrewrite2.6.dtd">

<urlrewrite>

  <rule>

    <!-- 地址栏显示的地址 -->

 <from>/something</from>

    <!-- 真实的请求地址 -->

<to>/url/test.do</to> </rule>
</urlrewrite>

以上只是简单的实现,具体的替换需要用到正则表达式。

如下例:

<from>/content/([0-9]+)/list</from>
<to type="forward">/IssuedContentAction.do?dispatch=vContentListBySubid&scope=vmcontent&columninfoid=$1</to>

需要注意的地方是:用括号括起来的正则表达式为变量,如to标签里面的$1表示的是上面from里面的第一个括号内容。url里面的参数间隔符 ‘&’应该写为‘&amp;’。

值得注意的是<outbound-rule>标签,可以使用该标签替换页面里面的url。

简单的正则表达式:

. 匹配除换行符以外的任意字符
      \w 匹配字母或数字或下划线或汉字
      \s 匹配任意的空白符
      \d 匹配数字
      \b 匹配单词的开始或结束
      ^ 匹配字符串的开始
      $ 匹配字符串的结束





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Thymeleaf允许在应用程序配置URL重写过滤器,它通过调用Thymeleaf模板生成的每个URL的Servlet API的javax.servlet.http.HttpServletResponse类的response.encodeURL()方法来实现。要使用URL重写,需要在Web应用程序配置一个过滤器,该过滤器将在生成的HTML重写URL。以下是一个简单的示例,演示如何在Spring Boot应用程序配置Thymeleaf URL重写过滤器: 1.在pom.xml文件添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> ``` 2.在application.properties文件添加以下配置: ```properties server.servlet.context-path=/myapp server.tomcat.url-encoding=UTF-8 ``` 3.创建一个名为UrlRewriteFilter的Java类,该类实现了javax.servlet.Filter接口,并在doFilter()方法调用response.encodeURL()方法: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class UrlRewriteFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; String url = req.getRequestURI().substring(req.getContextPath().length()); String rewrittenUrl = resp.encodeURL(url); chain.doFilter(request, new UrlRewriteResponseWrapper(resp, rewrittenUrl)); } @Override public void destroy() { } } ``` 4.创建一个名为UrlRewriteResponseWrapper的Java类,该类扩展了javax.servlet.http.HttpServletResponseWrapper类,并重写了encodeURL()方法: ```java import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import java.io.IOException; public class UrlRewriteResponseWrapper extends HttpServletResponseWrapper { private String rewrittenUrl; public UrlRewriteResponseWrapper(HttpServletResponse response, String rewrittenUrl) { super(response); this.rewrittenUrl = rewrittenUrl; } @Override public String encodeURL(String url) { return rewrittenUrl; } @Override public String encodeRedirectURL(String url) { return rewrittenUrl; } @Override public String encodeUrl(String url) { return rewrittenUrl; } @Override public String encodeRedirectUrl(String url) { return rewrittenUrl; } @Override public void sendRedirect(String location) throws IOException { super.sendRedirect(rewrittenUrl); } } ``` 5.在Spring Boot应用程序的配置类注册UrlRewriteFilter过滤器: ```java import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public FilterRegistrationBean<UrlRewriteFilter> urlRewriteFilter() { FilterRegistrationBean<UrlRewriteFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new UrlRewriteFilter()); registrationBean.addUrlPatterns("/*"); return registrationBean; } } ``` 这样,Thymeleaf URL重写过滤器就配置完成了。在Thymeleaf模板,可以使用th:href属性来生成URL,如下所示: ```html <a th:href="@{/hello}">Hello</a> ``` 这将生成一个相对于应用程序上下文路径的URL,例如/myapp/hello。当用户单击链接时,UrlRewriteFilter过滤器将调用response.encodeURL()方法来重写URL,以便在会话ID包含JSESSIONID参数(如果需要)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值